1import type { App } from "./elm/types"
2import * as Tracks from "./tracks"
3
4
5export async function load(): Promise<Worker> {
6 const brain = new Worker(
7 "./js/brain/index.js#appHref=" + encodeURIComponent(window.location.href),
8 { type: "module" }
9 )
10
11 await new Promise((resolve, reject) => {
12 brain.onmessage = event => {
13 if (event.data.action === "READY") resolve(null)
14 }
15
16 brain.addEventListener("error", () => {
17 reject("<strong>Failed to load web worker.</strong><br />If you're using Firefox, you might need to upgrade your browser (version 113 and up) and set `dom.workers.modules.enabled` to `true` in `about:config`")
18 })
19 })
20
21 // Fin
22 return brain
23}
24
25
26export function link({ app, brain }: { app: App, brain: Worker }) {
27 function handleAction(action, data, _ports) {
28 switch (action) {
29 case "DOWNLOAD_TRACKS": return Tracks.download(data)
30 }
31 }
32
33 brain.onmessage = event => {
34 if (event.data.action) return handleAction(event.data.action, event.data.data, event.ports)
35 if (event.data.tag) app.ports.fromAlien.send(event.data)
36 }
37
38 app.ports.toBrain.subscribe(a => brain.postMessage(a))
39}