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
202
}
203
203
204
204
/**
205
205
+
* Creates a MessagePort that is connected to the worker.
206
206
+
* All the dependencies are added automatically.
207
207
+
*
205
208
* @param {WorkerOpts} [opts]
206
209
*/
207
210
workerTunnel({ forceNew } = {}) {
208
208
-
// Creates a MessagePort that is connected to the worker.
209
209
-
// All the dependencies are added automatically.
210
211
const worker = forceNew === true ||
211
212
(typeof forceNew === "object" && forceNew.self === true)
212
212
-
? this.createWorker()
213
213
-
: this.worker();
213
213
+
? () => this.createWorker()
214
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
88
-
* @param {MessagePort | Worker | SharedWorker} workerOrLink
88
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
92
-
export function workerTunnel(workerOrLink, hooks = {}) {
93
93
-
const link = workerOrLink instanceof SharedWorker
94
94
-
? workerLink(workerOrLink)
95
95
-
: workerOrLink;
92
92
+
export function workerTunnel(workerCreator, hooks = {}) {
93
93
+
/** @type {MessagePort | Worker | undefined} */
94
94
+
let link;
95
95
+
96
96
const channel = new MessageChannel();
97
97
98
98
+
function ensureLink() {
99
99
+
if (link) return link;
100
100
+
101
101
+
const workerOrLink = workerCreator();
102
102
+
103
103
+
link = workerOrLink instanceof SharedWorker
104
104
+
? workerLink(workerOrLink)
105
105
+
: workerOrLink;
106
106
+
107
107
+
link.addEventListener("message", workerListener);
108
108
+
109
109
+
return link;
110
110
+
}
111
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
102
-
link.postMessage(data, { transfer });
116
116
+
ensureLink().postMessage(data, { transfer });
103
117
});
104
118
105
119
/**
···
113
127
channel.port1.postMessage(data, { transfer });
114
128
};
115
129
116
116
-
link.addEventListener("message", workerListener);
117
117
-
118
130
channel.port1.start();
119
131
channel.port2.start();
120
132
121
133
return {
122
134
disconnect: () => {
123
123
-
link.removeEventListener("message", workerListener);
135
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
41
-
console.log(newlyActicated);
42
42
-
43
41
newlyActicated.forEach((id) => {
44
42
switch (id) {
45
43
case "do-output__dc-output__local": {