@xylabs/threads 5.0.14 → 5.0.16
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
package/dist/node/index-node.mjs
CHANGED
|
@@ -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;
|
|
@@ -175,7 +149,6 @@ function extendSerializer(extend, implementation2) {
|
|
|
175
149
|
}
|
|
176
150
|
};
|
|
177
151
|
}
|
|
178
|
-
__name(extendSerializer, "extendSerializer");
|
|
179
152
|
var DefaultErrorSerializer = {
|
|
180
153
|
deserialize(message) {
|
|
181
154
|
return Object.assign(new Error(message.message), {
|
|
@@ -192,7 +165,7 @@ var DefaultErrorSerializer = {
|
|
|
192
165
|
};
|
|
193
166
|
}
|
|
194
167
|
};
|
|
195
|
-
var isSerializedError =
|
|
168
|
+
var isSerializedError = (thing) => thing && typeof thing === "object" && "__error_marker" in thing && thing.__error_marker === "$$error";
|
|
196
169
|
var DefaultSerializer = {
|
|
197
170
|
deserialize(message) {
|
|
198
171
|
return isSerializedError(message) ? DefaultErrorSerializer.deserialize(message) : message;
|
|
@@ -207,15 +180,12 @@ globalThis.registeredSerializer = globalThis.registeredSerializer ?? DefaultSeri
|
|
|
207
180
|
function registerSerializer(serializer) {
|
|
208
181
|
globalThis.registeredSerializer = extendSerializer(globalThis.registeredSerializer, serializer);
|
|
209
182
|
}
|
|
210
|
-
__name(registerSerializer, "registerSerializer");
|
|
211
183
|
function deserialize(message) {
|
|
212
184
|
return globalThis.registeredSerializer.deserialize(message);
|
|
213
185
|
}
|
|
214
|
-
__name(deserialize, "deserialize");
|
|
215
186
|
function serialize(input) {
|
|
216
187
|
return globalThis.registeredSerializer.serialize(input);
|
|
217
188
|
}
|
|
218
|
-
__name(serialize, "serialize");
|
|
219
189
|
|
|
220
190
|
// src/master/implementation.node.ts
|
|
221
191
|
import { EventEmitter } from "events";
|
|
@@ -225,19 +195,15 @@ import { cwd } from "process";
|
|
|
225
195
|
import { Worker as NativeWorker } from "worker_threads";
|
|
226
196
|
var defaultPoolSize = cpus().length;
|
|
227
197
|
function resolveScriptPath(scriptPath, baseURL) {
|
|
228
|
-
const makeAbsolute =
|
|
198
|
+
const makeAbsolute = (filePath) => {
|
|
229
199
|
return path.isAbsolute(filePath) ? filePath : path.join(baseURL ?? cwd(), filePath);
|
|
230
|
-
}
|
|
200
|
+
};
|
|
231
201
|
const absolutePath = makeAbsolute(scriptPath);
|
|
232
202
|
return absolutePath;
|
|
233
203
|
}
|
|
234
|
-
__name(resolveScriptPath, "resolveScriptPath");
|
|
235
204
|
function initWorkerThreadsWorker() {
|
|
236
205
|
let allWorkers = [];
|
|
237
|
-
|
|
238
|
-
static {
|
|
239
|
-
__name(this, "Worker");
|
|
240
|
-
}
|
|
206
|
+
class Worker3 extends NativeWorker {
|
|
241
207
|
mappedEventListeners;
|
|
242
208
|
constructor(scriptPath, options) {
|
|
243
209
|
const resolvedScriptPath = options && options.fromSource ? null : resolveScriptPath(scriptPath, (options ?? {})._baseURL);
|
|
@@ -245,20 +211,15 @@ function initWorkerThreadsWorker() {
|
|
|
245
211
|
super(resolvedScriptPath, options);
|
|
246
212
|
} else {
|
|
247
213
|
const sourceCode = scriptPath;
|
|
248
|
-
super(sourceCode, {
|
|
249
|
-
...options,
|
|
250
|
-
eval: true
|
|
251
|
-
});
|
|
214
|
+
super(sourceCode, { ...options, eval: true });
|
|
252
215
|
}
|
|
253
216
|
this.mappedEventListeners = /* @__PURE__ */ new WeakMap();
|
|
254
217
|
allWorkers.push(this);
|
|
255
218
|
}
|
|
256
219
|
addEventListener(eventName, rawListener) {
|
|
257
|
-
const listener =
|
|
258
|
-
rawListener({
|
|
259
|
-
|
|
260
|
-
});
|
|
261
|
-
}, "listener");
|
|
220
|
+
const listener = (message) => {
|
|
221
|
+
rawListener({ data: message });
|
|
222
|
+
};
|
|
262
223
|
this.mappedEventListeners.set(rawListener, listener);
|
|
263
224
|
this.on(eventName, listener);
|
|
264
225
|
}
|
|
@@ -266,55 +227,41 @@ function initWorkerThreadsWorker() {
|
|
|
266
227
|
const listener = this.mappedEventListeners.get(rawListener) || rawListener;
|
|
267
228
|
this.off(eventName, listener);
|
|
268
229
|
}
|
|
269
|
-
}
|
|
270
|
-
const terminateWorkersAndMaster =
|
|
271
|
-
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
|
+
);
|
|
272
236
|
allWorkers = [];
|
|
273
|
-
}
|
|
237
|
+
};
|
|
274
238
|
process.on("SIGINT", () => terminateWorkersAndMaster());
|
|
275
239
|
process.on("SIGTERM", () => terminateWorkersAndMaster());
|
|
276
|
-
|
|
277
|
-
static {
|
|
278
|
-
__name(this, "BlobWorker");
|
|
279
|
-
}
|
|
240
|
+
class BlobWorker2 extends Worker3 {
|
|
280
241
|
constructor(blob, options) {
|
|
281
|
-
super(Buffer.from(blob).toString("utf-8"), {
|
|
282
|
-
...options,
|
|
283
|
-
fromSource: true
|
|
284
|
-
});
|
|
242
|
+
super(Buffer.from(blob).toString("utf-8"), { ...options, fromSource: true });
|
|
285
243
|
}
|
|
286
244
|
static fromText(source, options) {
|
|
287
|
-
return new Worker3(source, {
|
|
288
|
-
...options,
|
|
289
|
-
fromSource: true
|
|
290
|
-
});
|
|
245
|
+
return new Worker3(source, { ...options, fromSource: true });
|
|
291
246
|
}
|
|
292
|
-
}
|
|
247
|
+
}
|
|
293
248
|
return {
|
|
294
249
|
blob: BlobWorker2,
|
|
295
250
|
default: Worker3
|
|
296
251
|
};
|
|
297
252
|
}
|
|
298
|
-
__name(initWorkerThreadsWorker, "initWorkerThreadsWorker");
|
|
299
253
|
function initTinyWorker() {
|
|
300
254
|
const TinyWorker = require_lib();
|
|
301
255
|
let allWorkers = [];
|
|
302
|
-
|
|
303
|
-
static {
|
|
304
|
-
__name(this, "Worker");
|
|
305
|
-
}
|
|
256
|
+
class Worker3 extends TinyWorker {
|
|
306
257
|
emitter;
|
|
307
258
|
constructor(scriptPath, options) {
|
|
308
259
|
const resolvedScriptPath = options && options.fromSource ? null : process.platform === "win32" ? `file:///${resolveScriptPath(scriptPath).replaceAll("\\", "/")}` : resolveScriptPath(scriptPath);
|
|
309
260
|
if (resolvedScriptPath) {
|
|
310
|
-
super(resolvedScriptPath, [], {
|
|
311
|
-
esm: true
|
|
312
|
-
});
|
|
261
|
+
super(resolvedScriptPath, [], { esm: true });
|
|
313
262
|
} else {
|
|
314
263
|
const sourceCode = scriptPath;
|
|
315
|
-
super(new Function(sourceCode), [], {
|
|
316
|
-
esm: true
|
|
317
|
-
});
|
|
264
|
+
super(new Function(sourceCode), [], { esm: true });
|
|
318
265
|
}
|
|
319
266
|
allWorkers.push(this);
|
|
320
267
|
this.emitter = new EventEmitter();
|
|
@@ -331,36 +278,29 @@ function initTinyWorker() {
|
|
|
331
278
|
allWorkers = allWorkers.filter((worker) => worker !== this);
|
|
332
279
|
return super.terminate();
|
|
333
280
|
}
|
|
334
|
-
}
|
|
335
|
-
const terminateWorkersAndMaster =
|
|
336
|
-
Promise.all(allWorkers.map((worker) => worker.terminate())).then(
|
|
281
|
+
}
|
|
282
|
+
const terminateWorkersAndMaster = () => {
|
|
283
|
+
Promise.all(allWorkers.map((worker) => worker.terminate())).then(
|
|
284
|
+
() => process.exit(0),
|
|
285
|
+
() => process.exit(1)
|
|
286
|
+
);
|
|
337
287
|
allWorkers = [];
|
|
338
|
-
}
|
|
288
|
+
};
|
|
339
289
|
process.on("SIGINT", () => terminateWorkersAndMaster());
|
|
340
290
|
process.on("SIGTERM", () => terminateWorkersAndMaster());
|
|
341
|
-
|
|
342
|
-
static {
|
|
343
|
-
__name(this, "BlobWorker");
|
|
344
|
-
}
|
|
291
|
+
class BlobWorker2 extends Worker3 {
|
|
345
292
|
constructor(blob, options) {
|
|
346
|
-
super(Buffer.from(blob).toString("utf-8"), {
|
|
347
|
-
...options,
|
|
348
|
-
fromSource: true
|
|
349
|
-
});
|
|
293
|
+
super(Buffer.from(blob).toString("utf-8"), { ...options, fromSource: true });
|
|
350
294
|
}
|
|
351
295
|
static fromText(source, options) {
|
|
352
|
-
return new Worker3(source, {
|
|
353
|
-
...options,
|
|
354
|
-
fromSource: true
|
|
355
|
-
});
|
|
296
|
+
return new Worker3(source, { ...options, fromSource: true });
|
|
356
297
|
}
|
|
357
|
-
}
|
|
298
|
+
}
|
|
358
299
|
return {
|
|
359
300
|
blob: BlobWorker2,
|
|
360
301
|
default: Worker3
|
|
361
302
|
};
|
|
362
303
|
}
|
|
363
|
-
__name(initTinyWorker, "initTinyWorker");
|
|
364
304
|
var implementation;
|
|
365
305
|
var isTinyWorker;
|
|
366
306
|
function selectWorkerImplementation() {
|
|
@@ -374,14 +314,12 @@ function selectWorkerImplementation() {
|
|
|
374
314
|
return initTinyWorker();
|
|
375
315
|
}
|
|
376
316
|
}
|
|
377
|
-
__name(selectWorkerImplementation, "selectWorkerImplementation");
|
|
378
317
|
function getWorkerImplementation() {
|
|
379
318
|
if (!implementation) {
|
|
380
319
|
implementation = selectWorkerImplementation();
|
|
381
320
|
}
|
|
382
321
|
return implementation;
|
|
383
322
|
}
|
|
384
|
-
__name(getWorkerImplementation, "getWorkerImplementation");
|
|
385
323
|
function isWorkerRuntime() {
|
|
386
324
|
if (isTinyWorker) {
|
|
387
325
|
return globalThis !== void 0 && self["postMessage"] ? true : false;
|
|
@@ -390,17 +328,20 @@ function isWorkerRuntime() {
|
|
|
390
328
|
return !isMainThread;
|
|
391
329
|
}
|
|
392
330
|
}
|
|
393
|
-
__name(isWorkerRuntime, "isWorkerRuntime");
|
|
394
331
|
|
|
395
332
|
// src/master/pool-browser.ts
|
|
396
333
|
import DebugLogger from "debug";
|
|
397
|
-
import {
|
|
334
|
+
import {
|
|
335
|
+
multicast,
|
|
336
|
+
Observable,
|
|
337
|
+
Subject
|
|
338
|
+
} from "observable-fns";
|
|
398
339
|
|
|
399
340
|
// src/master/implementation.browser.ts
|
|
400
341
|
var defaultPoolSize2 = typeof navigator !== "undefined" && navigator.hardwareConcurrency ? navigator.hardwareConcurrency : 4;
|
|
401
342
|
|
|
402
343
|
// src/master/pool-types.ts
|
|
403
|
-
var PoolEventType = /* @__PURE__ */
|
|
344
|
+
var PoolEventType = /* @__PURE__ */ ((PoolEventType2) => {
|
|
404
345
|
PoolEventType2["initialized"] = "initialized";
|
|
405
346
|
PoolEventType2["taskCanceled"] = "taskCanceled";
|
|
406
347
|
PoolEventType2["taskCompleted"] = "taskCompleted";
|
|
@@ -410,7 +351,7 @@ var PoolEventType = /* @__PURE__ */ function(PoolEventType2) {
|
|
|
410
351
|
PoolEventType2["taskStart"] = "taskStart";
|
|
411
352
|
PoolEventType2["terminated"] = "terminated";
|
|
412
353
|
return PoolEventType2;
|
|
413
|
-
}({});
|
|
354
|
+
})(PoolEventType || {});
|
|
414
355
|
|
|
415
356
|
// src/symbols.ts
|
|
416
357
|
var $errors = Symbol("thread.errors");
|
|
@@ -423,7 +364,6 @@ var $worker = Symbol("thread.worker");
|
|
|
423
364
|
function fail(message) {
|
|
424
365
|
throw new Error(message);
|
|
425
366
|
}
|
|
426
|
-
__name(fail, "fail");
|
|
427
367
|
var Thread = {
|
|
428
368
|
/** Return an observable that can be used to subscribe to all errors happening in the thread. */
|
|
429
369
|
errors(thread) {
|
|
@@ -448,33 +388,24 @@ function createArray(size) {
|
|
|
448
388
|
}
|
|
449
389
|
return array;
|
|
450
390
|
}
|
|
451
|
-
__name(createArray, "createArray");
|
|
452
391
|
function delay(ms) {
|
|
453
392
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
454
393
|
}
|
|
455
|
-
__name(delay, "delay");
|
|
456
394
|
function flatMap(array, mapper) {
|
|
457
|
-
return array.reduce((flattened, element) => [
|
|
458
|
-
...flattened,
|
|
459
|
-
...mapper(element)
|
|
460
|
-
], []);
|
|
395
|
+
return array.reduce((flattened, element) => [...flattened, ...mapper(element)], []);
|
|
461
396
|
}
|
|
462
|
-
__name(flatMap, "flatMap");
|
|
463
397
|
function slugify(text) {
|
|
464
398
|
return text.replaceAll(/\W/g, " ").trim().replaceAll(/\s+/g, "-");
|
|
465
399
|
}
|
|
466
|
-
__name(slugify, "slugify");
|
|
467
400
|
function spawnWorkers(spawnWorker, count) {
|
|
468
|
-
return createArray(count).map(
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
401
|
+
return createArray(count).map(
|
|
402
|
+
() => ({
|
|
403
|
+
init: spawnWorker(),
|
|
404
|
+
runningTasks: []
|
|
405
|
+
})
|
|
406
|
+
);
|
|
472
407
|
}
|
|
473
|
-
|
|
474
|
-
var WorkerPool = class WorkerPool2 {
|
|
475
|
-
static {
|
|
476
|
-
__name(this, "WorkerPool");
|
|
477
|
-
}
|
|
408
|
+
var WorkerPool = class {
|
|
478
409
|
static EventType = PoolEventType;
|
|
479
410
|
debug;
|
|
480
411
|
eventObservable;
|
|
@@ -486,22 +417,23 @@ var WorkerPool = class WorkerPool2 {
|
|
|
486
417
|
nextTaskID = 1;
|
|
487
418
|
taskQueue = [];
|
|
488
419
|
constructor(spawnWorker, optionsOrSize) {
|
|
489
|
-
const options = typeof optionsOrSize === "number" ? {
|
|
490
|
-
size: optionsOrSize
|
|
491
|
-
} : optionsOrSize || {};
|
|
420
|
+
const options = typeof optionsOrSize === "number" ? { size: optionsOrSize } : optionsOrSize || {};
|
|
492
421
|
const { size = defaultPoolSize2 } = options;
|
|
493
422
|
this.debug = DebugLogger(`threads:pool:${slugify(options.name || String(nextPoolID++))}`);
|
|
494
423
|
this.options = options;
|
|
495
424
|
this.workers = spawnWorkers(spawnWorker, size);
|
|
496
425
|
this.eventObservable = multicast(Observable.from(this.eventSubject));
|
|
497
|
-
Promise.all(this.workers.map((worker) => worker.init)).then(
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
426
|
+
Promise.all(this.workers.map((worker) => worker.init)).then(
|
|
427
|
+
() => this.eventSubject.next({
|
|
428
|
+
size: this.workers.length,
|
|
429
|
+
type: "initialized" /* initialized */
|
|
430
|
+
}),
|
|
431
|
+
(error) => {
|
|
432
|
+
this.debug("Error while initializing pool worker:", error);
|
|
433
|
+
this.eventSubject.error(error);
|
|
434
|
+
this.initErrors.push(error);
|
|
435
|
+
}
|
|
436
|
+
);
|
|
505
437
|
}
|
|
506
438
|
findIdlingWorker() {
|
|
507
439
|
const { concurrency = 1 } = this.options;
|
|
@@ -512,7 +444,7 @@ var WorkerPool = class WorkerPool2 {
|
|
|
512
444
|
this.debug(`Running task #${task.id} on worker #${workerID}...`);
|
|
513
445
|
this.eventSubject.next({
|
|
514
446
|
taskID: task.id,
|
|
515
|
-
type:
|
|
447
|
+
type: "taskStart" /* taskStart */,
|
|
516
448
|
workerID
|
|
517
449
|
});
|
|
518
450
|
try {
|
|
@@ -521,7 +453,7 @@ var WorkerPool = class WorkerPool2 {
|
|
|
521
453
|
this.eventSubject.next({
|
|
522
454
|
returnValue,
|
|
523
455
|
taskID: task.id,
|
|
524
|
-
type:
|
|
456
|
+
type: "taskCompleted" /* taskCompleted */,
|
|
525
457
|
workerID
|
|
526
458
|
});
|
|
527
459
|
} catch (ex) {
|
|
@@ -530,16 +462,16 @@ var WorkerPool = class WorkerPool2 {
|
|
|
530
462
|
this.eventSubject.next({
|
|
531
463
|
error,
|
|
532
464
|
taskID: task.id,
|
|
533
|
-
type:
|
|
465
|
+
type: "taskFailed" /* taskFailed */,
|
|
534
466
|
workerID
|
|
535
467
|
});
|
|
536
468
|
}
|
|
537
469
|
}
|
|
538
470
|
run(worker, task) {
|
|
539
471
|
const runPromise = (async () => {
|
|
540
|
-
const removeTaskFromWorkersRunningTasks =
|
|
472
|
+
const removeTaskFromWorkersRunningTasks = () => {
|
|
541
473
|
worker.runningTasks = worker.runningTasks.filter((someRunPromise) => someRunPromise !== runPromise);
|
|
542
|
-
}
|
|
474
|
+
};
|
|
543
475
|
await delay(0);
|
|
544
476
|
try {
|
|
545
477
|
await this.runPoolTask(worker, task);
|
|
@@ -559,9 +491,7 @@ var WorkerPool = class WorkerPool2 {
|
|
|
559
491
|
const nextTask = this.taskQueue.shift();
|
|
560
492
|
if (!nextTask) {
|
|
561
493
|
this.debug("Task queue is empty");
|
|
562
|
-
this.eventSubject.next({
|
|
563
|
-
type: PoolEventType.taskQueueDrained
|
|
564
|
-
});
|
|
494
|
+
this.eventSubject.next({ type: "taskQueueDrained" /* taskQueueDrained */ });
|
|
565
495
|
return;
|
|
566
496
|
}
|
|
567
497
|
this.run(availableWorker, nextTask);
|
|
@@ -569,13 +499,13 @@ var WorkerPool = class WorkerPool2 {
|
|
|
569
499
|
taskCompletion(taskID) {
|
|
570
500
|
return new Promise((resolve, reject) => {
|
|
571
501
|
const eventSubscription = this.events().subscribe((event) => {
|
|
572
|
-
if (event.type ===
|
|
502
|
+
if (event.type === "taskCompleted" /* taskCompleted */ && event.taskID === taskID) {
|
|
573
503
|
eventSubscription.unsubscribe();
|
|
574
504
|
resolve(event.returnValue);
|
|
575
|
-
} else if (event.type ===
|
|
505
|
+
} else if (event.type === "taskFailed" /* taskFailed */ && event.taskID === taskID) {
|
|
576
506
|
eventSubscription.unsubscribe();
|
|
577
507
|
reject(event.error);
|
|
578
|
-
} else if (event.type ===
|
|
508
|
+
} else if (event.type === "terminated" /* terminated */) {
|
|
579
509
|
eventSubscription.unsubscribe();
|
|
580
510
|
reject(new Error("Pool has been terminated before task was run."));
|
|
581
511
|
}
|
|
@@ -583,10 +513,10 @@ var WorkerPool = class WorkerPool2 {
|
|
|
583
513
|
});
|
|
584
514
|
}
|
|
585
515
|
async settled(allowResolvingImmediately = false) {
|
|
586
|
-
const getCurrentlyRunningTasks =
|
|
516
|
+
const getCurrentlyRunningTasks = () => flatMap(this.workers, (worker) => worker.runningTasks);
|
|
587
517
|
const taskFailures = [];
|
|
588
518
|
const failureSubscription = this.eventObservable.subscribe((event) => {
|
|
589
|
-
if (event.type ===
|
|
519
|
+
if (event.type === "taskFailed" /* taskFailed */) {
|
|
590
520
|
taskFailures.push(event.error);
|
|
591
521
|
}
|
|
592
522
|
});
|
|
@@ -601,11 +531,12 @@ var WorkerPool = class WorkerPool2 {
|
|
|
601
531
|
const subscription = this.eventObservable.subscribe({
|
|
602
532
|
error: reject,
|
|
603
533
|
next(event) {
|
|
604
|
-
if (event.type ===
|
|
534
|
+
if (event.type === "taskQueueDrained" /* taskQueueDrained */) {
|
|
605
535
|
subscription.unsubscribe();
|
|
606
536
|
resolve(void 0);
|
|
607
537
|
}
|
|
608
538
|
}
|
|
539
|
+
// make a pool-wide error reject the completed() result promise
|
|
609
540
|
});
|
|
610
541
|
});
|
|
611
542
|
await Promise.allSettled(getCurrentlyRunningTasks());
|
|
@@ -618,20 +549,18 @@ var WorkerPool = class WorkerPool2 {
|
|
|
618
549
|
const subscription = this.eventObservable.subscribe({
|
|
619
550
|
error: reject,
|
|
620
551
|
next(event) {
|
|
621
|
-
if (event.type ===
|
|
552
|
+
if (event.type === "taskQueueDrained" /* taskQueueDrained */) {
|
|
622
553
|
subscription.unsubscribe();
|
|
623
554
|
resolve(settlementPromise);
|
|
624
|
-
} else if (event.type ===
|
|
555
|
+
} else if (event.type === "taskFailed" /* taskFailed */) {
|
|
625
556
|
subscription.unsubscribe();
|
|
626
557
|
reject(event.error);
|
|
627
558
|
}
|
|
628
559
|
}
|
|
560
|
+
// make a pool-wide error reject the completed() result promise
|
|
629
561
|
});
|
|
630
562
|
});
|
|
631
|
-
const errors = await Promise.race([
|
|
632
|
-
settlementPromise,
|
|
633
|
-
earlyExitPromise
|
|
634
|
-
]);
|
|
563
|
+
const errors = await Promise.race([settlementPromise, earlyExitPromise]);
|
|
635
564
|
if (errors.length > 0) {
|
|
636
565
|
throw errors[0];
|
|
637
566
|
}
|
|
@@ -653,26 +582,28 @@ var WorkerPool = class WorkerPool2 {
|
|
|
653
582
|
this.debug(`Task #${taskID} errored:`, error);
|
|
654
583
|
});
|
|
655
584
|
const task = {
|
|
656
|
-
cancel:
|
|
585
|
+
cancel: () => {
|
|
657
586
|
if (!this.taskQueue.includes(task)) return;
|
|
658
587
|
this.taskQueue = this.taskQueue.filter((someTask) => someTask !== task);
|
|
659
588
|
this.eventSubject.next({
|
|
660
589
|
taskID: task.id,
|
|
661
|
-
type:
|
|
590
|
+
type: "taskCanceled" /* taskCanceled */
|
|
662
591
|
});
|
|
663
|
-
},
|
|
592
|
+
},
|
|
664
593
|
id: taskID,
|
|
665
594
|
run: taskFunction,
|
|
666
595
|
then: taskCompletion.then.bind(taskCompletion)
|
|
667
596
|
};
|
|
668
597
|
if (this.taskQueue.length >= maxQueuedJobs) {
|
|
669
|
-
throw new Error(
|
|
598
|
+
throw new Error(
|
|
599
|
+
"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."
|
|
600
|
+
);
|
|
670
601
|
}
|
|
671
602
|
this.debug(`Queueing task #${task.id}...`);
|
|
672
603
|
this.taskQueue.push(task);
|
|
673
604
|
this.eventSubject.next({
|
|
674
605
|
taskID: task.id,
|
|
675
|
-
type:
|
|
606
|
+
type: "taskQueued" /* taskQueued */
|
|
676
607
|
});
|
|
677
608
|
this.scheduleWork();
|
|
678
609
|
return task;
|
|
@@ -683,10 +614,8 @@ var WorkerPool = class WorkerPool2 {
|
|
|
683
614
|
await this.completed(true);
|
|
684
615
|
}
|
|
685
616
|
this.eventSubject.next({
|
|
686
|
-
remainingQueue: [
|
|
687
|
-
|
|
688
|
-
],
|
|
689
|
-
type: PoolEventType.terminated
|
|
617
|
+
remainingQueue: [...this.taskQueue],
|
|
618
|
+
type: "terminated" /* terminated */
|
|
690
619
|
});
|
|
691
620
|
this.eventSubject.complete();
|
|
692
621
|
await Promise.all(this.workers.map(async (worker) => Thread.terminate(await worker.init)));
|
|
@@ -695,7 +624,6 @@ var WorkerPool = class WorkerPool2 {
|
|
|
695
624
|
function PoolConstructor(spawnWorker, optionsOrSize) {
|
|
696
625
|
return new WorkerPool(spawnWorker, optionsOrSize);
|
|
697
626
|
}
|
|
698
|
-
__name(PoolConstructor, "PoolConstructor");
|
|
699
627
|
PoolConstructor.EventType = PoolEventType;
|
|
700
628
|
var Pool = PoolConstructor;
|
|
701
629
|
|
|
@@ -704,7 +632,7 @@ import DebugLogger3 from "debug";
|
|
|
704
632
|
import { Observable as Observable4 } from "observable-fns";
|
|
705
633
|
|
|
706
634
|
// src/promise.ts
|
|
707
|
-
var doNothing =
|
|
635
|
+
var doNothing = () => void 0;
|
|
708
636
|
function createPromiseWithResolver() {
|
|
709
637
|
let alreadyResolved = false;
|
|
710
638
|
let resolvedTo;
|
|
@@ -716,25 +644,13 @@ function createPromiseWithResolver() {
|
|
|
716
644
|
resolver = resolve;
|
|
717
645
|
}
|
|
718
646
|
});
|
|
719
|
-
const exposedResolver =
|
|
647
|
+
const exposedResolver = (value) => {
|
|
720
648
|
alreadyResolved = true;
|
|
721
649
|
resolvedTo = value;
|
|
722
650
|
resolver(resolvedTo);
|
|
723
|
-
}
|
|
724
|
-
return [
|
|
725
|
-
promise,
|
|
726
|
-
exposedResolver
|
|
727
|
-
];
|
|
651
|
+
};
|
|
652
|
+
return [promise, exposedResolver];
|
|
728
653
|
}
|
|
729
|
-
__name(createPromiseWithResolver, "createPromiseWithResolver");
|
|
730
|
-
|
|
731
|
-
// src/types/master.ts
|
|
732
|
-
var WorkerEventType = /* @__PURE__ */ function(WorkerEventType2) {
|
|
733
|
-
WorkerEventType2["internalError"] = "internalError";
|
|
734
|
-
WorkerEventType2["message"] = "message";
|
|
735
|
-
WorkerEventType2["termination"] = "termination";
|
|
736
|
-
return WorkerEventType2;
|
|
737
|
-
}({});
|
|
738
654
|
|
|
739
655
|
// src/master/invocation-proxy.ts
|
|
740
656
|
import DebugLogger2 from "debug";
|
|
@@ -742,22 +658,17 @@ import { multicast as multicast2, Observable as Observable3 } from "observable-f
|
|
|
742
658
|
|
|
743
659
|
// src/observable-promise.ts
|
|
744
660
|
import { Observable as Observable2 } from "observable-fns";
|
|
745
|
-
var doNothing2 =
|
|
746
|
-
}
|
|
747
|
-
var returnInput =
|
|
748
|
-
var runDeferred =
|
|
661
|
+
var doNothing2 = () => {
|
|
662
|
+
};
|
|
663
|
+
var returnInput = (input) => input;
|
|
664
|
+
var runDeferred = (fn) => Promise.resolve().then(fn);
|
|
749
665
|
function fail2(error) {
|
|
750
666
|
throw error;
|
|
751
667
|
}
|
|
752
|
-
__name(fail2, "fail");
|
|
753
668
|
function isThenable(thing) {
|
|
754
669
|
return thing && typeof thing.then === "function";
|
|
755
670
|
}
|
|
756
|
-
__name(isThenable, "isThenable");
|
|
757
671
|
var ObservablePromise = class _ObservablePromise extends Observable2 {
|
|
758
|
-
static {
|
|
759
|
-
__name(this, "ObservablePromise");
|
|
760
|
-
}
|
|
761
672
|
[Symbol.toStringTag] = "[object ObservablePromise]";
|
|
762
673
|
initHasRun = false;
|
|
763
674
|
fulfillmentCallbacks = [];
|
|
@@ -816,7 +727,7 @@ var ObservablePromise = class _ObservablePromise extends Observable2 {
|
|
|
816
727
|
const onRejected = onRejectedRaw || fail2;
|
|
817
728
|
let onRejectedCalled = false;
|
|
818
729
|
return new Promise((resolve, reject) => {
|
|
819
|
-
const rejectionCallback =
|
|
730
|
+
const rejectionCallback = (error) => {
|
|
820
731
|
if (onRejectedCalled) return;
|
|
821
732
|
onRejectedCalled = true;
|
|
822
733
|
try {
|
|
@@ -824,19 +735,17 @@ var ObservablePromise = class _ObservablePromise extends Observable2 {
|
|
|
824
735
|
} catch (anotherError) {
|
|
825
736
|
reject(anotherError);
|
|
826
737
|
}
|
|
827
|
-
}
|
|
828
|
-
const fulfillmentCallback =
|
|
738
|
+
};
|
|
739
|
+
const fulfillmentCallback = (value) => {
|
|
829
740
|
try {
|
|
830
741
|
resolve(onFulfilled(value));
|
|
831
742
|
} catch (ex) {
|
|
832
743
|
const error = ex;
|
|
833
744
|
rejectionCallback(error);
|
|
834
745
|
}
|
|
835
|
-
}
|
|
746
|
+
};
|
|
836
747
|
if (!this.initHasRun) {
|
|
837
|
-
this.subscribe({
|
|
838
|
-
error: rejectionCallback
|
|
839
|
-
});
|
|
748
|
+
this.subscribe({ error: rejectionCallback });
|
|
840
749
|
}
|
|
841
750
|
if (this.state === "fulfilled") {
|
|
842
751
|
return resolve(onFulfilled(this.firstValue));
|
|
@@ -854,20 +763,23 @@ var ObservablePromise = class _ObservablePromise extends Observable2 {
|
|
|
854
763
|
}
|
|
855
764
|
finally(onCompleted) {
|
|
856
765
|
const handler = onCompleted || doNothing2;
|
|
857
|
-
return this.then(
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
766
|
+
return this.then(
|
|
767
|
+
(value) => {
|
|
768
|
+
handler();
|
|
769
|
+
return value;
|
|
770
|
+
},
|
|
771
|
+
() => handler()
|
|
772
|
+
);
|
|
861
773
|
}
|
|
862
774
|
static from(thing) {
|
|
863
775
|
return isThenable(thing) ? new _ObservablePromise((observer) => {
|
|
864
|
-
const onFulfilled =
|
|
776
|
+
const onFulfilled = (value) => {
|
|
865
777
|
observer.next(value);
|
|
866
778
|
observer.complete();
|
|
867
|
-
}
|
|
868
|
-
const onRejected =
|
|
779
|
+
};
|
|
780
|
+
const onRejected = (error) => {
|
|
869
781
|
observer.error(error);
|
|
870
|
-
}
|
|
782
|
+
};
|
|
871
783
|
thing.then(onFulfilled, onRejected);
|
|
872
784
|
}) : super.from(thing);
|
|
873
785
|
}
|
|
@@ -878,18 +790,14 @@ function isTransferable(thing) {
|
|
|
878
790
|
if (!thing || typeof thing !== "object") return false;
|
|
879
791
|
return true;
|
|
880
792
|
}
|
|
881
|
-
__name(isTransferable, "isTransferable");
|
|
882
793
|
function isTransferDescriptor(thing) {
|
|
883
794
|
return thing && typeof thing === "object" && thing[$transferable];
|
|
884
795
|
}
|
|
885
|
-
__name(isTransferDescriptor, "isTransferDescriptor");
|
|
886
796
|
function Transfer(payload, transferables) {
|
|
887
797
|
console.log("Transfer");
|
|
888
798
|
if (!transferables) {
|
|
889
799
|
if (!isTransferable(payload)) throw new Error("Not transferable");
|
|
890
|
-
transferables = [
|
|
891
|
-
payload
|
|
892
|
-
];
|
|
800
|
+
transferables = [payload];
|
|
893
801
|
}
|
|
894
802
|
return {
|
|
895
803
|
[$transferable]: true,
|
|
@@ -897,36 +805,18 @@ function Transfer(payload, transferables) {
|
|
|
897
805
|
transferables
|
|
898
806
|
};
|
|
899
807
|
}
|
|
900
|
-
__name(Transfer, "Transfer");
|
|
901
|
-
|
|
902
|
-
// src/types/messages.ts
|
|
903
|
-
var MasterMessageType = /* @__PURE__ */ function(MasterMessageType2) {
|
|
904
|
-
MasterMessageType2["cancel"] = "cancel";
|
|
905
|
-
MasterMessageType2["run"] = "run";
|
|
906
|
-
return MasterMessageType2;
|
|
907
|
-
}({});
|
|
908
|
-
var WorkerMessageType = /* @__PURE__ */ function(WorkerMessageType2) {
|
|
909
|
-
WorkerMessageType2["error"] = "error";
|
|
910
|
-
WorkerMessageType2["init"] = "init";
|
|
911
|
-
WorkerMessageType2["result"] = "result";
|
|
912
|
-
WorkerMessageType2["running"] = "running";
|
|
913
|
-
WorkerMessageType2["uncaughtError"] = "uncaughtError";
|
|
914
|
-
return WorkerMessageType2;
|
|
915
|
-
}({});
|
|
916
808
|
|
|
917
809
|
// src/master/invocation-proxy.ts
|
|
918
810
|
var debugMessages = DebugLogger2("threads:master:messages");
|
|
919
811
|
var nextJobUID = 1;
|
|
920
|
-
var dedupe =
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
var
|
|
924
|
-
var isJobResultMessage = /* @__PURE__ */ __name((data) => data && data.type === WorkerMessageType.result, "isJobResultMessage");
|
|
925
|
-
var isJobStartMessage = /* @__PURE__ */ __name((data) => data && data.type === WorkerMessageType.running, "isJobStartMessage");
|
|
812
|
+
var dedupe = (array) => [...new Set(array)];
|
|
813
|
+
var isJobErrorMessage = (data) => data && data.type === "error" /* error */;
|
|
814
|
+
var isJobResultMessage = (data) => data && data.type === "result" /* result */;
|
|
815
|
+
var isJobStartMessage = (data) => data && data.type === "running" /* running */;
|
|
926
816
|
function createObservableForJob(worker, jobUID) {
|
|
927
817
|
return new Observable3((observer) => {
|
|
928
818
|
let asyncType;
|
|
929
|
-
const messageHandler =
|
|
819
|
+
const messageHandler = (event) => {
|
|
930
820
|
debugMessages("Message from worker:", event.data);
|
|
931
821
|
if (!event.data || event.data.uid !== jobUID) return;
|
|
932
822
|
if (isJobStartMessage(event.data)) {
|
|
@@ -956,12 +846,12 @@ function createObservableForJob(worker, jobUID) {
|
|
|
956
846
|
}
|
|
957
847
|
worker.removeEventListener("message", messageHandler);
|
|
958
848
|
}
|
|
959
|
-
}
|
|
849
|
+
};
|
|
960
850
|
worker.addEventListener("message", messageHandler);
|
|
961
851
|
return () => {
|
|
962
852
|
if (asyncType === "observable" || !asyncType) {
|
|
963
853
|
const cancelMessage = {
|
|
964
|
-
type:
|
|
854
|
+
type: "cancel" /* cancel */,
|
|
965
855
|
uid: jobUID
|
|
966
856
|
};
|
|
967
857
|
worker.postMessage(cancelMessage);
|
|
@@ -970,7 +860,6 @@ function createObservableForJob(worker, jobUID) {
|
|
|
970
860
|
};
|
|
971
861
|
});
|
|
972
862
|
}
|
|
973
|
-
__name(createObservableForJob, "createObservableForJob");
|
|
974
863
|
function prepareArguments(rawArgs) {
|
|
975
864
|
if (rawArgs.length === 0) {
|
|
976
865
|
return {
|
|
@@ -993,7 +882,6 @@ function prepareArguments(rawArgs) {
|
|
|
993
882
|
transferables: transferables.length === 0 ? transferables : dedupe(transferables)
|
|
994
883
|
};
|
|
995
884
|
}
|
|
996
|
-
__name(prepareArguments, "prepareArguments");
|
|
997
885
|
function createProxyFunction(worker, method) {
|
|
998
886
|
return (...rawArgs) => {
|
|
999
887
|
const uid = nextJobUID++;
|
|
@@ -1001,7 +889,7 @@ function createProxyFunction(worker, method) {
|
|
|
1001
889
|
const runMessage = {
|
|
1002
890
|
args,
|
|
1003
891
|
method,
|
|
1004
|
-
type:
|
|
892
|
+
type: "run" /* run */,
|
|
1005
893
|
uid
|
|
1006
894
|
};
|
|
1007
895
|
debugMessages("Sending command to run function to worker:", runMessage);
|
|
@@ -1013,7 +901,6 @@ function createProxyFunction(worker, method) {
|
|
|
1013
901
|
return ObservablePromise.from(multicast2(createObservableForJob(worker, uid)));
|
|
1014
902
|
};
|
|
1015
903
|
}
|
|
1016
|
-
__name(createProxyFunction, "createProxyFunction");
|
|
1017
904
|
function createProxyModule(worker, methodNames) {
|
|
1018
905
|
const proxy = {};
|
|
1019
906
|
for (const methodName of methodNames) {
|
|
@@ -1021,31 +908,26 @@ function createProxyModule(worker, methodNames) {
|
|
|
1021
908
|
}
|
|
1022
909
|
return proxy;
|
|
1023
910
|
}
|
|
1024
|
-
__name(createProxyModule, "createProxyModule");
|
|
1025
911
|
|
|
1026
912
|
// src/master/spawn.ts
|
|
1027
913
|
var debugMessages2 = DebugLogger3("threads:master:messages");
|
|
1028
914
|
var debugSpawn = DebugLogger3("threads:master:spawn");
|
|
1029
915
|
var debugThreadUtils = DebugLogger3("threads:master:thread-utils");
|
|
1030
|
-
var isInitMessage =
|
|
1031
|
-
var isUncaughtErrorMessage =
|
|
916
|
+
var isInitMessage = (data) => data && data.type === "init";
|
|
917
|
+
var isUncaughtErrorMessage = (data) => data && data.type === "uncaughtError";
|
|
1032
918
|
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;
|
|
1033
919
|
async function withTimeout(promise, timeoutInMs, errorMessage) {
|
|
1034
920
|
let timeoutHandle;
|
|
1035
921
|
const timeout = new Promise((resolve, reject) => {
|
|
1036
922
|
timeoutHandle = setTimeout(() => reject(new Error(errorMessage)), timeoutInMs);
|
|
1037
923
|
});
|
|
1038
|
-
const result = await Promise.race([
|
|
1039
|
-
promise,
|
|
1040
|
-
timeout
|
|
1041
|
-
]);
|
|
924
|
+
const result = await Promise.race([promise, timeout]);
|
|
1042
925
|
clearTimeout(timeoutHandle);
|
|
1043
926
|
return result;
|
|
1044
927
|
}
|
|
1045
|
-
__name(withTimeout, "withTimeout");
|
|
1046
928
|
function receiveInitMessage(worker) {
|
|
1047
929
|
return new Promise((resolve, reject) => {
|
|
1048
|
-
const messageHandler =
|
|
930
|
+
const messageHandler = (event) => {
|
|
1049
931
|
debugMessages2("Message from worker before finishing initialization:", event.data);
|
|
1050
932
|
if (isInitMessage(event.data)) {
|
|
1051
933
|
worker.removeEventListener("message", messageHandler);
|
|
@@ -1054,34 +936,31 @@ function receiveInitMessage(worker) {
|
|
|
1054
936
|
worker.removeEventListener("message", messageHandler);
|
|
1055
937
|
reject(deserialize(event.data.error));
|
|
1056
938
|
}
|
|
1057
|
-
}
|
|
939
|
+
};
|
|
1058
940
|
worker.addEventListener("message", messageHandler);
|
|
1059
941
|
});
|
|
1060
942
|
}
|
|
1061
|
-
__name(receiveInitMessage, "receiveInitMessage");
|
|
1062
943
|
function createEventObservable(worker, workerTermination) {
|
|
1063
944
|
return new Observable4((observer) => {
|
|
1064
|
-
const messageHandler =
|
|
945
|
+
const messageHandler = (messageEvent) => {
|
|
1065
946
|
const workerEvent = {
|
|
1066
947
|
data: messageEvent.data,
|
|
1067
|
-
type:
|
|
948
|
+
type: "message" /* message */
|
|
1068
949
|
};
|
|
1069
950
|
observer.next(workerEvent);
|
|
1070
|
-
}
|
|
1071
|
-
const rejectionHandler =
|
|
951
|
+
};
|
|
952
|
+
const rejectionHandler = (errorEvent) => {
|
|
1072
953
|
debugThreadUtils("Unhandled promise rejection event in thread:", errorEvent);
|
|
1073
954
|
const workerEvent = {
|
|
1074
955
|
error: new Error(errorEvent.reason),
|
|
1075
|
-
type:
|
|
956
|
+
type: "internalError" /* internalError */
|
|
1076
957
|
};
|
|
1077
958
|
observer.next(workerEvent);
|
|
1078
|
-
}
|
|
959
|
+
};
|
|
1079
960
|
worker.addEventListener("message", messageHandler);
|
|
1080
961
|
worker.addEventListener("unhandledrejection", rejectionHandler);
|
|
1081
962
|
workerTermination.then(() => {
|
|
1082
|
-
const terminationEvent = {
|
|
1083
|
-
type: WorkerEventType.termination
|
|
1084
|
-
};
|
|
963
|
+
const terminationEvent = { type: "termination" /* termination */ };
|
|
1085
964
|
worker.removeEventListener("message", messageHandler);
|
|
1086
965
|
worker.removeEventListener("unhandledrejection", rejectionHandler);
|
|
1087
966
|
observer.next(terminationEvent);
|
|
@@ -1089,22 +968,17 @@ function createEventObservable(worker, workerTermination) {
|
|
|
1089
968
|
});
|
|
1090
969
|
});
|
|
1091
970
|
}
|
|
1092
|
-
__name(createEventObservable, "createEventObservable");
|
|
1093
971
|
function createTerminator(worker) {
|
|
1094
972
|
const [termination, resolver] = createPromiseWithResolver();
|
|
1095
|
-
const terminate =
|
|
973
|
+
const terminate = async () => {
|
|
1096
974
|
debugThreadUtils("Terminating worker");
|
|
1097
975
|
await worker.terminate();
|
|
1098
976
|
resolver();
|
|
1099
|
-
}, "terminate");
|
|
1100
|
-
return {
|
|
1101
|
-
terminate,
|
|
1102
|
-
termination
|
|
1103
977
|
};
|
|
978
|
+
return { terminate, termination };
|
|
1104
979
|
}
|
|
1105
|
-
__name(createTerminator, "createTerminator");
|
|
1106
980
|
function setPrivateThreadProps(raw, worker, workerEvents, terminate) {
|
|
1107
|
-
const workerErrors = workerEvents.filter((event) => event.type ===
|
|
981
|
+
const workerErrors = workerEvents.filter((event) => event.type === "internalError" /* internalError */).map((errorEvent) => errorEvent.error);
|
|
1108
982
|
return Object.assign(raw, {
|
|
1109
983
|
[$errors]: workerErrors,
|
|
1110
984
|
[$events]: workerEvents,
|
|
@@ -1112,11 +986,14 @@ function setPrivateThreadProps(raw, worker, workerEvents, terminate) {
|
|
|
1112
986
|
[$worker]: worker
|
|
1113
987
|
});
|
|
1114
988
|
}
|
|
1115
|
-
__name(setPrivateThreadProps, "setPrivateThreadProps");
|
|
1116
989
|
async function spawn(worker, options) {
|
|
1117
990
|
debugSpawn("Initializing new thread");
|
|
1118
991
|
const timeout = options && options.timeout ? options.timeout : initMessageTimeout;
|
|
1119
|
-
const initMessage = await withTimeout(
|
|
992
|
+
const initMessage = await withTimeout(
|
|
993
|
+
receiveInitMessage(worker),
|
|
994
|
+
timeout,
|
|
995
|
+
`Timeout: Did not receive an init message from worker after ${timeout}ms. Make sure the worker calls expose().`
|
|
996
|
+
);
|
|
1120
997
|
const exposed = initMessage.exposed;
|
|
1121
998
|
const { termination, terminate } = createTerminator(worker);
|
|
1122
999
|
const events = createEventObservable(worker, termination);
|
|
@@ -1131,7 +1008,6 @@ async function spawn(worker, options) {
|
|
|
1131
1008
|
throw new Error(`Worker init message states unexpected type of expose(): ${type}`);
|
|
1132
1009
|
}
|
|
1133
1010
|
}
|
|
1134
|
-
__name(spawn, "spawn");
|
|
1135
1011
|
|
|
1136
1012
|
// src/master/index-node.ts
|
|
1137
1013
|
var BlobWorker = getWorkerImplementation().blob;
|