@xylabs/threads 5.0.13 → 5.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index-browser.mjs +119 -209
- package/dist/browser/index-browser.mjs.map +1 -1
- package/dist/browser/master/implementation.browser.mjs +11 -36
- package/dist/browser/master/implementation.browser.mjs.map +1 -1
- package/dist/browser/master/index-browser.mjs +117 -201
- package/dist/browser/master/index-browser.mjs.map +1 -1
- package/dist/browser/master/pool-browser.mjs +53 -65
- package/dist/browser/master/pool-browser.mjs.map +1 -1
- package/dist/browser/worker/worker.browser.mjs +43 -79
- package/dist/browser/worker/worker.browser.mjs.map +1 -1
- package/dist/neutral/master/register.mjs +62 -121
- package/dist/neutral/master/register.mjs.map +1 -1
- package/dist/neutral/master/spawn.mjs +53 -106
- package/dist/neutral/master/spawn.mjs.map +1 -1
- package/dist/neutral/master/thread.mjs +0 -4
- package/dist/neutral/master/thread.mjs.map +1 -1
- package/dist/neutral/observable-promise.mjs +20 -27
- package/dist/neutral/observable-promise.mjs.map +1 -1
- package/dist/neutral/observable.mjs +3 -12
- package/dist/neutral/observable.mjs.map +1 -1
- package/dist/neutral/types/messages.mjs +4 -4
- package/dist/neutral/types/messages.mjs.map +1 -1
- package/dist/node/index-node.mjs +169 -293
- package/dist/node/index-node.mjs.map +1 -1
- package/dist/node/master/implementation.node.mjs +62 -121
- package/dist/node/master/implementation.node.mjs.map +1 -1
- package/dist/node/master/index-node.mjs +168 -286
- package/dist/node/master/index-node.mjs.map +1 -1
- package/dist/node/master/pool-node.mjs +115 -183
- package/dist/node/master/pool-node.mjs.map +1 -1
- package/dist/node/worker/worker.node.mjs +43 -80
- package/dist/node/worker/worker.node.mjs.map +1 -1
- package/package.json +3 -4
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
var __defProp = Object.defineProperty;
|
|
2
1
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
-
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
4
2
|
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
5
3
|
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
6
4
|
}) : x)(function(x) {
|
|
@@ -25,7 +23,6 @@ var require_lib = __commonJS({
|
|
|
25
23
|
Object.defineProperty(target, descriptor.key, descriptor);
|
|
26
24
|
}
|
|
27
25
|
}
|
|
28
|
-
__name(defineProperties, "defineProperties");
|
|
29
26
|
return function(Constructor, protoProps, staticProps) {
|
|
30
27
|
if (protoProps) defineProperties(Constructor.prototype, protoProps);
|
|
31
28
|
if (staticProps) defineProperties(Constructor, staticProps);
|
|
@@ -37,26 +34,17 @@ var require_lib = __commonJS({
|
|
|
37
34
|
throw new TypeError("Cannot call a class as a function");
|
|
38
35
|
}
|
|
39
36
|
}
|
|
40
|
-
__name(_classCallCheck, "_classCallCheck");
|
|
41
37
|
var path2 = __require("path");
|
|
42
38
|
var fork = __require("child_process").fork;
|
|
43
39
|
var worker = path2.join(__dirname, "worker.js");
|
|
44
40
|
var events = /^(error|message)$/;
|
|
45
|
-
var defaultPorts = {
|
|
46
|
-
|
|
47
|
-
debug: 5858
|
|
48
|
-
};
|
|
49
|
-
var range = {
|
|
50
|
-
min: 1,
|
|
51
|
-
max: 300
|
|
52
|
-
};
|
|
41
|
+
var defaultPorts = { inspect: 9229, debug: 5858 };
|
|
42
|
+
var range = { min: 1, max: 300 };
|
|
53
43
|
var Worker3 = function() {
|
|
54
44
|
function Worker4(arg) {
|
|
55
45
|
var _this = this;
|
|
56
46
|
var args = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [];
|
|
57
|
-
var options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {
|
|
58
|
-
cwd: process.cwd()
|
|
59
|
-
};
|
|
47
|
+
var options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : { cwd: process.cwd() };
|
|
60
48
|
_classCallCheck(this, Worker4);
|
|
61
49
|
var isfn = typeof arg === "function", input = isfn ? arg.toString() : arg;
|
|
62
50
|
if (!options.cwd) {
|
|
@@ -112,50 +100,36 @@ var require_lib = __commonJS({
|
|
|
112
100
|
_this.onerror.call(_this, error);
|
|
113
101
|
}
|
|
114
102
|
});
|
|
115
|
-
this.child.send({
|
|
116
|
-
input,
|
|
117
|
-
isfn,
|
|
118
|
-
cwd: options.cwd,
|
|
119
|
-
esm: options.esm
|
|
120
|
-
});
|
|
103
|
+
this.child.send({ input, isfn, cwd: options.cwd, esm: options.esm });
|
|
121
104
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
{
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
this["on" + event] = fn;
|
|
129
|
-
}
|
|
130
|
-
}, "addEventListener")
|
|
131
|
-
},
|
|
132
|
-
{
|
|
133
|
-
key: "postMessage",
|
|
134
|
-
value: /* @__PURE__ */ __name(function postMessage(msg) {
|
|
135
|
-
this.child.send(JSON.stringify({
|
|
136
|
-
data: msg
|
|
137
|
-
}, null, 0));
|
|
138
|
-
}, "postMessage")
|
|
139
|
-
},
|
|
140
|
-
{
|
|
141
|
-
key: "terminate",
|
|
142
|
-
value: /* @__PURE__ */ __name(function terminate() {
|
|
143
|
-
this.child.kill("SIGINT");
|
|
144
|
-
}, "terminate")
|
|
105
|
+
_createClass(Worker4, [{
|
|
106
|
+
key: "addEventListener",
|
|
107
|
+
value: function addEventListener(event, fn) {
|
|
108
|
+
if (events.test(event)) {
|
|
109
|
+
this["on" + event] = fn;
|
|
110
|
+
}
|
|
145
111
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
112
|
+
}, {
|
|
113
|
+
key: "postMessage",
|
|
114
|
+
value: function postMessage(msg) {
|
|
115
|
+
this.child.send(JSON.stringify({ data: msg }, null, 0));
|
|
116
|
+
}
|
|
117
|
+
}, {
|
|
118
|
+
key: "terminate",
|
|
119
|
+
value: function terminate() {
|
|
120
|
+
this.child.kill("SIGINT");
|
|
121
|
+
}
|
|
122
|
+
}], [{
|
|
123
|
+
key: "setRange",
|
|
124
|
+
value: function setRange(min, max) {
|
|
125
|
+
if (min >= max) {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
range.min = min;
|
|
129
|
+
range.max = max;
|
|
130
|
+
return true;
|
|
157
131
|
}
|
|
158
|
-
]);
|
|
132
|
+
}]);
|
|
159
133
|
return Worker4;
|
|
160
134
|
}();
|
|
161
135
|
module.exports = Worker3;
|
|
@@ -170,19 +144,15 @@ import { cwd } from "process";
|
|
|
170
144
|
import { Worker as NativeWorker } from "worker_threads";
|
|
171
145
|
var defaultPoolSize = cpus().length;
|
|
172
146
|
function resolveScriptPath(scriptPath, baseURL) {
|
|
173
|
-
const makeAbsolute =
|
|
147
|
+
const makeAbsolute = (filePath) => {
|
|
174
148
|
return path.isAbsolute(filePath) ? filePath : path.join(baseURL ?? cwd(), filePath);
|
|
175
|
-
}
|
|
149
|
+
};
|
|
176
150
|
const absolutePath = makeAbsolute(scriptPath);
|
|
177
151
|
return absolutePath;
|
|
178
152
|
}
|
|
179
|
-
__name(resolveScriptPath, "resolveScriptPath");
|
|
180
153
|
function initWorkerThreadsWorker() {
|
|
181
154
|
let allWorkers = [];
|
|
182
|
-
|
|
183
|
-
static {
|
|
184
|
-
__name(this, "Worker");
|
|
185
|
-
}
|
|
155
|
+
class Worker3 extends NativeWorker {
|
|
186
156
|
mappedEventListeners;
|
|
187
157
|
constructor(scriptPath, options) {
|
|
188
158
|
const resolvedScriptPath = options && options.fromSource ? null : resolveScriptPath(scriptPath, (options ?? {})._baseURL);
|
|
@@ -190,20 +160,15 @@ function initWorkerThreadsWorker() {
|
|
|
190
160
|
super(resolvedScriptPath, options);
|
|
191
161
|
} else {
|
|
192
162
|
const sourceCode = scriptPath;
|
|
193
|
-
super(sourceCode, {
|
|
194
|
-
...options,
|
|
195
|
-
eval: true
|
|
196
|
-
});
|
|
163
|
+
super(sourceCode, { ...options, eval: true });
|
|
197
164
|
}
|
|
198
165
|
this.mappedEventListeners = /* @__PURE__ */ new WeakMap();
|
|
199
166
|
allWorkers.push(this);
|
|
200
167
|
}
|
|
201
168
|
addEventListener(eventName, rawListener) {
|
|
202
|
-
const listener =
|
|
203
|
-
rawListener({
|
|
204
|
-
|
|
205
|
-
});
|
|
206
|
-
}, "listener");
|
|
169
|
+
const listener = (message) => {
|
|
170
|
+
rawListener({ data: message });
|
|
171
|
+
};
|
|
207
172
|
this.mappedEventListeners.set(rawListener, listener);
|
|
208
173
|
this.on(eventName, listener);
|
|
209
174
|
}
|
|
@@ -211,55 +176,41 @@ function initWorkerThreadsWorker() {
|
|
|
211
176
|
const listener = this.mappedEventListeners.get(rawListener) || rawListener;
|
|
212
177
|
this.off(eventName, listener);
|
|
213
178
|
}
|
|
214
|
-
}
|
|
215
|
-
const terminateWorkersAndMaster =
|
|
216
|
-
Promise.all(allWorkers.map((worker) => worker.terminate())).then(
|
|
179
|
+
}
|
|
180
|
+
const terminateWorkersAndMaster = () => {
|
|
181
|
+
Promise.all(allWorkers.map((worker) => worker.terminate())).then(
|
|
182
|
+
() => process.exit(0),
|
|
183
|
+
() => process.exit(1)
|
|
184
|
+
);
|
|
217
185
|
allWorkers = [];
|
|
218
|
-
}
|
|
186
|
+
};
|
|
219
187
|
process.on("SIGINT", () => terminateWorkersAndMaster());
|
|
220
188
|
process.on("SIGTERM", () => terminateWorkersAndMaster());
|
|
221
|
-
|
|
222
|
-
static {
|
|
223
|
-
__name(this, "BlobWorker");
|
|
224
|
-
}
|
|
189
|
+
class BlobWorker2 extends Worker3 {
|
|
225
190
|
constructor(blob, options) {
|
|
226
|
-
super(Buffer.from(blob).toString("utf-8"), {
|
|
227
|
-
...options,
|
|
228
|
-
fromSource: true
|
|
229
|
-
});
|
|
191
|
+
super(Buffer.from(blob).toString("utf-8"), { ...options, fromSource: true });
|
|
230
192
|
}
|
|
231
193
|
static fromText(source, options) {
|
|
232
|
-
return new Worker3(source, {
|
|
233
|
-
...options,
|
|
234
|
-
fromSource: true
|
|
235
|
-
});
|
|
194
|
+
return new Worker3(source, { ...options, fromSource: true });
|
|
236
195
|
}
|
|
237
|
-
}
|
|
196
|
+
}
|
|
238
197
|
return {
|
|
239
198
|
blob: BlobWorker2,
|
|
240
199
|
default: Worker3
|
|
241
200
|
};
|
|
242
201
|
}
|
|
243
|
-
__name(initWorkerThreadsWorker, "initWorkerThreadsWorker");
|
|
244
202
|
function initTinyWorker() {
|
|
245
203
|
const TinyWorker = require_lib();
|
|
246
204
|
let allWorkers = [];
|
|
247
|
-
|
|
248
|
-
static {
|
|
249
|
-
__name(this, "Worker");
|
|
250
|
-
}
|
|
205
|
+
class Worker3 extends TinyWorker {
|
|
251
206
|
emitter;
|
|
252
207
|
constructor(scriptPath, options) {
|
|
253
208
|
const resolvedScriptPath = options && options.fromSource ? null : process.platform === "win32" ? `file:///${resolveScriptPath(scriptPath).replaceAll("\\", "/")}` : resolveScriptPath(scriptPath);
|
|
254
209
|
if (resolvedScriptPath) {
|
|
255
|
-
super(resolvedScriptPath, [], {
|
|
256
|
-
esm: true
|
|
257
|
-
});
|
|
210
|
+
super(resolvedScriptPath, [], { esm: true });
|
|
258
211
|
} else {
|
|
259
212
|
const sourceCode = scriptPath;
|
|
260
|
-
super(new Function(sourceCode), [], {
|
|
261
|
-
esm: true
|
|
262
|
-
});
|
|
213
|
+
super(new Function(sourceCode), [], { esm: true });
|
|
263
214
|
}
|
|
264
215
|
allWorkers.push(this);
|
|
265
216
|
this.emitter = new EventEmitter();
|
|
@@ -276,36 +227,29 @@ function initTinyWorker() {
|
|
|
276
227
|
allWorkers = allWorkers.filter((worker) => worker !== this);
|
|
277
228
|
return super.terminate();
|
|
278
229
|
}
|
|
279
|
-
}
|
|
280
|
-
const terminateWorkersAndMaster =
|
|
281
|
-
Promise.all(allWorkers.map((worker) => worker.terminate())).then(
|
|
230
|
+
}
|
|
231
|
+
const terminateWorkersAndMaster = () => {
|
|
232
|
+
Promise.all(allWorkers.map((worker) => worker.terminate())).then(
|
|
233
|
+
() => process.exit(0),
|
|
234
|
+
() => process.exit(1)
|
|
235
|
+
);
|
|
282
236
|
allWorkers = [];
|
|
283
|
-
}
|
|
237
|
+
};
|
|
284
238
|
process.on("SIGINT", () => terminateWorkersAndMaster());
|
|
285
239
|
process.on("SIGTERM", () => terminateWorkersAndMaster());
|
|
286
|
-
|
|
287
|
-
static {
|
|
288
|
-
__name(this, "BlobWorker");
|
|
289
|
-
}
|
|
240
|
+
class BlobWorker2 extends Worker3 {
|
|
290
241
|
constructor(blob, options) {
|
|
291
|
-
super(Buffer.from(blob).toString("utf-8"), {
|
|
292
|
-
...options,
|
|
293
|
-
fromSource: true
|
|
294
|
-
});
|
|
242
|
+
super(Buffer.from(blob).toString("utf-8"), { ...options, fromSource: true });
|
|
295
243
|
}
|
|
296
244
|
static fromText(source, options) {
|
|
297
|
-
return new Worker3(source, {
|
|
298
|
-
...options,
|
|
299
|
-
fromSource: true
|
|
300
|
-
});
|
|
245
|
+
return new Worker3(source, { ...options, fromSource: true });
|
|
301
246
|
}
|
|
302
|
-
}
|
|
247
|
+
}
|
|
303
248
|
return {
|
|
304
249
|
blob: BlobWorker2,
|
|
305
250
|
default: Worker3
|
|
306
251
|
};
|
|
307
252
|
}
|
|
308
|
-
__name(initTinyWorker, "initTinyWorker");
|
|
309
253
|
var implementation;
|
|
310
254
|
var isTinyWorker;
|
|
311
255
|
function selectWorkerImplementation() {
|
|
@@ -319,14 +263,12 @@ function selectWorkerImplementation() {
|
|
|
319
263
|
return initTinyWorker();
|
|
320
264
|
}
|
|
321
265
|
}
|
|
322
|
-
__name(selectWorkerImplementation, "selectWorkerImplementation");
|
|
323
266
|
function getWorkerImplementation() {
|
|
324
267
|
if (!implementation) {
|
|
325
268
|
implementation = selectWorkerImplementation();
|
|
326
269
|
}
|
|
327
270
|
return implementation;
|
|
328
271
|
}
|
|
329
|
-
__name(getWorkerImplementation, "getWorkerImplementation");
|
|
330
272
|
function isWorkerRuntime() {
|
|
331
273
|
if (isTinyWorker) {
|
|
332
274
|
return globalThis !== void 0 && self["postMessage"] ? true : false;
|
|
@@ -335,17 +277,20 @@ function isWorkerRuntime() {
|
|
|
335
277
|
return !isMainThread;
|
|
336
278
|
}
|
|
337
279
|
}
|
|
338
|
-
__name(isWorkerRuntime, "isWorkerRuntime");
|
|
339
280
|
|
|
340
281
|
// src/master/pool-browser.ts
|
|
341
282
|
import DebugLogger from "debug";
|
|
342
|
-
import {
|
|
283
|
+
import {
|
|
284
|
+
multicast,
|
|
285
|
+
Observable,
|
|
286
|
+
Subject
|
|
287
|
+
} from "observable-fns";
|
|
343
288
|
|
|
344
289
|
// src/master/implementation.browser.ts
|
|
345
290
|
var defaultPoolSize2 = typeof navigator !== "undefined" && navigator.hardwareConcurrency ? navigator.hardwareConcurrency : 4;
|
|
346
291
|
|
|
347
292
|
// src/master/pool-types.ts
|
|
348
|
-
var PoolEventType = /* @__PURE__ */
|
|
293
|
+
var PoolEventType = /* @__PURE__ */ ((PoolEventType2) => {
|
|
349
294
|
PoolEventType2["initialized"] = "initialized";
|
|
350
295
|
PoolEventType2["taskCanceled"] = "taskCanceled";
|
|
351
296
|
PoolEventType2["taskCompleted"] = "taskCompleted";
|
|
@@ -355,7 +300,7 @@ var PoolEventType = /* @__PURE__ */ function(PoolEventType2) {
|
|
|
355
300
|
PoolEventType2["taskStart"] = "taskStart";
|
|
356
301
|
PoolEventType2["terminated"] = "terminated";
|
|
357
302
|
return PoolEventType2;
|
|
358
|
-
}({});
|
|
303
|
+
})(PoolEventType || {});
|
|
359
304
|
|
|
360
305
|
// src/symbols.ts
|
|
361
306
|
var $errors = Symbol("thread.errors");
|
|
@@ -368,7 +313,6 @@ var $worker = Symbol("thread.worker");
|
|
|
368
313
|
function fail(message) {
|
|
369
314
|
throw new Error(message);
|
|
370
315
|
}
|
|
371
|
-
__name(fail, "fail");
|
|
372
316
|
var Thread = {
|
|
373
317
|
/** Return an observable that can be used to subscribe to all errors happening in the thread. */
|
|
374
318
|
errors(thread) {
|
|
@@ -393,33 +337,24 @@ function createArray(size) {
|
|
|
393
337
|
}
|
|
394
338
|
return array;
|
|
395
339
|
}
|
|
396
|
-
__name(createArray, "createArray");
|
|
397
340
|
function delay(ms) {
|
|
398
341
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
399
342
|
}
|
|
400
|
-
__name(delay, "delay");
|
|
401
343
|
function flatMap(array, mapper) {
|
|
402
|
-
return array.reduce((flattened, element) => [
|
|
403
|
-
...flattened,
|
|
404
|
-
...mapper(element)
|
|
405
|
-
], []);
|
|
344
|
+
return array.reduce((flattened, element) => [...flattened, ...mapper(element)], []);
|
|
406
345
|
}
|
|
407
|
-
__name(flatMap, "flatMap");
|
|
408
346
|
function slugify(text) {
|
|
409
347
|
return text.replaceAll(/\W/g, " ").trim().replaceAll(/\s+/g, "-");
|
|
410
348
|
}
|
|
411
|
-
__name(slugify, "slugify");
|
|
412
349
|
function spawnWorkers(spawnWorker, count) {
|
|
413
|
-
return createArray(count).map(
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
350
|
+
return createArray(count).map(
|
|
351
|
+
() => ({
|
|
352
|
+
init: spawnWorker(),
|
|
353
|
+
runningTasks: []
|
|
354
|
+
})
|
|
355
|
+
);
|
|
417
356
|
}
|
|
418
|
-
|
|
419
|
-
var WorkerPool = class WorkerPool2 {
|
|
420
|
-
static {
|
|
421
|
-
__name(this, "WorkerPool");
|
|
422
|
-
}
|
|
357
|
+
var WorkerPool = class {
|
|
423
358
|
static EventType = PoolEventType;
|
|
424
359
|
debug;
|
|
425
360
|
eventObservable;
|
|
@@ -431,22 +366,23 @@ var WorkerPool = class WorkerPool2 {
|
|
|
431
366
|
nextTaskID = 1;
|
|
432
367
|
taskQueue = [];
|
|
433
368
|
constructor(spawnWorker, optionsOrSize) {
|
|
434
|
-
const options = typeof optionsOrSize === "number" ? {
|
|
435
|
-
size: optionsOrSize
|
|
436
|
-
} : optionsOrSize || {};
|
|
369
|
+
const options = typeof optionsOrSize === "number" ? { size: optionsOrSize } : optionsOrSize || {};
|
|
437
370
|
const { size = defaultPoolSize2 } = options;
|
|
438
371
|
this.debug = DebugLogger(`threads:pool:${slugify(options.name || String(nextPoolID++))}`);
|
|
439
372
|
this.options = options;
|
|
440
373
|
this.workers = spawnWorkers(spawnWorker, size);
|
|
441
374
|
this.eventObservable = multicast(Observable.from(this.eventSubject));
|
|
442
|
-
Promise.all(this.workers.map((worker) => worker.init)).then(
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
375
|
+
Promise.all(this.workers.map((worker) => worker.init)).then(
|
|
376
|
+
() => this.eventSubject.next({
|
|
377
|
+
size: this.workers.length,
|
|
378
|
+
type: "initialized" /* initialized */
|
|
379
|
+
}),
|
|
380
|
+
(error) => {
|
|
381
|
+
this.debug("Error while initializing pool worker:", error);
|
|
382
|
+
this.eventSubject.error(error);
|
|
383
|
+
this.initErrors.push(error);
|
|
384
|
+
}
|
|
385
|
+
);
|
|
450
386
|
}
|
|
451
387
|
findIdlingWorker() {
|
|
452
388
|
const { concurrency = 1 } = this.options;
|
|
@@ -457,7 +393,7 @@ var WorkerPool = class WorkerPool2 {
|
|
|
457
393
|
this.debug(`Running task #${task.id} on worker #${workerID}...`);
|
|
458
394
|
this.eventSubject.next({
|
|
459
395
|
taskID: task.id,
|
|
460
|
-
type:
|
|
396
|
+
type: "taskStart" /* taskStart */,
|
|
461
397
|
workerID
|
|
462
398
|
});
|
|
463
399
|
try {
|
|
@@ -466,7 +402,7 @@ var WorkerPool = class WorkerPool2 {
|
|
|
466
402
|
this.eventSubject.next({
|
|
467
403
|
returnValue,
|
|
468
404
|
taskID: task.id,
|
|
469
|
-
type:
|
|
405
|
+
type: "taskCompleted" /* taskCompleted */,
|
|
470
406
|
workerID
|
|
471
407
|
});
|
|
472
408
|
} catch (ex) {
|
|
@@ -475,16 +411,16 @@ var WorkerPool = class WorkerPool2 {
|
|
|
475
411
|
this.eventSubject.next({
|
|
476
412
|
error,
|
|
477
413
|
taskID: task.id,
|
|
478
|
-
type:
|
|
414
|
+
type: "taskFailed" /* taskFailed */,
|
|
479
415
|
workerID
|
|
480
416
|
});
|
|
481
417
|
}
|
|
482
418
|
}
|
|
483
419
|
run(worker, task) {
|
|
484
420
|
const runPromise = (async () => {
|
|
485
|
-
const removeTaskFromWorkersRunningTasks =
|
|
421
|
+
const removeTaskFromWorkersRunningTasks = () => {
|
|
486
422
|
worker.runningTasks = worker.runningTasks.filter((someRunPromise) => someRunPromise !== runPromise);
|
|
487
|
-
}
|
|
423
|
+
};
|
|
488
424
|
await delay(0);
|
|
489
425
|
try {
|
|
490
426
|
await this.runPoolTask(worker, task);
|
|
@@ -504,9 +440,7 @@ var WorkerPool = class WorkerPool2 {
|
|
|
504
440
|
const nextTask = this.taskQueue.shift();
|
|
505
441
|
if (!nextTask) {
|
|
506
442
|
this.debug("Task queue is empty");
|
|
507
|
-
this.eventSubject.next({
|
|
508
|
-
type: PoolEventType.taskQueueDrained
|
|
509
|
-
});
|
|
443
|
+
this.eventSubject.next({ type: "taskQueueDrained" /* taskQueueDrained */ });
|
|
510
444
|
return;
|
|
511
445
|
}
|
|
512
446
|
this.run(availableWorker, nextTask);
|
|
@@ -514,13 +448,13 @@ var WorkerPool = class WorkerPool2 {
|
|
|
514
448
|
taskCompletion(taskID) {
|
|
515
449
|
return new Promise((resolve, reject) => {
|
|
516
450
|
const eventSubscription = this.events().subscribe((event) => {
|
|
517
|
-
if (event.type ===
|
|
451
|
+
if (event.type === "taskCompleted" /* taskCompleted */ && event.taskID === taskID) {
|
|
518
452
|
eventSubscription.unsubscribe();
|
|
519
453
|
resolve(event.returnValue);
|
|
520
|
-
} else if (event.type ===
|
|
454
|
+
} else if (event.type === "taskFailed" /* taskFailed */ && event.taskID === taskID) {
|
|
521
455
|
eventSubscription.unsubscribe();
|
|
522
456
|
reject(event.error);
|
|
523
|
-
} else if (event.type ===
|
|
457
|
+
} else if (event.type === "terminated" /* terminated */) {
|
|
524
458
|
eventSubscription.unsubscribe();
|
|
525
459
|
reject(new Error("Pool has been terminated before task was run."));
|
|
526
460
|
}
|
|
@@ -528,10 +462,10 @@ var WorkerPool = class WorkerPool2 {
|
|
|
528
462
|
});
|
|
529
463
|
}
|
|
530
464
|
async settled(allowResolvingImmediately = false) {
|
|
531
|
-
const getCurrentlyRunningTasks =
|
|
465
|
+
const getCurrentlyRunningTasks = () => flatMap(this.workers, (worker) => worker.runningTasks);
|
|
532
466
|
const taskFailures = [];
|
|
533
467
|
const failureSubscription = this.eventObservable.subscribe((event) => {
|
|
534
|
-
if (event.type ===
|
|
468
|
+
if (event.type === "taskFailed" /* taskFailed */) {
|
|
535
469
|
taskFailures.push(event.error);
|
|
536
470
|
}
|
|
537
471
|
});
|
|
@@ -546,11 +480,12 @@ var WorkerPool = class WorkerPool2 {
|
|
|
546
480
|
const subscription = this.eventObservable.subscribe({
|
|
547
481
|
error: reject,
|
|
548
482
|
next(event) {
|
|
549
|
-
if (event.type ===
|
|
483
|
+
if (event.type === "taskQueueDrained" /* taskQueueDrained */) {
|
|
550
484
|
subscription.unsubscribe();
|
|
551
485
|
resolve(void 0);
|
|
552
486
|
}
|
|
553
487
|
}
|
|
488
|
+
// make a pool-wide error reject the completed() result promise
|
|
554
489
|
});
|
|
555
490
|
});
|
|
556
491
|
await Promise.allSettled(getCurrentlyRunningTasks());
|
|
@@ -563,20 +498,18 @@ var WorkerPool = class WorkerPool2 {
|
|
|
563
498
|
const subscription = this.eventObservable.subscribe({
|
|
564
499
|
error: reject,
|
|
565
500
|
next(event) {
|
|
566
|
-
if (event.type ===
|
|
501
|
+
if (event.type === "taskQueueDrained" /* taskQueueDrained */) {
|
|
567
502
|
subscription.unsubscribe();
|
|
568
503
|
resolve(settlementPromise);
|
|
569
|
-
} else if (event.type ===
|
|
504
|
+
} else if (event.type === "taskFailed" /* taskFailed */) {
|
|
570
505
|
subscription.unsubscribe();
|
|
571
506
|
reject(event.error);
|
|
572
507
|
}
|
|
573
508
|
}
|
|
509
|
+
// make a pool-wide error reject the completed() result promise
|
|
574
510
|
});
|
|
575
511
|
});
|
|
576
|
-
const errors = await Promise.race([
|
|
577
|
-
settlementPromise,
|
|
578
|
-
earlyExitPromise
|
|
579
|
-
]);
|
|
512
|
+
const errors = await Promise.race([settlementPromise, earlyExitPromise]);
|
|
580
513
|
if (errors.length > 0) {
|
|
581
514
|
throw errors[0];
|
|
582
515
|
}
|
|
@@ -598,26 +531,28 @@ var WorkerPool = class WorkerPool2 {
|
|
|
598
531
|
this.debug(`Task #${taskID} errored:`, error);
|
|
599
532
|
});
|
|
600
533
|
const task = {
|
|
601
|
-
cancel:
|
|
534
|
+
cancel: () => {
|
|
602
535
|
if (!this.taskQueue.includes(task)) return;
|
|
603
536
|
this.taskQueue = this.taskQueue.filter((someTask) => someTask !== task);
|
|
604
537
|
this.eventSubject.next({
|
|
605
538
|
taskID: task.id,
|
|
606
|
-
type:
|
|
539
|
+
type: "taskCanceled" /* taskCanceled */
|
|
607
540
|
});
|
|
608
|
-
},
|
|
541
|
+
},
|
|
609
542
|
id: taskID,
|
|
610
543
|
run: taskFunction,
|
|
611
544
|
then: taskCompletion.then.bind(taskCompletion)
|
|
612
545
|
};
|
|
613
546
|
if (this.taskQueue.length >= maxQueuedJobs) {
|
|
614
|
-
throw new Error(
|
|
547
|
+
throw new Error(
|
|
548
|
+
"Maximum number of pool tasks queued. Refusing to queue another one.\nThis usually happens for one of two reasons: We are either at peak workload right now or some tasks just won't finish, thus blocking the pool."
|
|
549
|
+
);
|
|
615
550
|
}
|
|
616
551
|
this.debug(`Queueing task #${task.id}...`);
|
|
617
552
|
this.taskQueue.push(task);
|
|
618
553
|
this.eventSubject.next({
|
|
619
554
|
taskID: task.id,
|
|
620
|
-
type:
|
|
555
|
+
type: "taskQueued" /* taskQueued */
|
|
621
556
|
});
|
|
622
557
|
this.scheduleWork();
|
|
623
558
|
return task;
|
|
@@ -628,10 +563,8 @@ var WorkerPool = class WorkerPool2 {
|
|
|
628
563
|
await this.completed(true);
|
|
629
564
|
}
|
|
630
565
|
this.eventSubject.next({
|
|
631
|
-
remainingQueue: [
|
|
632
|
-
|
|
633
|
-
],
|
|
634
|
-
type: PoolEventType.terminated
|
|
566
|
+
remainingQueue: [...this.taskQueue],
|
|
567
|
+
type: "terminated" /* terminated */
|
|
635
568
|
});
|
|
636
569
|
this.eventSubject.complete();
|
|
637
570
|
await Promise.all(this.workers.map(async (worker) => Thread.terminate(await worker.init)));
|
|
@@ -640,7 +573,6 @@ var WorkerPool = class WorkerPool2 {
|
|
|
640
573
|
function PoolConstructor(spawnWorker, optionsOrSize) {
|
|
641
574
|
return new WorkerPool(spawnWorker, optionsOrSize);
|
|
642
575
|
}
|
|
643
|
-
__name(PoolConstructor, "PoolConstructor");
|
|
644
576
|
PoolConstructor.EventType = PoolEventType;
|
|
645
577
|
var Pool = PoolConstructor;
|
|
646
578
|
|
|
@@ -665,7 +597,7 @@ var DefaultErrorSerializer = {
|
|
|
665
597
|
};
|
|
666
598
|
}
|
|
667
599
|
};
|
|
668
|
-
var isSerializedError =
|
|
600
|
+
var isSerializedError = (thing) => thing && typeof thing === "object" && "__error_marker" in thing && thing.__error_marker === "$$error";
|
|
669
601
|
var DefaultSerializer = {
|
|
670
602
|
deserialize(message) {
|
|
671
603
|
return isSerializedError(message) ? DefaultErrorSerializer.deserialize(message) : message;
|
|
@@ -680,14 +612,12 @@ globalThis.registeredSerializer = globalThis.registeredSerializer ?? DefaultSeri
|
|
|
680
612
|
function deserialize(message) {
|
|
681
613
|
return globalThis.registeredSerializer.deserialize(message);
|
|
682
614
|
}
|
|
683
|
-
__name(deserialize, "deserialize");
|
|
684
615
|
function serialize(input) {
|
|
685
616
|
return globalThis.registeredSerializer.serialize(input);
|
|
686
617
|
}
|
|
687
|
-
__name(serialize, "serialize");
|
|
688
618
|
|
|
689
619
|
// src/promise.ts
|
|
690
|
-
var doNothing =
|
|
620
|
+
var doNothing = () => void 0;
|
|
691
621
|
function createPromiseWithResolver() {
|
|
692
622
|
let alreadyResolved = false;
|
|
693
623
|
let resolvedTo;
|
|
@@ -699,25 +629,13 @@ function createPromiseWithResolver() {
|
|
|
699
629
|
resolver = resolve;
|
|
700
630
|
}
|
|
701
631
|
});
|
|
702
|
-
const exposedResolver =
|
|
632
|
+
const exposedResolver = (value) => {
|
|
703
633
|
alreadyResolved = true;
|
|
704
634
|
resolvedTo = value;
|
|
705
635
|
resolver(resolvedTo);
|
|
706
|
-
}
|
|
707
|
-
return [
|
|
708
|
-
promise,
|
|
709
|
-
exposedResolver
|
|
710
|
-
];
|
|
636
|
+
};
|
|
637
|
+
return [promise, exposedResolver];
|
|
711
638
|
}
|
|
712
|
-
__name(createPromiseWithResolver, "createPromiseWithResolver");
|
|
713
|
-
|
|
714
|
-
// src/types/master.ts
|
|
715
|
-
var WorkerEventType = /* @__PURE__ */ function(WorkerEventType2) {
|
|
716
|
-
WorkerEventType2["internalError"] = "internalError";
|
|
717
|
-
WorkerEventType2["message"] = "message";
|
|
718
|
-
WorkerEventType2["termination"] = "termination";
|
|
719
|
-
return WorkerEventType2;
|
|
720
|
-
}({});
|
|
721
639
|
|
|
722
640
|
// src/master/invocation-proxy.ts
|
|
723
641
|
import DebugLogger2 from "debug";
|
|
@@ -725,22 +643,17 @@ import { multicast as multicast2, Observable as Observable3 } from "observable-f
|
|
|
725
643
|
|
|
726
644
|
// src/observable-promise.ts
|
|
727
645
|
import { Observable as Observable2 } from "observable-fns";
|
|
728
|
-
var doNothing2 =
|
|
729
|
-
}
|
|
730
|
-
var returnInput =
|
|
731
|
-
var runDeferred =
|
|
646
|
+
var doNothing2 = () => {
|
|
647
|
+
};
|
|
648
|
+
var returnInput = (input) => input;
|
|
649
|
+
var runDeferred = (fn) => Promise.resolve().then(fn);
|
|
732
650
|
function fail2(error) {
|
|
733
651
|
throw error;
|
|
734
652
|
}
|
|
735
|
-
__name(fail2, "fail");
|
|
736
653
|
function isThenable(thing) {
|
|
737
654
|
return thing && typeof thing.then === "function";
|
|
738
655
|
}
|
|
739
|
-
__name(isThenable, "isThenable");
|
|
740
656
|
var ObservablePromise = class _ObservablePromise extends Observable2 {
|
|
741
|
-
static {
|
|
742
|
-
__name(this, "ObservablePromise");
|
|
743
|
-
}
|
|
744
657
|
[Symbol.toStringTag] = "[object ObservablePromise]";
|
|
745
658
|
initHasRun = false;
|
|
746
659
|
fulfillmentCallbacks = [];
|
|
@@ -799,7 +712,7 @@ var ObservablePromise = class _ObservablePromise extends Observable2 {
|
|
|
799
712
|
const onRejected = onRejectedRaw || fail2;
|
|
800
713
|
let onRejectedCalled = false;
|
|
801
714
|
return new Promise((resolve, reject) => {
|
|
802
|
-
const rejectionCallback =
|
|
715
|
+
const rejectionCallback = (error) => {
|
|
803
716
|
if (onRejectedCalled) return;
|
|
804
717
|
onRejectedCalled = true;
|
|
805
718
|
try {
|
|
@@ -807,19 +720,17 @@ var ObservablePromise = class _ObservablePromise extends Observable2 {
|
|
|
807
720
|
} catch (anotherError) {
|
|
808
721
|
reject(anotherError);
|
|
809
722
|
}
|
|
810
|
-
}
|
|
811
|
-
const fulfillmentCallback =
|
|
723
|
+
};
|
|
724
|
+
const fulfillmentCallback = (value) => {
|
|
812
725
|
try {
|
|
813
726
|
resolve(onFulfilled(value));
|
|
814
727
|
} catch (ex) {
|
|
815
728
|
const error = ex;
|
|
816
729
|
rejectionCallback(error);
|
|
817
730
|
}
|
|
818
|
-
}
|
|
731
|
+
};
|
|
819
732
|
if (!this.initHasRun) {
|
|
820
|
-
this.subscribe({
|
|
821
|
-
error: rejectionCallback
|
|
822
|
-
});
|
|
733
|
+
this.subscribe({ error: rejectionCallback });
|
|
823
734
|
}
|
|
824
735
|
if (this.state === "fulfilled") {
|
|
825
736
|
return resolve(onFulfilled(this.firstValue));
|
|
@@ -837,20 +748,23 @@ var ObservablePromise = class _ObservablePromise extends Observable2 {
|
|
|
837
748
|
}
|
|
838
749
|
finally(onCompleted) {
|
|
839
750
|
const handler = onCompleted || doNothing2;
|
|
840
|
-
return this.then(
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
751
|
+
return this.then(
|
|
752
|
+
(value) => {
|
|
753
|
+
handler();
|
|
754
|
+
return value;
|
|
755
|
+
},
|
|
756
|
+
() => handler()
|
|
757
|
+
);
|
|
844
758
|
}
|
|
845
759
|
static from(thing) {
|
|
846
760
|
return isThenable(thing) ? new _ObservablePromise((observer) => {
|
|
847
|
-
const onFulfilled =
|
|
761
|
+
const onFulfilled = (value) => {
|
|
848
762
|
observer.next(value);
|
|
849
763
|
observer.complete();
|
|
850
|
-
}
|
|
851
|
-
const onRejected =
|
|
764
|
+
};
|
|
765
|
+
const onRejected = (error) => {
|
|
852
766
|
observer.error(error);
|
|
853
|
-
}
|
|
767
|
+
};
|
|
854
768
|
thing.then(onFulfilled, onRejected);
|
|
855
769
|
}) : super.from(thing);
|
|
856
770
|
}
|
|
@@ -860,36 +774,18 @@ var ObservablePromise = class _ObservablePromise extends Observable2 {
|
|
|
860
774
|
function isTransferDescriptor(thing) {
|
|
861
775
|
return thing && typeof thing === "object" && thing[$transferable];
|
|
862
776
|
}
|
|
863
|
-
__name(isTransferDescriptor, "isTransferDescriptor");
|
|
864
|
-
|
|
865
|
-
// src/types/messages.ts
|
|
866
|
-
var MasterMessageType = /* @__PURE__ */ function(MasterMessageType2) {
|
|
867
|
-
MasterMessageType2["cancel"] = "cancel";
|
|
868
|
-
MasterMessageType2["run"] = "run";
|
|
869
|
-
return MasterMessageType2;
|
|
870
|
-
}({});
|
|
871
|
-
var WorkerMessageType = /* @__PURE__ */ function(WorkerMessageType2) {
|
|
872
|
-
WorkerMessageType2["error"] = "error";
|
|
873
|
-
WorkerMessageType2["init"] = "init";
|
|
874
|
-
WorkerMessageType2["result"] = "result";
|
|
875
|
-
WorkerMessageType2["running"] = "running";
|
|
876
|
-
WorkerMessageType2["uncaughtError"] = "uncaughtError";
|
|
877
|
-
return WorkerMessageType2;
|
|
878
|
-
}({});
|
|
879
777
|
|
|
880
778
|
// src/master/invocation-proxy.ts
|
|
881
779
|
var debugMessages = DebugLogger2("threads:master:messages");
|
|
882
780
|
var nextJobUID = 1;
|
|
883
|
-
var dedupe =
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
var
|
|
887
|
-
var isJobResultMessage = /* @__PURE__ */ __name((data) => data && data.type === WorkerMessageType.result, "isJobResultMessage");
|
|
888
|
-
var isJobStartMessage = /* @__PURE__ */ __name((data) => data && data.type === WorkerMessageType.running, "isJobStartMessage");
|
|
781
|
+
var dedupe = (array) => [...new Set(array)];
|
|
782
|
+
var isJobErrorMessage = (data) => data && data.type === "error" /* error */;
|
|
783
|
+
var isJobResultMessage = (data) => data && data.type === "result" /* result */;
|
|
784
|
+
var isJobStartMessage = (data) => data && data.type === "running" /* running */;
|
|
889
785
|
function createObservableForJob(worker, jobUID) {
|
|
890
786
|
return new Observable3((observer) => {
|
|
891
787
|
let asyncType;
|
|
892
|
-
const messageHandler =
|
|
788
|
+
const messageHandler = (event) => {
|
|
893
789
|
debugMessages("Message from worker:", event.data);
|
|
894
790
|
if (!event.data || event.data.uid !== jobUID) return;
|
|
895
791
|
if (isJobStartMessage(event.data)) {
|
|
@@ -919,12 +815,12 @@ function createObservableForJob(worker, jobUID) {
|
|
|
919
815
|
}
|
|
920
816
|
worker.removeEventListener("message", messageHandler);
|
|
921
817
|
}
|
|
922
|
-
}
|
|
818
|
+
};
|
|
923
819
|
worker.addEventListener("message", messageHandler);
|
|
924
820
|
return () => {
|
|
925
821
|
if (asyncType === "observable" || !asyncType) {
|
|
926
822
|
const cancelMessage = {
|
|
927
|
-
type:
|
|
823
|
+
type: "cancel" /* cancel */,
|
|
928
824
|
uid: jobUID
|
|
929
825
|
};
|
|
930
826
|
worker.postMessage(cancelMessage);
|
|
@@ -933,7 +829,6 @@ function createObservableForJob(worker, jobUID) {
|
|
|
933
829
|
};
|
|
934
830
|
});
|
|
935
831
|
}
|
|
936
|
-
__name(createObservableForJob, "createObservableForJob");
|
|
937
832
|
function prepareArguments(rawArgs) {
|
|
938
833
|
if (rawArgs.length === 0) {
|
|
939
834
|
return {
|
|
@@ -956,7 +851,6 @@ function prepareArguments(rawArgs) {
|
|
|
956
851
|
transferables: transferables.length === 0 ? transferables : dedupe(transferables)
|
|
957
852
|
};
|
|
958
853
|
}
|
|
959
|
-
__name(prepareArguments, "prepareArguments");
|
|
960
854
|
function createProxyFunction(worker, method) {
|
|
961
855
|
return (...rawArgs) => {
|
|
962
856
|
const uid = nextJobUID++;
|
|
@@ -964,7 +858,7 @@ function createProxyFunction(worker, method) {
|
|
|
964
858
|
const runMessage = {
|
|
965
859
|
args,
|
|
966
860
|
method,
|
|
967
|
-
type:
|
|
861
|
+
type: "run" /* run */,
|
|
968
862
|
uid
|
|
969
863
|
};
|
|
970
864
|
debugMessages("Sending command to run function to worker:", runMessage);
|
|
@@ -976,7 +870,6 @@ function createProxyFunction(worker, method) {
|
|
|
976
870
|
return ObservablePromise.from(multicast2(createObservableForJob(worker, uid)));
|
|
977
871
|
};
|
|
978
872
|
}
|
|
979
|
-
__name(createProxyFunction, "createProxyFunction");
|
|
980
873
|
function createProxyModule(worker, methodNames) {
|
|
981
874
|
const proxy = {};
|
|
982
875
|
for (const methodName of methodNames) {
|
|
@@ -984,31 +877,26 @@ function createProxyModule(worker, methodNames) {
|
|
|
984
877
|
}
|
|
985
878
|
return proxy;
|
|
986
879
|
}
|
|
987
|
-
__name(createProxyModule, "createProxyModule");
|
|
988
880
|
|
|
989
881
|
// src/master/spawn.ts
|
|
990
882
|
var debugMessages2 = DebugLogger3("threads:master:messages");
|
|
991
883
|
var debugSpawn = DebugLogger3("threads:master:spawn");
|
|
992
884
|
var debugThreadUtils = DebugLogger3("threads:master:thread-utils");
|
|
993
|
-
var isInitMessage =
|
|
994
|
-
var isUncaughtErrorMessage =
|
|
885
|
+
var isInitMessage = (data) => data && data.type === "init";
|
|
886
|
+
var isUncaughtErrorMessage = (data) => data && data.type === "uncaughtError";
|
|
995
887
|
var initMessageTimeout = typeof process !== "undefined" && process.env !== void 0 && process.env.THREADS_WORKER_INIT_TIMEOUT ? Number.parseInt(process.env.THREADS_WORKER_INIT_TIMEOUT, 10) : 1e4;
|
|
996
888
|
async function withTimeout(promise, timeoutInMs, errorMessage) {
|
|
997
889
|
let timeoutHandle;
|
|
998
890
|
const timeout = new Promise((resolve, reject) => {
|
|
999
891
|
timeoutHandle = setTimeout(() => reject(new Error(errorMessage)), timeoutInMs);
|
|
1000
892
|
});
|
|
1001
|
-
const result = await Promise.race([
|
|
1002
|
-
promise,
|
|
1003
|
-
timeout
|
|
1004
|
-
]);
|
|
893
|
+
const result = await Promise.race([promise, timeout]);
|
|
1005
894
|
clearTimeout(timeoutHandle);
|
|
1006
895
|
return result;
|
|
1007
896
|
}
|
|
1008
|
-
__name(withTimeout, "withTimeout");
|
|
1009
897
|
function receiveInitMessage(worker) {
|
|
1010
898
|
return new Promise((resolve, reject) => {
|
|
1011
|
-
const messageHandler =
|
|
899
|
+
const messageHandler = (event) => {
|
|
1012
900
|
debugMessages2("Message from worker before finishing initialization:", event.data);
|
|
1013
901
|
if (isInitMessage(event.data)) {
|
|
1014
902
|
worker.removeEventListener("message", messageHandler);
|
|
@@ -1017,34 +905,31 @@ function receiveInitMessage(worker) {
|
|
|
1017
905
|
worker.removeEventListener("message", messageHandler);
|
|
1018
906
|
reject(deserialize(event.data.error));
|
|
1019
907
|
}
|
|
1020
|
-
}
|
|
908
|
+
};
|
|
1021
909
|
worker.addEventListener("message", messageHandler);
|
|
1022
910
|
});
|
|
1023
911
|
}
|
|
1024
|
-
__name(receiveInitMessage, "receiveInitMessage");
|
|
1025
912
|
function createEventObservable(worker, workerTermination) {
|
|
1026
913
|
return new Observable4((observer) => {
|
|
1027
|
-
const messageHandler =
|
|
914
|
+
const messageHandler = (messageEvent) => {
|
|
1028
915
|
const workerEvent = {
|
|
1029
916
|
data: messageEvent.data,
|
|
1030
|
-
type:
|
|
917
|
+
type: "message" /* message */
|
|
1031
918
|
};
|
|
1032
919
|
observer.next(workerEvent);
|
|
1033
|
-
}
|
|
1034
|
-
const rejectionHandler =
|
|
920
|
+
};
|
|
921
|
+
const rejectionHandler = (errorEvent) => {
|
|
1035
922
|
debugThreadUtils("Unhandled promise rejection event in thread:", errorEvent);
|
|
1036
923
|
const workerEvent = {
|
|
1037
924
|
error: new Error(errorEvent.reason),
|
|
1038
|
-
type:
|
|
925
|
+
type: "internalError" /* internalError */
|
|
1039
926
|
};
|
|
1040
927
|
observer.next(workerEvent);
|
|
1041
|
-
}
|
|
928
|
+
};
|
|
1042
929
|
worker.addEventListener("message", messageHandler);
|
|
1043
930
|
worker.addEventListener("unhandledrejection", rejectionHandler);
|
|
1044
931
|
workerTermination.then(() => {
|
|
1045
|
-
const terminationEvent = {
|
|
1046
|
-
type: WorkerEventType.termination
|
|
1047
|
-
};
|
|
932
|
+
const terminationEvent = { type: "termination" /* termination */ };
|
|
1048
933
|
worker.removeEventListener("message", messageHandler);
|
|
1049
934
|
worker.removeEventListener("unhandledrejection", rejectionHandler);
|
|
1050
935
|
observer.next(terminationEvent);
|
|
@@ -1052,22 +937,17 @@ function createEventObservable(worker, workerTermination) {
|
|
|
1052
937
|
});
|
|
1053
938
|
});
|
|
1054
939
|
}
|
|
1055
|
-
__name(createEventObservable, "createEventObservable");
|
|
1056
940
|
function createTerminator(worker) {
|
|
1057
941
|
const [termination, resolver] = createPromiseWithResolver();
|
|
1058
|
-
const terminate =
|
|
942
|
+
const terminate = async () => {
|
|
1059
943
|
debugThreadUtils("Terminating worker");
|
|
1060
944
|
await worker.terminate();
|
|
1061
945
|
resolver();
|
|
1062
|
-
}, "terminate");
|
|
1063
|
-
return {
|
|
1064
|
-
terminate,
|
|
1065
|
-
termination
|
|
1066
946
|
};
|
|
947
|
+
return { terminate, termination };
|
|
1067
948
|
}
|
|
1068
|
-
__name(createTerminator, "createTerminator");
|
|
1069
949
|
function setPrivateThreadProps(raw, worker, workerEvents, terminate) {
|
|
1070
|
-
const workerErrors = workerEvents.filter((event) => event.type ===
|
|
950
|
+
const workerErrors = workerEvents.filter((event) => event.type === "internalError" /* internalError */).map((errorEvent) => errorEvent.error);
|
|
1071
951
|
return Object.assign(raw, {
|
|
1072
952
|
[$errors]: workerErrors,
|
|
1073
953
|
[$events]: workerEvents,
|
|
@@ -1075,11 +955,14 @@ function setPrivateThreadProps(raw, worker, workerEvents, terminate) {
|
|
|
1075
955
|
[$worker]: worker
|
|
1076
956
|
});
|
|
1077
957
|
}
|
|
1078
|
-
__name(setPrivateThreadProps, "setPrivateThreadProps");
|
|
1079
958
|
async function spawn(worker, options) {
|
|
1080
959
|
debugSpawn("Initializing new thread");
|
|
1081
960
|
const timeout = options && options.timeout ? options.timeout : initMessageTimeout;
|
|
1082
|
-
const initMessage = await withTimeout(
|
|
961
|
+
const initMessage = await withTimeout(
|
|
962
|
+
receiveInitMessage(worker),
|
|
963
|
+
timeout,
|
|
964
|
+
`Timeout: Did not receive an init message from worker after ${timeout}ms. Make sure the worker calls expose().`
|
|
965
|
+
);
|
|
1083
966
|
const exposed = initMessage.exposed;
|
|
1084
967
|
const { termination, terminate } = createTerminator(worker);
|
|
1085
968
|
const events = createEventObservable(worker, termination);
|
|
@@ -1094,7 +977,6 @@ async function spawn(worker, options) {
|
|
|
1094
977
|
throw new Error(`Worker init message states unexpected type of expose(): ${type}`);
|
|
1095
978
|
}
|
|
1096
979
|
}
|
|
1097
|
-
__name(spawn, "spawn");
|
|
1098
980
|
|
|
1099
981
|
// src/master/index-node.ts
|
|
1100
982
|
var BlobWorker = getWorkerImplementation().blob;
|