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