@ariestools/threads 8.1.9 → 8.3.0
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/README.md +4 -0
- package/dist/browser/common.d.ts +8 -1
- package/dist/browser/common.d.ts.map +1 -1
- package/dist/browser/index-browser.mjs +75 -35
- package/dist/browser/index-browser.mjs.map +4 -4
- package/dist/browser/master/index-browser.mjs +75 -35
- package/dist/browser/master/index-browser.mjs.map +4 -4
- package/dist/browser/master/pool-browser.d.ts +10 -1
- package/dist/browser/master/pool-browser.d.ts.map +1 -1
- package/dist/browser/master/pool-browser.mjs +34 -26
- package/dist/browser/master/pool-browser.mjs.map +3 -3
- package/dist/browser/master/pool-node.d.ts +10 -1
- package/dist/browser/master/pool-node.d.ts.map +1 -1
- package/dist/browser/master/pool-types.d.ts +21 -26
- package/dist/browser/master/pool-types.d.ts.map +1 -1
- package/dist/browser/types/master.d.ts +11 -11
- package/dist/browser/types/master.d.ts.map +1 -1
- package/dist/browser/types/messages.d.ts +23 -25
- package/dist/browser/types/messages.d.ts.map +1 -1
- package/dist/browser/worker/worker.browser.mjs +29 -8
- package/dist/browser/worker/worker.browser.mjs.map +3 -3
- package/dist/neutral/common.d.ts +8 -1
- package/dist/neutral/common.d.ts.map +1 -1
- package/dist/neutral/master/pool-browser.d.ts +10 -1
- package/dist/neutral/master/pool-browser.d.ts.map +1 -1
- package/dist/neutral/master/pool-node.d.ts +10 -1
- package/dist/neutral/master/pool-node.d.ts.map +1 -1
- package/dist/neutral/master/pool-types.d.ts +21 -26
- package/dist/neutral/master/pool-types.d.ts.map +1 -1
- package/dist/neutral/master/spawn.mjs +41 -9
- package/dist/neutral/master/spawn.mjs.map +4 -4
- package/dist/neutral/types/master.d.ts +11 -11
- package/dist/neutral/types/master.d.ts.map +1 -1
- package/dist/neutral/types/messages.d.ts +23 -25
- package/dist/neutral/types/messages.d.ts.map +1 -1
- package/dist/neutral/types/messages.mjs +19 -13
- package/dist/neutral/types/messages.mjs.map +3 -3
- package/dist/node/common.d.ts +8 -1
- package/dist/node/common.d.ts.map +1 -1
- package/dist/node/index-node.mjs +75 -35
- package/dist/node/index-node.mjs.map +4 -4
- package/dist/node/master/index-node.mjs +75 -35
- package/dist/node/master/index-node.mjs.map +4 -4
- package/dist/node/master/pool-browser.d.ts +10 -1
- package/dist/node/master/pool-browser.d.ts.map +1 -1
- package/dist/node/master/pool-node.d.ts +10 -1
- package/dist/node/master/pool-node.d.ts.map +1 -1
- package/dist/node/master/pool-node.mjs +34 -26
- package/dist/node/master/pool-node.mjs.map +3 -3
- package/dist/node/master/pool-types.d.ts +21 -26
- package/dist/node/master/pool-types.d.ts.map +1 -1
- package/dist/node/types/master.d.ts +11 -11
- package/dist/node/types/master.d.ts.map +1 -1
- package/dist/node/types/messages.d.ts +23 -25
- package/dist/node/types/messages.d.ts.map +1 -1
- package/dist/node/worker/worker.node.mjs +29 -8
- package/dist/node/worker/worker.node.mjs.map +3 -3
- package/package.json +9 -9
|
@@ -112,17 +112,25 @@ import {
|
|
|
112
112
|
var defaultPoolSize2 = typeof navigator !== "undefined" && navigator.hardwareConcurrency !== 0 ? navigator.hardwareConcurrency : 4;
|
|
113
113
|
|
|
114
114
|
// src/master/pool-types.ts
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
115
|
+
import { Enum } from "@ariestools/sdk/enum";
|
|
116
|
+
var PoolEventType = Enum({
|
|
117
|
+
/** All workers in the pool have initialized. */
|
|
118
|
+
initialized: "initialized",
|
|
119
|
+
/** A queued task was canceled before execution. */
|
|
120
|
+
taskCanceled: "taskCanceled",
|
|
121
|
+
/** A task completed successfully. */
|
|
122
|
+
taskCompleted: "taskCompleted",
|
|
123
|
+
/** A task failed during execution. */
|
|
124
|
+
taskFailed: "taskFailed",
|
|
125
|
+
/** A task was added to the queue. */
|
|
126
|
+
taskQueued: "taskQueued",
|
|
127
|
+
/** The pool has no remaining queued tasks. */
|
|
128
|
+
taskQueueDrained: "taskQueueDrained",
|
|
129
|
+
/** A worker started executing a task. */
|
|
130
|
+
taskStart: "taskStart",
|
|
131
|
+
/** The pool and its workers were terminated. */
|
|
132
|
+
terminated: "terminated"
|
|
133
|
+
});
|
|
126
134
|
|
|
127
135
|
// src/symbols.ts
|
|
128
136
|
var $errors = /* @__PURE__ */ Symbol("thread.errors");
|
|
@@ -198,7 +206,7 @@ var WorkerPool = class {
|
|
|
198
206
|
await Promise.all(workers.map((worker) => worker.init));
|
|
199
207
|
this.eventSubject.next({
|
|
200
208
|
size: workers.length,
|
|
201
|
-
type:
|
|
209
|
+
type: PoolEventType.initialized
|
|
202
210
|
});
|
|
203
211
|
} catch (error) {
|
|
204
212
|
const initError = error instanceof Error ? error : new Error(String(error));
|
|
@@ -217,7 +225,7 @@ var WorkerPool = class {
|
|
|
217
225
|
this.debug(`Running task #${task.id} on worker #${workerID}...`);
|
|
218
226
|
this.eventSubject.next({
|
|
219
227
|
taskID: task.id,
|
|
220
|
-
type:
|
|
228
|
+
type: PoolEventType.taskStart,
|
|
221
229
|
workerID
|
|
222
230
|
});
|
|
223
231
|
try {
|
|
@@ -226,7 +234,7 @@ var WorkerPool = class {
|
|
|
226
234
|
this.eventSubject.next({
|
|
227
235
|
returnValue,
|
|
228
236
|
taskID: task.id,
|
|
229
|
-
type:
|
|
237
|
+
type: PoolEventType.taskCompleted,
|
|
230
238
|
workerID
|
|
231
239
|
});
|
|
232
240
|
} catch (ex) {
|
|
@@ -235,7 +243,7 @@ var WorkerPool = class {
|
|
|
235
243
|
this.eventSubject.next({
|
|
236
244
|
error,
|
|
237
245
|
taskID: task.id,
|
|
238
|
-
type:
|
|
246
|
+
type: PoolEventType.taskFailed,
|
|
239
247
|
workerID
|
|
240
248
|
});
|
|
241
249
|
}
|
|
@@ -264,7 +272,7 @@ var WorkerPool = class {
|
|
|
264
272
|
const nextTask = this.taskQueue.shift();
|
|
265
273
|
if (!nextTask) {
|
|
266
274
|
this.debug("Task queue is empty");
|
|
267
|
-
this.eventSubject.next({ type:
|
|
275
|
+
this.eventSubject.next({ type: PoolEventType.taskQueueDrained });
|
|
268
276
|
return;
|
|
269
277
|
}
|
|
270
278
|
this.run(availableWorker, nextTask);
|
|
@@ -272,13 +280,13 @@ var WorkerPool = class {
|
|
|
272
280
|
taskCompletion(taskID) {
|
|
273
281
|
return new Promise((resolve, reject) => {
|
|
274
282
|
const eventSubscription = this.events().subscribe((event) => {
|
|
275
|
-
if (event.type ===
|
|
283
|
+
if (event.type === PoolEventType.taskCompleted && event.taskID === taskID) {
|
|
276
284
|
eventSubscription.unsubscribe();
|
|
277
285
|
resolve(event.returnValue);
|
|
278
|
-
} else if (event.type ===
|
|
286
|
+
} else if (event.type === PoolEventType.taskFailed && event.taskID === taskID) {
|
|
279
287
|
eventSubscription.unsubscribe();
|
|
280
288
|
reject(event.error);
|
|
281
|
-
} else if (event.type ===
|
|
289
|
+
} else if (event.type === PoolEventType.terminated) {
|
|
282
290
|
eventSubscription.unsubscribe();
|
|
283
291
|
reject(new Error("Pool has been terminated before task was run."));
|
|
284
292
|
}
|
|
@@ -296,7 +304,7 @@ var WorkerPool = class {
|
|
|
296
304
|
const getCurrentlyRunningTasks = () => flatMap(this.workers, (worker) => worker.runningTasks);
|
|
297
305
|
const taskFailures = [];
|
|
298
306
|
const failureSubscription = this.eventObservable.subscribe((event) => {
|
|
299
|
-
if (event.type ===
|
|
307
|
+
if (event.type === PoolEventType.taskFailed) {
|
|
300
308
|
taskFailures.push(event.error);
|
|
301
309
|
}
|
|
302
310
|
});
|
|
@@ -304,7 +312,7 @@ var WorkerPool = class {
|
|
|
304
312
|
const subscription = this.eventObservable.subscribe({
|
|
305
313
|
error: reject,
|
|
306
314
|
next(event) {
|
|
307
|
-
if (event.type !==
|
|
315
|
+
if (event.type !== PoolEventType.taskQueueDrained) {
|
|
308
316
|
return;
|
|
309
317
|
}
|
|
310
318
|
subscription.unsubscribe();
|
|
@@ -323,10 +331,10 @@ var WorkerPool = class {
|
|
|
323
331
|
const subscription = this.eventObservable.subscribe({
|
|
324
332
|
error: reject,
|
|
325
333
|
next(event) {
|
|
326
|
-
if (event.type ===
|
|
334
|
+
if (event.type === PoolEventType.taskQueueDrained) {
|
|
327
335
|
subscription.unsubscribe();
|
|
328
336
|
resolve(settlementPromise);
|
|
329
|
-
} else if (event.type ===
|
|
337
|
+
} else if (event.type === PoolEventType.taskFailed) {
|
|
330
338
|
subscription.unsubscribe();
|
|
331
339
|
reject(event.error);
|
|
332
340
|
}
|
|
@@ -365,7 +373,7 @@ var WorkerPool = class {
|
|
|
365
373
|
this.taskQueue = this.taskQueue.filter((someTask) => someTask !== task);
|
|
366
374
|
this.eventSubject.next({
|
|
367
375
|
taskID: task.id,
|
|
368
|
-
type:
|
|
376
|
+
type: PoolEventType.taskCanceled
|
|
369
377
|
});
|
|
370
378
|
},
|
|
371
379
|
id: taskID,
|
|
@@ -381,7 +389,7 @@ var WorkerPool = class {
|
|
|
381
389
|
this.taskQueue.push(task);
|
|
382
390
|
this.eventSubject.next({
|
|
383
391
|
taskID: task.id,
|
|
384
|
-
type:
|
|
392
|
+
type: PoolEventType.taskQueued
|
|
385
393
|
});
|
|
386
394
|
this.scheduleWork();
|
|
387
395
|
return task;
|
|
@@ -393,7 +401,7 @@ var WorkerPool = class {
|
|
|
393
401
|
}
|
|
394
402
|
this.eventSubject.next({
|
|
395
403
|
remainingQueue: [...this.taskQueue],
|
|
396
|
-
type:
|
|
404
|
+
type: PoolEventType.terminated
|
|
397
405
|
});
|
|
398
406
|
this.eventSubject.complete();
|
|
399
407
|
await Promise.all(this.workers.map(async (worker) => Thread.terminate(await worker.init)));
|
|
@@ -461,6 +469,17 @@ function createPromiseWithResolver() {
|
|
|
461
469
|
return [promise, exposedResolver];
|
|
462
470
|
}
|
|
463
471
|
|
|
472
|
+
// src/types/master.ts
|
|
473
|
+
import { Enum as Enum2 } from "@ariestools/sdk/enum";
|
|
474
|
+
var WorkerEventType = Enum2({
|
|
475
|
+
/** The threads implementation encountered an internal error. */
|
|
476
|
+
internalError: "internalError",
|
|
477
|
+
/** The worker emitted a message. */
|
|
478
|
+
message: "message",
|
|
479
|
+
/** The worker terminated. */
|
|
480
|
+
termination: "termination"
|
|
481
|
+
});
|
|
482
|
+
|
|
464
483
|
// src/master/invocation-proxy.ts
|
|
465
484
|
import DebugLogger2 from "debug";
|
|
466
485
|
import { multicast as multicast2, Observable as Observable3 } from "observable-fns";
|
|
@@ -618,13 +637,34 @@ function isTransferDescriptor(thing) {
|
|
|
618
637
|
return thing != null && typeof thing === "object" && Reflect.get(thing, $transferable) === true;
|
|
619
638
|
}
|
|
620
639
|
|
|
640
|
+
// src/types/messages.ts
|
|
641
|
+
import { Enum as Enum3 } from "@ariestools/sdk/enum";
|
|
642
|
+
var MasterMessageType = Enum3({
|
|
643
|
+
/** Cancel a previously submitted job. */
|
|
644
|
+
cancel: "cancel",
|
|
645
|
+
/** Run a job in the worker. */
|
|
646
|
+
run: "run"
|
|
647
|
+
});
|
|
648
|
+
var WorkerMessageType = Enum3({
|
|
649
|
+
/** A job failed. */
|
|
650
|
+
error: "error",
|
|
651
|
+
/** The worker exposed its callable API. */
|
|
652
|
+
init: "init",
|
|
653
|
+
/** A job produced a result. */
|
|
654
|
+
result: "result",
|
|
655
|
+
/** A job started running. */
|
|
656
|
+
running: "running",
|
|
657
|
+
/** An error escaped the worker job handler. */
|
|
658
|
+
uncaughtError: "uncaughtError"
|
|
659
|
+
});
|
|
660
|
+
|
|
621
661
|
// src/master/invocation-proxy.ts
|
|
622
662
|
var debugMessages = DebugLogger2("threads:master:messages");
|
|
623
663
|
var nextJobUID = 1;
|
|
624
664
|
var dedupe = (array) => [...new Set(array)];
|
|
625
|
-
var isJobErrorMessage = (data) => data?.type ===
|
|
626
|
-
var isJobResultMessage = (data) => data?.type ===
|
|
627
|
-
var isJobStartMessage = (data) => data?.type ===
|
|
665
|
+
var isJobErrorMessage = (data) => data?.type === WorkerMessageType.error;
|
|
666
|
+
var isJobResultMessage = (data) => data?.type === WorkerMessageType.result;
|
|
667
|
+
var isJobStartMessage = (data) => data?.type === WorkerMessageType.running;
|
|
628
668
|
function createObservableForJob(worker, jobUID) {
|
|
629
669
|
return new Observable3((observer) => {
|
|
630
670
|
let asyncType;
|
|
@@ -663,7 +703,7 @@ function createObservableForJob(worker, jobUID) {
|
|
|
663
703
|
return () => {
|
|
664
704
|
if (asyncType === "observable" || asyncType === void 0) {
|
|
665
705
|
const cancelMessage = {
|
|
666
|
-
type:
|
|
706
|
+
type: MasterMessageType.cancel,
|
|
667
707
|
uid: jobUID
|
|
668
708
|
};
|
|
669
709
|
worker.postMessage(cancelMessage);
|
|
@@ -701,7 +741,7 @@ function createProxyFunction(worker, method) {
|
|
|
701
741
|
const runMessage = {
|
|
702
742
|
args,
|
|
703
743
|
method,
|
|
704
|
-
type:
|
|
744
|
+
type: MasterMessageType.run,
|
|
705
745
|
uid
|
|
706
746
|
};
|
|
707
747
|
debugMessages("Sending command to run function to worker:", runMessage);
|
|
@@ -758,7 +798,7 @@ function createEventObservable(worker, workerTermination) {
|
|
|
758
798
|
const messageHandler = ((messageEvent) => {
|
|
759
799
|
const workerEvent = {
|
|
760
800
|
data: messageEvent.data,
|
|
761
|
-
type:
|
|
801
|
+
type: WorkerEventType.message
|
|
762
802
|
};
|
|
763
803
|
observer.next(workerEvent);
|
|
764
804
|
});
|
|
@@ -766,7 +806,7 @@ function createEventObservable(worker, workerTermination) {
|
|
|
766
806
|
debugThreadUtils("Unhandled promise rejection event in thread:", errorEvent);
|
|
767
807
|
const workerEvent = {
|
|
768
808
|
error: new Error(errorEvent.reason),
|
|
769
|
-
type:
|
|
809
|
+
type: WorkerEventType.internalError
|
|
770
810
|
};
|
|
771
811
|
observer.next(workerEvent);
|
|
772
812
|
});
|
|
@@ -774,7 +814,7 @@ function createEventObservable(worker, workerTermination) {
|
|
|
774
814
|
worker.addEventListener("unhandledrejection", rejectionHandler);
|
|
775
815
|
void (async () => {
|
|
776
816
|
await workerTermination;
|
|
777
|
-
const terminationEvent = { type:
|
|
817
|
+
const terminationEvent = { type: WorkerEventType.termination };
|
|
778
818
|
worker.removeEventListener("message", messageHandler);
|
|
779
819
|
worker.removeEventListener("unhandledrejection", rejectionHandler);
|
|
780
820
|
observer.next(terminationEvent);
|
|
@@ -792,7 +832,7 @@ function createTerminator(worker) {
|
|
|
792
832
|
return { terminate, termination };
|
|
793
833
|
}
|
|
794
834
|
function setPrivateThreadProps(raw, worker, workerEvents, terminate) {
|
|
795
|
-
const workerErrors = workerEvents.filter((event) => event.type ===
|
|
835
|
+
const workerErrors = workerEvents.filter((event) => event.type === WorkerEventType.internalError).map((errorEvent) => errorEvent.error);
|
|
796
836
|
const result = raw;
|
|
797
837
|
const privateProps = [
|
|
798
838
|
[$errors, { enumerable: false, value: workerErrors }],
|