@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
|
@@ -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 Worker = function() {
|
|
54
44
|
function Worker2(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, Worker2);
|
|
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(Worker2, [{
|
|
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
|
-
return true;
|
|
156
|
-
}, "setRange")
|
|
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");
|
|
157
121
|
}
|
|
158
|
-
]
|
|
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;
|
|
131
|
+
}
|
|
132
|
+
}]);
|
|
159
133
|
return Worker2;
|
|
160
134
|
}();
|
|
161
135
|
module.exports = Worker;
|
|
@@ -164,7 +138,11 @@ var require_lib = __commonJS({
|
|
|
164
138
|
|
|
165
139
|
// src/master/pool-node.ts
|
|
166
140
|
import DebugLogger from "debug";
|
|
167
|
-
import {
|
|
141
|
+
import {
|
|
142
|
+
multicast,
|
|
143
|
+
Observable,
|
|
144
|
+
Subject
|
|
145
|
+
} from "observable-fns";
|
|
168
146
|
|
|
169
147
|
// src/master/implementation.node.ts
|
|
170
148
|
import { EventEmitter } from "events";
|
|
@@ -174,19 +152,15 @@ import { cwd } from "process";
|
|
|
174
152
|
import { Worker as NativeWorker } from "worker_threads";
|
|
175
153
|
var defaultPoolSize = cpus().length;
|
|
176
154
|
function resolveScriptPath(scriptPath, baseURL) {
|
|
177
|
-
const makeAbsolute =
|
|
155
|
+
const makeAbsolute = (filePath) => {
|
|
178
156
|
return path.isAbsolute(filePath) ? filePath : path.join(baseURL ?? cwd(), filePath);
|
|
179
|
-
}
|
|
157
|
+
};
|
|
180
158
|
const absolutePath = makeAbsolute(scriptPath);
|
|
181
159
|
return absolutePath;
|
|
182
160
|
}
|
|
183
|
-
__name(resolveScriptPath, "resolveScriptPath");
|
|
184
161
|
function initWorkerThreadsWorker() {
|
|
185
162
|
let allWorkers = [];
|
|
186
|
-
|
|
187
|
-
static {
|
|
188
|
-
__name(this, "Worker");
|
|
189
|
-
}
|
|
163
|
+
class Worker extends NativeWorker {
|
|
190
164
|
mappedEventListeners;
|
|
191
165
|
constructor(scriptPath, options) {
|
|
192
166
|
const resolvedScriptPath = options && options.fromSource ? null : resolveScriptPath(scriptPath, (options ?? {})._baseURL);
|
|
@@ -194,20 +168,15 @@ function initWorkerThreadsWorker() {
|
|
|
194
168
|
super(resolvedScriptPath, options);
|
|
195
169
|
} else {
|
|
196
170
|
const sourceCode = scriptPath;
|
|
197
|
-
super(sourceCode, {
|
|
198
|
-
...options,
|
|
199
|
-
eval: true
|
|
200
|
-
});
|
|
171
|
+
super(sourceCode, { ...options, eval: true });
|
|
201
172
|
}
|
|
202
173
|
this.mappedEventListeners = /* @__PURE__ */ new WeakMap();
|
|
203
174
|
allWorkers.push(this);
|
|
204
175
|
}
|
|
205
176
|
addEventListener(eventName, rawListener) {
|
|
206
|
-
const listener =
|
|
207
|
-
rawListener({
|
|
208
|
-
|
|
209
|
-
});
|
|
210
|
-
}, "listener");
|
|
177
|
+
const listener = (message) => {
|
|
178
|
+
rawListener({ data: message });
|
|
179
|
+
};
|
|
211
180
|
this.mappedEventListeners.set(rawListener, listener);
|
|
212
181
|
this.on(eventName, listener);
|
|
213
182
|
}
|
|
@@ -215,55 +184,41 @@ function initWorkerThreadsWorker() {
|
|
|
215
184
|
const listener = this.mappedEventListeners.get(rawListener) || rawListener;
|
|
216
185
|
this.off(eventName, listener);
|
|
217
186
|
}
|
|
218
|
-
}
|
|
219
|
-
const terminateWorkersAndMaster =
|
|
220
|
-
Promise.all(allWorkers.map((worker) => worker.terminate())).then(
|
|
187
|
+
}
|
|
188
|
+
const terminateWorkersAndMaster = () => {
|
|
189
|
+
Promise.all(allWorkers.map((worker) => worker.terminate())).then(
|
|
190
|
+
() => process.exit(0),
|
|
191
|
+
() => process.exit(1)
|
|
192
|
+
);
|
|
221
193
|
allWorkers = [];
|
|
222
|
-
}
|
|
194
|
+
};
|
|
223
195
|
process.on("SIGINT", () => terminateWorkersAndMaster());
|
|
224
196
|
process.on("SIGTERM", () => terminateWorkersAndMaster());
|
|
225
|
-
|
|
226
|
-
static {
|
|
227
|
-
__name(this, "BlobWorker");
|
|
228
|
-
}
|
|
197
|
+
class BlobWorker extends Worker {
|
|
229
198
|
constructor(blob, options) {
|
|
230
|
-
super(Buffer.from(blob).toString("utf-8"), {
|
|
231
|
-
...options,
|
|
232
|
-
fromSource: true
|
|
233
|
-
});
|
|
199
|
+
super(Buffer.from(blob).toString("utf-8"), { ...options, fromSource: true });
|
|
234
200
|
}
|
|
235
201
|
static fromText(source, options) {
|
|
236
|
-
return new Worker(source, {
|
|
237
|
-
...options,
|
|
238
|
-
fromSource: true
|
|
239
|
-
});
|
|
202
|
+
return new Worker(source, { ...options, fromSource: true });
|
|
240
203
|
}
|
|
241
|
-
}
|
|
204
|
+
}
|
|
242
205
|
return {
|
|
243
206
|
blob: BlobWorker,
|
|
244
207
|
default: Worker
|
|
245
208
|
};
|
|
246
209
|
}
|
|
247
|
-
__name(initWorkerThreadsWorker, "initWorkerThreadsWorker");
|
|
248
210
|
function initTinyWorker() {
|
|
249
211
|
const TinyWorker = require_lib();
|
|
250
212
|
let allWorkers = [];
|
|
251
|
-
|
|
252
|
-
static {
|
|
253
|
-
__name(this, "Worker");
|
|
254
|
-
}
|
|
213
|
+
class Worker extends TinyWorker {
|
|
255
214
|
emitter;
|
|
256
215
|
constructor(scriptPath, options) {
|
|
257
216
|
const resolvedScriptPath = options && options.fromSource ? null : process.platform === "win32" ? `file:///${resolveScriptPath(scriptPath).replaceAll("\\", "/")}` : resolveScriptPath(scriptPath);
|
|
258
217
|
if (resolvedScriptPath) {
|
|
259
|
-
super(resolvedScriptPath, [], {
|
|
260
|
-
esm: true
|
|
261
|
-
});
|
|
218
|
+
super(resolvedScriptPath, [], { esm: true });
|
|
262
219
|
} else {
|
|
263
220
|
const sourceCode = scriptPath;
|
|
264
|
-
super(new Function(sourceCode), [], {
|
|
265
|
-
esm: true
|
|
266
|
-
});
|
|
221
|
+
super(new Function(sourceCode), [], { esm: true });
|
|
267
222
|
}
|
|
268
223
|
allWorkers.push(this);
|
|
269
224
|
this.emitter = new EventEmitter();
|
|
@@ -280,36 +235,29 @@ function initTinyWorker() {
|
|
|
280
235
|
allWorkers = allWorkers.filter((worker) => worker !== this);
|
|
281
236
|
return super.terminate();
|
|
282
237
|
}
|
|
283
|
-
}
|
|
284
|
-
const terminateWorkersAndMaster =
|
|
285
|
-
Promise.all(allWorkers.map((worker) => worker.terminate())).then(
|
|
238
|
+
}
|
|
239
|
+
const terminateWorkersAndMaster = () => {
|
|
240
|
+
Promise.all(allWorkers.map((worker) => worker.terminate())).then(
|
|
241
|
+
() => process.exit(0),
|
|
242
|
+
() => process.exit(1)
|
|
243
|
+
);
|
|
286
244
|
allWorkers = [];
|
|
287
|
-
}
|
|
245
|
+
};
|
|
288
246
|
process.on("SIGINT", () => terminateWorkersAndMaster());
|
|
289
247
|
process.on("SIGTERM", () => terminateWorkersAndMaster());
|
|
290
|
-
|
|
291
|
-
static {
|
|
292
|
-
__name(this, "BlobWorker");
|
|
293
|
-
}
|
|
248
|
+
class BlobWorker extends Worker {
|
|
294
249
|
constructor(blob, options) {
|
|
295
|
-
super(Buffer.from(blob).toString("utf-8"), {
|
|
296
|
-
...options,
|
|
297
|
-
fromSource: true
|
|
298
|
-
});
|
|
250
|
+
super(Buffer.from(blob).toString("utf-8"), { ...options, fromSource: true });
|
|
299
251
|
}
|
|
300
252
|
static fromText(source, options) {
|
|
301
|
-
return new Worker(source, {
|
|
302
|
-
...options,
|
|
303
|
-
fromSource: true
|
|
304
|
-
});
|
|
253
|
+
return new Worker(source, { ...options, fromSource: true });
|
|
305
254
|
}
|
|
306
|
-
}
|
|
255
|
+
}
|
|
307
256
|
return {
|
|
308
257
|
blob: BlobWorker,
|
|
309
258
|
default: Worker
|
|
310
259
|
};
|
|
311
260
|
}
|
|
312
|
-
__name(initTinyWorker, "initTinyWorker");
|
|
313
261
|
var implementation;
|
|
314
262
|
var isTinyWorker;
|
|
315
263
|
function selectWorkerImplementation() {
|
|
@@ -323,14 +271,12 @@ function selectWorkerImplementation() {
|
|
|
323
271
|
return initTinyWorker();
|
|
324
272
|
}
|
|
325
273
|
}
|
|
326
|
-
__name(selectWorkerImplementation, "selectWorkerImplementation");
|
|
327
274
|
function getWorkerImplementation() {
|
|
328
275
|
if (!implementation) {
|
|
329
276
|
implementation = selectWorkerImplementation();
|
|
330
277
|
}
|
|
331
278
|
return implementation;
|
|
332
279
|
}
|
|
333
|
-
__name(getWorkerImplementation, "getWorkerImplementation");
|
|
334
280
|
function isWorkerRuntime() {
|
|
335
281
|
if (isTinyWorker) {
|
|
336
282
|
return globalThis !== void 0 && self["postMessage"] ? true : false;
|
|
@@ -339,10 +285,9 @@ function isWorkerRuntime() {
|
|
|
339
285
|
return !isMainThread;
|
|
340
286
|
}
|
|
341
287
|
}
|
|
342
|
-
__name(isWorkerRuntime, "isWorkerRuntime");
|
|
343
288
|
|
|
344
289
|
// src/master/pool-types.ts
|
|
345
|
-
var PoolEventType = /* @__PURE__ */
|
|
290
|
+
var PoolEventType = /* @__PURE__ */ ((PoolEventType2) => {
|
|
346
291
|
PoolEventType2["initialized"] = "initialized";
|
|
347
292
|
PoolEventType2["taskCanceled"] = "taskCanceled";
|
|
348
293
|
PoolEventType2["taskCompleted"] = "taskCompleted";
|
|
@@ -352,7 +297,7 @@ var PoolEventType = /* @__PURE__ */ function(PoolEventType2) {
|
|
|
352
297
|
PoolEventType2["taskStart"] = "taskStart";
|
|
353
298
|
PoolEventType2["terminated"] = "terminated";
|
|
354
299
|
return PoolEventType2;
|
|
355
|
-
}({});
|
|
300
|
+
})(PoolEventType || {});
|
|
356
301
|
|
|
357
302
|
// src/symbols.ts
|
|
358
303
|
var $errors = Symbol("thread.errors");
|
|
@@ -365,7 +310,6 @@ var $worker = Symbol("thread.worker");
|
|
|
365
310
|
function fail(message) {
|
|
366
311
|
throw new Error(message);
|
|
367
312
|
}
|
|
368
|
-
__name(fail, "fail");
|
|
369
313
|
var Thread = {
|
|
370
314
|
/** Return an observable that can be used to subscribe to all errors happening in the thread. */
|
|
371
315
|
errors(thread) {
|
|
@@ -390,33 +334,24 @@ function createArray(size) {
|
|
|
390
334
|
}
|
|
391
335
|
return array;
|
|
392
336
|
}
|
|
393
|
-
__name(createArray, "createArray");
|
|
394
337
|
function delay(ms) {
|
|
395
338
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
396
339
|
}
|
|
397
|
-
__name(delay, "delay");
|
|
398
340
|
function flatMap(array, mapper) {
|
|
399
|
-
return array.reduce((flattened, element) => [
|
|
400
|
-
...flattened,
|
|
401
|
-
...mapper(element)
|
|
402
|
-
], []);
|
|
341
|
+
return array.reduce((flattened, element) => [...flattened, ...mapper(element)], []);
|
|
403
342
|
}
|
|
404
|
-
__name(flatMap, "flatMap");
|
|
405
343
|
function slugify(text) {
|
|
406
344
|
return text.replaceAll(/\W/g, " ").trim().replaceAll(/\s+/g, "-");
|
|
407
345
|
}
|
|
408
|
-
__name(slugify, "slugify");
|
|
409
346
|
function spawnWorkers(spawnWorker, count) {
|
|
410
|
-
return createArray(count).map(
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
347
|
+
return createArray(count).map(
|
|
348
|
+
() => ({
|
|
349
|
+
init: spawnWorker(),
|
|
350
|
+
runningTasks: []
|
|
351
|
+
})
|
|
352
|
+
);
|
|
414
353
|
}
|
|
415
|
-
|
|
416
|
-
var WorkerPool = class WorkerPool2 {
|
|
417
|
-
static {
|
|
418
|
-
__name(this, "WorkerPool");
|
|
419
|
-
}
|
|
354
|
+
var WorkerPool = class {
|
|
420
355
|
static EventType = PoolEventType;
|
|
421
356
|
debug;
|
|
422
357
|
eventObservable;
|
|
@@ -428,22 +363,23 @@ var WorkerPool = class WorkerPool2 {
|
|
|
428
363
|
nextTaskID = 1;
|
|
429
364
|
taskQueue = [];
|
|
430
365
|
constructor(spawnWorker, optionsOrSize) {
|
|
431
|
-
const options = typeof optionsOrSize === "number" ? {
|
|
432
|
-
size: optionsOrSize
|
|
433
|
-
} : optionsOrSize || {};
|
|
366
|
+
const options = typeof optionsOrSize === "number" ? { size: optionsOrSize } : optionsOrSize || {};
|
|
434
367
|
const { size = defaultPoolSize } = options;
|
|
435
368
|
this.debug = DebugLogger(`threads:pool:${slugify(options.name || String(nextPoolID++))}`);
|
|
436
369
|
this.options = options;
|
|
437
370
|
this.workers = spawnWorkers(spawnWorker, size);
|
|
438
371
|
this.eventObservable = multicast(Observable.from(this.eventSubject));
|
|
439
|
-
Promise.all(this.workers.map((worker) => worker.init)).then(
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
372
|
+
Promise.all(this.workers.map((worker) => worker.init)).then(
|
|
373
|
+
() => this.eventSubject.next({
|
|
374
|
+
size: this.workers.length,
|
|
375
|
+
type: "initialized" /* initialized */
|
|
376
|
+
}),
|
|
377
|
+
(error) => {
|
|
378
|
+
this.debug("Error while initializing pool worker:", error);
|
|
379
|
+
this.eventSubject.error(error);
|
|
380
|
+
this.initErrors.push(error);
|
|
381
|
+
}
|
|
382
|
+
);
|
|
447
383
|
}
|
|
448
384
|
findIdlingWorker() {
|
|
449
385
|
const { concurrency = 1 } = this.options;
|
|
@@ -454,7 +390,7 @@ var WorkerPool = class WorkerPool2 {
|
|
|
454
390
|
this.debug(`Running task #${task.id} on worker #${workerID}...`);
|
|
455
391
|
this.eventSubject.next({
|
|
456
392
|
taskID: task.id,
|
|
457
|
-
type:
|
|
393
|
+
type: "taskStart" /* taskStart */,
|
|
458
394
|
workerID
|
|
459
395
|
});
|
|
460
396
|
try {
|
|
@@ -463,7 +399,7 @@ var WorkerPool = class WorkerPool2 {
|
|
|
463
399
|
this.eventSubject.next({
|
|
464
400
|
returnValue,
|
|
465
401
|
taskID: task.id,
|
|
466
|
-
type:
|
|
402
|
+
type: "taskCompleted" /* taskCompleted */,
|
|
467
403
|
workerID
|
|
468
404
|
});
|
|
469
405
|
} catch (ex) {
|
|
@@ -472,16 +408,16 @@ var WorkerPool = class WorkerPool2 {
|
|
|
472
408
|
this.eventSubject.next({
|
|
473
409
|
error,
|
|
474
410
|
taskID: task.id,
|
|
475
|
-
type:
|
|
411
|
+
type: "taskFailed" /* taskFailed */,
|
|
476
412
|
workerID
|
|
477
413
|
});
|
|
478
414
|
}
|
|
479
415
|
}
|
|
480
416
|
run(worker, task) {
|
|
481
417
|
const runPromise = (async () => {
|
|
482
|
-
const removeTaskFromWorkersRunningTasks =
|
|
418
|
+
const removeTaskFromWorkersRunningTasks = () => {
|
|
483
419
|
worker.runningTasks = worker.runningTasks.filter((someRunPromise) => someRunPromise !== runPromise);
|
|
484
|
-
}
|
|
420
|
+
};
|
|
485
421
|
await delay(0);
|
|
486
422
|
try {
|
|
487
423
|
await this.runPoolTask(worker, task);
|
|
@@ -501,9 +437,7 @@ var WorkerPool = class WorkerPool2 {
|
|
|
501
437
|
const nextTask = this.taskQueue.shift();
|
|
502
438
|
if (!nextTask) {
|
|
503
439
|
this.debug("Task queue is empty");
|
|
504
|
-
this.eventSubject.next({
|
|
505
|
-
type: PoolEventType.taskQueueDrained
|
|
506
|
-
});
|
|
440
|
+
this.eventSubject.next({ type: "taskQueueDrained" /* taskQueueDrained */ });
|
|
507
441
|
return;
|
|
508
442
|
}
|
|
509
443
|
this.run(availableWorker, nextTask);
|
|
@@ -511,13 +445,13 @@ var WorkerPool = class WorkerPool2 {
|
|
|
511
445
|
taskCompletion(taskID) {
|
|
512
446
|
return new Promise((resolve, reject) => {
|
|
513
447
|
const eventSubscription = this.events().subscribe((event) => {
|
|
514
|
-
if (event.type ===
|
|
448
|
+
if (event.type === "taskCompleted" /* taskCompleted */ && event.taskID === taskID) {
|
|
515
449
|
eventSubscription.unsubscribe();
|
|
516
450
|
resolve(event.returnValue);
|
|
517
|
-
} else if (event.type ===
|
|
451
|
+
} else if (event.type === "taskFailed" /* taskFailed */ && event.taskID === taskID) {
|
|
518
452
|
eventSubscription.unsubscribe();
|
|
519
453
|
reject(event.error);
|
|
520
|
-
} else if (event.type ===
|
|
454
|
+
} else if (event.type === "terminated" /* terminated */) {
|
|
521
455
|
eventSubscription.unsubscribe();
|
|
522
456
|
reject(new Error("Pool has been terminated before task was run."));
|
|
523
457
|
}
|
|
@@ -525,10 +459,10 @@ var WorkerPool = class WorkerPool2 {
|
|
|
525
459
|
});
|
|
526
460
|
}
|
|
527
461
|
async settled(allowResolvingImmediately = false) {
|
|
528
|
-
const getCurrentlyRunningTasks =
|
|
462
|
+
const getCurrentlyRunningTasks = () => flatMap(this.workers, (worker) => worker.runningTasks);
|
|
529
463
|
const taskFailures = [];
|
|
530
464
|
const failureSubscription = this.eventObservable.subscribe((event) => {
|
|
531
|
-
if (event.type ===
|
|
465
|
+
if (event.type === "taskFailed" /* taskFailed */) {
|
|
532
466
|
taskFailures.push(event.error);
|
|
533
467
|
}
|
|
534
468
|
});
|
|
@@ -543,11 +477,12 @@ var WorkerPool = class WorkerPool2 {
|
|
|
543
477
|
const subscription = this.eventObservable.subscribe({
|
|
544
478
|
error: reject,
|
|
545
479
|
next(event) {
|
|
546
|
-
if (event.type ===
|
|
480
|
+
if (event.type === "taskQueueDrained" /* taskQueueDrained */) {
|
|
547
481
|
subscription.unsubscribe();
|
|
548
482
|
resolve(void 0);
|
|
549
483
|
}
|
|
550
484
|
}
|
|
485
|
+
// make a pool-wide error reject the completed() result promise
|
|
551
486
|
});
|
|
552
487
|
});
|
|
553
488
|
await Promise.allSettled(getCurrentlyRunningTasks());
|
|
@@ -560,20 +495,18 @@ var WorkerPool = class WorkerPool2 {
|
|
|
560
495
|
const subscription = this.eventObservable.subscribe({
|
|
561
496
|
error: reject,
|
|
562
497
|
next(event) {
|
|
563
|
-
if (event.type ===
|
|
498
|
+
if (event.type === "taskQueueDrained" /* taskQueueDrained */) {
|
|
564
499
|
subscription.unsubscribe();
|
|
565
500
|
resolve(settlementPromise);
|
|
566
|
-
} else if (event.type ===
|
|
501
|
+
} else if (event.type === "taskFailed" /* taskFailed */) {
|
|
567
502
|
subscription.unsubscribe();
|
|
568
503
|
reject(event.error);
|
|
569
504
|
}
|
|
570
505
|
}
|
|
506
|
+
// make a pool-wide error reject the completed() result promise
|
|
571
507
|
});
|
|
572
508
|
});
|
|
573
|
-
const errors = await Promise.race([
|
|
574
|
-
settlementPromise,
|
|
575
|
-
earlyExitPromise
|
|
576
|
-
]);
|
|
509
|
+
const errors = await Promise.race([settlementPromise, earlyExitPromise]);
|
|
577
510
|
if (errors.length > 0) {
|
|
578
511
|
throw errors[0];
|
|
579
512
|
}
|
|
@@ -595,26 +528,28 @@ var WorkerPool = class WorkerPool2 {
|
|
|
595
528
|
this.debug(`Task #${taskID} errored:`, error);
|
|
596
529
|
});
|
|
597
530
|
const task = {
|
|
598
|
-
cancel:
|
|
531
|
+
cancel: () => {
|
|
599
532
|
if (!this.taskQueue.includes(task)) return;
|
|
600
533
|
this.taskQueue = this.taskQueue.filter((someTask) => someTask !== task);
|
|
601
534
|
this.eventSubject.next({
|
|
602
535
|
taskID: task.id,
|
|
603
|
-
type:
|
|
536
|
+
type: "taskCanceled" /* taskCanceled */
|
|
604
537
|
});
|
|
605
|
-
},
|
|
538
|
+
},
|
|
606
539
|
id: taskID,
|
|
607
540
|
run: taskFunction,
|
|
608
541
|
then: taskCompletion.then.bind(taskCompletion)
|
|
609
542
|
};
|
|
610
543
|
if (this.taskQueue.length >= maxQueuedJobs) {
|
|
611
|
-
throw new Error(
|
|
544
|
+
throw new Error(
|
|
545
|
+
"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."
|
|
546
|
+
);
|
|
612
547
|
}
|
|
613
548
|
this.debug(`Queueing task #${task.id}...`);
|
|
614
549
|
this.taskQueue.push(task);
|
|
615
550
|
this.eventSubject.next({
|
|
616
551
|
taskID: task.id,
|
|
617
|
-
type:
|
|
552
|
+
type: "taskQueued" /* taskQueued */
|
|
618
553
|
});
|
|
619
554
|
this.scheduleWork();
|
|
620
555
|
return task;
|
|
@@ -625,10 +560,8 @@ var WorkerPool = class WorkerPool2 {
|
|
|
625
560
|
await this.completed(true);
|
|
626
561
|
}
|
|
627
562
|
this.eventSubject.next({
|
|
628
|
-
remainingQueue: [
|
|
629
|
-
|
|
630
|
-
],
|
|
631
|
-
type: PoolEventType.terminated
|
|
563
|
+
remainingQueue: [...this.taskQueue],
|
|
564
|
+
type: "terminated" /* terminated */
|
|
632
565
|
});
|
|
633
566
|
this.eventSubject.complete();
|
|
634
567
|
await Promise.all(this.workers.map(async (worker) => Thread.terminate(await worker.init)));
|
|
@@ -637,7 +570,6 @@ var WorkerPool = class WorkerPool2 {
|
|
|
637
570
|
function PoolConstructor(spawnWorker, optionsOrSize) {
|
|
638
571
|
return new WorkerPool(spawnWorker, optionsOrSize);
|
|
639
572
|
}
|
|
640
|
-
__name(PoolConstructor, "PoolConstructor");
|
|
641
573
|
PoolConstructor.EventType = PoolEventType;
|
|
642
574
|
var Pool = PoolConstructor;
|
|
643
575
|
export {
|