@ariestools/threads 8.2.0 → 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/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/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/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 +8 -8
|
@@ -92,17 +92,25 @@ import {
|
|
|
92
92
|
} from "observable-fns";
|
|
93
93
|
|
|
94
94
|
// src/master/pool-types.ts
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
95
|
+
import { Enum } from "@ariestools/sdk/enum";
|
|
96
|
+
var PoolEventType = Enum({
|
|
97
|
+
/** All workers in the pool have initialized. */
|
|
98
|
+
initialized: "initialized",
|
|
99
|
+
/** A queued task was canceled before execution. */
|
|
100
|
+
taskCanceled: "taskCanceled",
|
|
101
|
+
/** A task completed successfully. */
|
|
102
|
+
taskCompleted: "taskCompleted",
|
|
103
|
+
/** A task failed during execution. */
|
|
104
|
+
taskFailed: "taskFailed",
|
|
105
|
+
/** A task was added to the queue. */
|
|
106
|
+
taskQueued: "taskQueued",
|
|
107
|
+
/** The pool has no remaining queued tasks. */
|
|
108
|
+
taskQueueDrained: "taskQueueDrained",
|
|
109
|
+
/** A worker started executing a task. */
|
|
110
|
+
taskStart: "taskStart",
|
|
111
|
+
/** The pool and its workers were terminated. */
|
|
112
|
+
terminated: "terminated"
|
|
113
|
+
});
|
|
106
114
|
|
|
107
115
|
// src/symbols.ts
|
|
108
116
|
var $errors = /* @__PURE__ */ Symbol("thread.errors");
|
|
@@ -178,7 +186,7 @@ var WorkerPool = class {
|
|
|
178
186
|
await Promise.all(workers.map((worker) => worker.init));
|
|
179
187
|
this.eventSubject.next({
|
|
180
188
|
size: workers.length,
|
|
181
|
-
type:
|
|
189
|
+
type: PoolEventType.initialized
|
|
182
190
|
});
|
|
183
191
|
} catch (error) {
|
|
184
192
|
const initError = error instanceof Error ? error : new Error(String(error));
|
|
@@ -197,7 +205,7 @@ var WorkerPool = class {
|
|
|
197
205
|
this.debug(`Running task #${task.id} on worker #${workerID}...`);
|
|
198
206
|
this.eventSubject.next({
|
|
199
207
|
taskID: task.id,
|
|
200
|
-
type:
|
|
208
|
+
type: PoolEventType.taskStart,
|
|
201
209
|
workerID
|
|
202
210
|
});
|
|
203
211
|
try {
|
|
@@ -206,7 +214,7 @@ var WorkerPool = class {
|
|
|
206
214
|
this.eventSubject.next({
|
|
207
215
|
returnValue,
|
|
208
216
|
taskID: task.id,
|
|
209
|
-
type:
|
|
217
|
+
type: PoolEventType.taskCompleted,
|
|
210
218
|
workerID
|
|
211
219
|
});
|
|
212
220
|
} catch (ex) {
|
|
@@ -215,7 +223,7 @@ var WorkerPool = class {
|
|
|
215
223
|
this.eventSubject.next({
|
|
216
224
|
error,
|
|
217
225
|
taskID: task.id,
|
|
218
|
-
type:
|
|
226
|
+
type: PoolEventType.taskFailed,
|
|
219
227
|
workerID
|
|
220
228
|
});
|
|
221
229
|
}
|
|
@@ -244,7 +252,7 @@ var WorkerPool = class {
|
|
|
244
252
|
const nextTask = this.taskQueue.shift();
|
|
245
253
|
if (!nextTask) {
|
|
246
254
|
this.debug("Task queue is empty");
|
|
247
|
-
this.eventSubject.next({ type:
|
|
255
|
+
this.eventSubject.next({ type: PoolEventType.taskQueueDrained });
|
|
248
256
|
return;
|
|
249
257
|
}
|
|
250
258
|
this.run(availableWorker, nextTask);
|
|
@@ -252,13 +260,13 @@ var WorkerPool = class {
|
|
|
252
260
|
taskCompletion(taskID) {
|
|
253
261
|
return new Promise((resolve, reject) => {
|
|
254
262
|
const eventSubscription = this.events().subscribe((event) => {
|
|
255
|
-
if (event.type ===
|
|
263
|
+
if (event.type === PoolEventType.taskCompleted && event.taskID === taskID) {
|
|
256
264
|
eventSubscription.unsubscribe();
|
|
257
265
|
resolve(event.returnValue);
|
|
258
|
-
} else if (event.type ===
|
|
266
|
+
} else if (event.type === PoolEventType.taskFailed && event.taskID === taskID) {
|
|
259
267
|
eventSubscription.unsubscribe();
|
|
260
268
|
reject(event.error);
|
|
261
|
-
} else if (event.type ===
|
|
269
|
+
} else if (event.type === PoolEventType.terminated) {
|
|
262
270
|
eventSubscription.unsubscribe();
|
|
263
271
|
reject(new Error("Pool has been terminated before task was run."));
|
|
264
272
|
}
|
|
@@ -276,7 +284,7 @@ var WorkerPool = class {
|
|
|
276
284
|
const getCurrentlyRunningTasks = () => flatMap(this.workers, (worker) => worker.runningTasks);
|
|
277
285
|
const taskFailures = [];
|
|
278
286
|
const failureSubscription = this.eventObservable.subscribe((event) => {
|
|
279
|
-
if (event.type ===
|
|
287
|
+
if (event.type === PoolEventType.taskFailed) {
|
|
280
288
|
taskFailures.push(event.error);
|
|
281
289
|
}
|
|
282
290
|
});
|
|
@@ -284,7 +292,7 @@ var WorkerPool = class {
|
|
|
284
292
|
const subscription = this.eventObservable.subscribe({
|
|
285
293
|
error: reject,
|
|
286
294
|
next(event) {
|
|
287
|
-
if (event.type !==
|
|
295
|
+
if (event.type !== PoolEventType.taskQueueDrained) {
|
|
288
296
|
return;
|
|
289
297
|
}
|
|
290
298
|
subscription.unsubscribe();
|
|
@@ -303,10 +311,10 @@ var WorkerPool = class {
|
|
|
303
311
|
const subscription = this.eventObservable.subscribe({
|
|
304
312
|
error: reject,
|
|
305
313
|
next(event) {
|
|
306
|
-
if (event.type ===
|
|
314
|
+
if (event.type === PoolEventType.taskQueueDrained) {
|
|
307
315
|
subscription.unsubscribe();
|
|
308
316
|
resolve(settlementPromise);
|
|
309
|
-
} else if (event.type ===
|
|
317
|
+
} else if (event.type === PoolEventType.taskFailed) {
|
|
310
318
|
subscription.unsubscribe();
|
|
311
319
|
reject(event.error);
|
|
312
320
|
}
|
|
@@ -345,7 +353,7 @@ var WorkerPool = class {
|
|
|
345
353
|
this.taskQueue = this.taskQueue.filter((someTask) => someTask !== task);
|
|
346
354
|
this.eventSubject.next({
|
|
347
355
|
taskID: task.id,
|
|
348
|
-
type:
|
|
356
|
+
type: PoolEventType.taskCanceled
|
|
349
357
|
});
|
|
350
358
|
},
|
|
351
359
|
id: taskID,
|
|
@@ -361,7 +369,7 @@ var WorkerPool = class {
|
|
|
361
369
|
this.taskQueue.push(task);
|
|
362
370
|
this.eventSubject.next({
|
|
363
371
|
taskID: task.id,
|
|
364
|
-
type:
|
|
372
|
+
type: PoolEventType.taskQueued
|
|
365
373
|
});
|
|
366
374
|
this.scheduleWork();
|
|
367
375
|
return task;
|
|
@@ -373,7 +381,7 @@ var WorkerPool = class {
|
|
|
373
381
|
}
|
|
374
382
|
this.eventSubject.next({
|
|
375
383
|
remainingQueue: [...this.taskQueue],
|
|
376
|
-
type:
|
|
384
|
+
type: PoolEventType.terminated
|
|
377
385
|
});
|
|
378
386
|
this.eventSubject.complete();
|
|
379
387
|
await Promise.all(this.workers.map(async (worker) => Thread.terminate(await worker.init)));
|
|
@@ -441,6 +449,17 @@ function createPromiseWithResolver() {
|
|
|
441
449
|
return [promise, exposedResolver];
|
|
442
450
|
}
|
|
443
451
|
|
|
452
|
+
// src/types/master.ts
|
|
453
|
+
import { Enum as Enum2 } from "@ariestools/sdk/enum";
|
|
454
|
+
var WorkerEventType = Enum2({
|
|
455
|
+
/** The threads implementation encountered an internal error. */
|
|
456
|
+
internalError: "internalError",
|
|
457
|
+
/** The worker emitted a message. */
|
|
458
|
+
message: "message",
|
|
459
|
+
/** The worker terminated. */
|
|
460
|
+
termination: "termination"
|
|
461
|
+
});
|
|
462
|
+
|
|
444
463
|
// src/master/invocation-proxy.ts
|
|
445
464
|
import DebugLogger2 from "debug";
|
|
446
465
|
import { multicast as multicast2, Observable as Observable3 } from "observable-fns";
|
|
@@ -598,13 +617,34 @@ function isTransferDescriptor(thing) {
|
|
|
598
617
|
return thing != null && typeof thing === "object" && Reflect.get(thing, $transferable) === true;
|
|
599
618
|
}
|
|
600
619
|
|
|
620
|
+
// src/types/messages.ts
|
|
621
|
+
import { Enum as Enum3 } from "@ariestools/sdk/enum";
|
|
622
|
+
var MasterMessageType = Enum3({
|
|
623
|
+
/** Cancel a previously submitted job. */
|
|
624
|
+
cancel: "cancel",
|
|
625
|
+
/** Run a job in the worker. */
|
|
626
|
+
run: "run"
|
|
627
|
+
});
|
|
628
|
+
var WorkerMessageType = Enum3({
|
|
629
|
+
/** A job failed. */
|
|
630
|
+
error: "error",
|
|
631
|
+
/** The worker exposed its callable API. */
|
|
632
|
+
init: "init",
|
|
633
|
+
/** A job produced a result. */
|
|
634
|
+
result: "result",
|
|
635
|
+
/** A job started running. */
|
|
636
|
+
running: "running",
|
|
637
|
+
/** An error escaped the worker job handler. */
|
|
638
|
+
uncaughtError: "uncaughtError"
|
|
639
|
+
});
|
|
640
|
+
|
|
601
641
|
// src/master/invocation-proxy.ts
|
|
602
642
|
var debugMessages = DebugLogger2("threads:master:messages");
|
|
603
643
|
var nextJobUID = 1;
|
|
604
644
|
var dedupe = (array) => [...new Set(array)];
|
|
605
|
-
var isJobErrorMessage = (data) => data?.type ===
|
|
606
|
-
var isJobResultMessage = (data) => data?.type ===
|
|
607
|
-
var isJobStartMessage = (data) => data?.type ===
|
|
645
|
+
var isJobErrorMessage = (data) => data?.type === WorkerMessageType.error;
|
|
646
|
+
var isJobResultMessage = (data) => data?.type === WorkerMessageType.result;
|
|
647
|
+
var isJobStartMessage = (data) => data?.type === WorkerMessageType.running;
|
|
608
648
|
function createObservableForJob(worker, jobUID) {
|
|
609
649
|
return new Observable3((observer) => {
|
|
610
650
|
let asyncType;
|
|
@@ -643,7 +683,7 @@ function createObservableForJob(worker, jobUID) {
|
|
|
643
683
|
return () => {
|
|
644
684
|
if (asyncType === "observable" || asyncType === void 0) {
|
|
645
685
|
const cancelMessage = {
|
|
646
|
-
type:
|
|
686
|
+
type: MasterMessageType.cancel,
|
|
647
687
|
uid: jobUID
|
|
648
688
|
};
|
|
649
689
|
worker.postMessage(cancelMessage);
|
|
@@ -681,7 +721,7 @@ function createProxyFunction(worker, method) {
|
|
|
681
721
|
const runMessage = {
|
|
682
722
|
args,
|
|
683
723
|
method,
|
|
684
|
-
type:
|
|
724
|
+
type: MasterMessageType.run,
|
|
685
725
|
uid
|
|
686
726
|
};
|
|
687
727
|
debugMessages("Sending command to run function to worker:", runMessage);
|
|
@@ -738,7 +778,7 @@ function createEventObservable(worker, workerTermination) {
|
|
|
738
778
|
const messageHandler = ((messageEvent) => {
|
|
739
779
|
const workerEvent = {
|
|
740
780
|
data: messageEvent.data,
|
|
741
|
-
type:
|
|
781
|
+
type: WorkerEventType.message
|
|
742
782
|
};
|
|
743
783
|
observer.next(workerEvent);
|
|
744
784
|
});
|
|
@@ -746,7 +786,7 @@ function createEventObservable(worker, workerTermination) {
|
|
|
746
786
|
debugThreadUtils("Unhandled promise rejection event in thread:", errorEvent);
|
|
747
787
|
const workerEvent = {
|
|
748
788
|
error: new Error(errorEvent.reason),
|
|
749
|
-
type:
|
|
789
|
+
type: WorkerEventType.internalError
|
|
750
790
|
};
|
|
751
791
|
observer.next(workerEvent);
|
|
752
792
|
});
|
|
@@ -754,7 +794,7 @@ function createEventObservable(worker, workerTermination) {
|
|
|
754
794
|
worker.addEventListener("unhandledrejection", rejectionHandler);
|
|
755
795
|
void (async () => {
|
|
756
796
|
await workerTermination;
|
|
757
|
-
const terminationEvent = { type:
|
|
797
|
+
const terminationEvent = { type: WorkerEventType.termination };
|
|
758
798
|
worker.removeEventListener("message", messageHandler);
|
|
759
799
|
worker.removeEventListener("unhandledrejection", rejectionHandler);
|
|
760
800
|
observer.next(terminationEvent);
|
|
@@ -772,7 +812,7 @@ function createTerminator(worker) {
|
|
|
772
812
|
return { terminate, termination };
|
|
773
813
|
}
|
|
774
814
|
function setPrivateThreadProps(raw, worker, workerEvents, terminate) {
|
|
775
|
-
const workerErrors = workerEvents.filter((event) => event.type ===
|
|
815
|
+
const workerErrors = workerEvents.filter((event) => event.type === WorkerEventType.internalError).map((errorEvent) => errorEvent.error);
|
|
776
816
|
const result = raw;
|
|
777
817
|
const privateProps = [
|
|
778
818
|
[$errors, { enumerable: false, value: workerErrors }],
|