A music player that connects to your cloud/distributed storage.

fix: only create workers when needed

+26 -15
+5 -4
src/common/element.js
··· 202 202 } 203 203 204 204 /** 205 + * Creates a MessagePort that is connected to the worker. 206 + * All the dependencies are added automatically. 207 + * 205 208 * @param {WorkerOpts} [opts] 206 209 */ 207 210 workerTunnel({ forceNew } = {}) { 208 - // Creates a MessagePort that is connected to the worker. 209 - // All the dependencies are added automatically. 210 211 const worker = forceNew === true || 211 212 (typeof forceNew === "object" && forceNew.self === true) 212 - ? this.createWorker() 213 - : this.worker(); 213 + ? () => this.createWorker() 214 + : () => this.worker(); 214 215 const deps = this.dependencies(); 215 216 216 217 let toWorker;
+21 -9
src/common/worker.js
··· 85 85 } 86 86 87 87 /** 88 - * @param {MessagePort | Worker | SharedWorker} workerOrLink 88 + * @param {() => MessagePort | Worker | SharedWorker} workerCreator 89 89 * @param {{ fromWorker?: (message: any) => Promise<{ data: any, transfer?: Transferable[] }>; toWorker?: (message: any) => Promise<{ data: any, transfer?: Transferable[] }> }} [hooks] 90 90 * @returns {Tunnel} 91 91 */ 92 - export function workerTunnel(workerOrLink, hooks = {}) { 93 - const link = workerOrLink instanceof SharedWorker 94 - ? workerLink(workerOrLink) 95 - : workerOrLink; 92 + export function workerTunnel(workerCreator, hooks = {}) { 93 + /** @type {MessagePort | Worker | undefined} */ 94 + let link; 95 + 96 96 const channel = new MessageChannel(); 97 97 98 + function ensureLink() { 99 + if (link) return link; 100 + 101 + const workerOrLink = workerCreator(); 102 + 103 + link = workerOrLink instanceof SharedWorker 104 + ? workerLink(workerOrLink) 105 + : workerOrLink; 106 + 107 + link.addEventListener("message", workerListener); 108 + 109 + return link; 110 + } 111 + 98 112 channel.port1.addEventListener("message", async (event) => { 99 113 // Send to worker 100 114 const { data, transfer } = await hooks?.toWorker?.(event.data) ?? 101 115 { data: event.data }; 102 - link.postMessage(data, { transfer }); 116 + ensureLink().postMessage(data, { transfer }); 103 117 }); 104 118 105 119 /** ··· 113 127 channel.port1.postMessage(data, { transfer }); 114 128 }; 115 129 116 - link.addEventListener("message", workerListener); 117 - 118 130 channel.port1.start(); 119 131 channel.port2.start(); 120 132 121 133 return { 122 134 disconnect: () => { 123 - link.removeEventListener("message", workerListener); 135 + link?.removeEventListener("message", workerListener); 124 136 channel.port1.close(); 125 137 channel.port2.close(); 126 138 },
-2
src/components/orchestrator/output/element.js
··· 38 38 const set = this.outputConfigurator.activated(); 39 39 const newlyActicated = set.difference(previouslyActivated); 40 40 41 - console.log(newlyActicated); 42 - 43 41 newlyActicated.forEach((id) => { 44 42 switch (id) { 45 43 case "do-output__dc-output__local": {