tangled
alpha
login
or
join now
tokono.ma
/
diffuse
5
fork
atom
A music player that connects to your cloud/distributed storage.
5
fork
atom
overview
issues
4
pulls
pipelines
fix: only create workers when needed
Steven Vandevelde
2 weeks ago
4a60bbcc
808bcd07
+26
-15
3 changed files
expand all
collapse all
unified
split
src
common
element.js
worker.js
components
orchestrator
output
element.js
+5
-4
src/common/element.js
···
202
}
203
204
/**
0
0
0
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 } = {}) {
0
0
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
0
0
0
0
0
0
0
0
0
0
0
0
0
0
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
0
0
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
0
0
41
newlyActicated.forEach((id) => {
42
switch (id) {
43
case "do-output__dc-output__local": {