@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
package/dist/node/index-node.mjs
CHANGED
|
@@ -154,17 +154,25 @@ import {
|
|
|
154
154
|
var defaultPoolSize2 = typeof navigator !== "undefined" && navigator.hardwareConcurrency !== 0 ? navigator.hardwareConcurrency : 4;
|
|
155
155
|
|
|
156
156
|
// src/master/pool-types.ts
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
157
|
+
import { Enum } from "@ariestools/sdk/enum";
|
|
158
|
+
var PoolEventType = Enum({
|
|
159
|
+
/** All workers in the pool have initialized. */
|
|
160
|
+
initialized: "initialized",
|
|
161
|
+
/** A queued task was canceled before execution. */
|
|
162
|
+
taskCanceled: "taskCanceled",
|
|
163
|
+
/** A task completed successfully. */
|
|
164
|
+
taskCompleted: "taskCompleted",
|
|
165
|
+
/** A task failed during execution. */
|
|
166
|
+
taskFailed: "taskFailed",
|
|
167
|
+
/** A task was added to the queue. */
|
|
168
|
+
taskQueued: "taskQueued",
|
|
169
|
+
/** The pool has no remaining queued tasks. */
|
|
170
|
+
taskQueueDrained: "taskQueueDrained",
|
|
171
|
+
/** A worker started executing a task. */
|
|
172
|
+
taskStart: "taskStart",
|
|
173
|
+
/** The pool and its workers were terminated. */
|
|
174
|
+
terminated: "terminated"
|
|
175
|
+
});
|
|
168
176
|
|
|
169
177
|
// src/symbols.ts
|
|
170
178
|
var $errors = /* @__PURE__ */ Symbol("thread.errors");
|
|
@@ -240,7 +248,7 @@ var WorkerPool = class {
|
|
|
240
248
|
await Promise.all(workers.map((worker) => worker.init));
|
|
241
249
|
this.eventSubject.next({
|
|
242
250
|
size: workers.length,
|
|
243
|
-
type:
|
|
251
|
+
type: PoolEventType.initialized
|
|
244
252
|
});
|
|
245
253
|
} catch (error) {
|
|
246
254
|
const initError = error instanceof Error ? error : new Error(String(error));
|
|
@@ -259,7 +267,7 @@ var WorkerPool = class {
|
|
|
259
267
|
this.debug(`Running task #${task.id} on worker #${workerID}...`);
|
|
260
268
|
this.eventSubject.next({
|
|
261
269
|
taskID: task.id,
|
|
262
|
-
type:
|
|
270
|
+
type: PoolEventType.taskStart,
|
|
263
271
|
workerID
|
|
264
272
|
});
|
|
265
273
|
try {
|
|
@@ -268,7 +276,7 @@ var WorkerPool = class {
|
|
|
268
276
|
this.eventSubject.next({
|
|
269
277
|
returnValue,
|
|
270
278
|
taskID: task.id,
|
|
271
|
-
type:
|
|
279
|
+
type: PoolEventType.taskCompleted,
|
|
272
280
|
workerID
|
|
273
281
|
});
|
|
274
282
|
} catch (ex) {
|
|
@@ -277,7 +285,7 @@ var WorkerPool = class {
|
|
|
277
285
|
this.eventSubject.next({
|
|
278
286
|
error,
|
|
279
287
|
taskID: task.id,
|
|
280
|
-
type:
|
|
288
|
+
type: PoolEventType.taskFailed,
|
|
281
289
|
workerID
|
|
282
290
|
});
|
|
283
291
|
}
|
|
@@ -306,7 +314,7 @@ var WorkerPool = class {
|
|
|
306
314
|
const nextTask = this.taskQueue.shift();
|
|
307
315
|
if (!nextTask) {
|
|
308
316
|
this.debug("Task queue is empty");
|
|
309
|
-
this.eventSubject.next({ type:
|
|
317
|
+
this.eventSubject.next({ type: PoolEventType.taskQueueDrained });
|
|
310
318
|
return;
|
|
311
319
|
}
|
|
312
320
|
this.run(availableWorker, nextTask);
|
|
@@ -314,13 +322,13 @@ var WorkerPool = class {
|
|
|
314
322
|
taskCompletion(taskID) {
|
|
315
323
|
return new Promise((resolve, reject) => {
|
|
316
324
|
const eventSubscription = this.events().subscribe((event) => {
|
|
317
|
-
if (event.type ===
|
|
325
|
+
if (event.type === PoolEventType.taskCompleted && event.taskID === taskID) {
|
|
318
326
|
eventSubscription.unsubscribe();
|
|
319
327
|
resolve(event.returnValue);
|
|
320
|
-
} else if (event.type ===
|
|
328
|
+
} else if (event.type === PoolEventType.taskFailed && event.taskID === taskID) {
|
|
321
329
|
eventSubscription.unsubscribe();
|
|
322
330
|
reject(event.error);
|
|
323
|
-
} else if (event.type ===
|
|
331
|
+
} else if (event.type === PoolEventType.terminated) {
|
|
324
332
|
eventSubscription.unsubscribe();
|
|
325
333
|
reject(new Error("Pool has been terminated before task was run."));
|
|
326
334
|
}
|
|
@@ -338,7 +346,7 @@ var WorkerPool = class {
|
|
|
338
346
|
const getCurrentlyRunningTasks = () => flatMap(this.workers, (worker) => worker.runningTasks);
|
|
339
347
|
const taskFailures = [];
|
|
340
348
|
const failureSubscription = this.eventObservable.subscribe((event) => {
|
|
341
|
-
if (event.type ===
|
|
349
|
+
if (event.type === PoolEventType.taskFailed) {
|
|
342
350
|
taskFailures.push(event.error);
|
|
343
351
|
}
|
|
344
352
|
});
|
|
@@ -346,7 +354,7 @@ var WorkerPool = class {
|
|
|
346
354
|
const subscription = this.eventObservable.subscribe({
|
|
347
355
|
error: reject,
|
|
348
356
|
next(event) {
|
|
349
|
-
if (event.type !==
|
|
357
|
+
if (event.type !== PoolEventType.taskQueueDrained) {
|
|
350
358
|
return;
|
|
351
359
|
}
|
|
352
360
|
subscription.unsubscribe();
|
|
@@ -365,10 +373,10 @@ var WorkerPool = class {
|
|
|
365
373
|
const subscription = this.eventObservable.subscribe({
|
|
366
374
|
error: reject,
|
|
367
375
|
next(event) {
|
|
368
|
-
if (event.type ===
|
|
376
|
+
if (event.type === PoolEventType.taskQueueDrained) {
|
|
369
377
|
subscription.unsubscribe();
|
|
370
378
|
resolve(settlementPromise);
|
|
371
|
-
} else if (event.type ===
|
|
379
|
+
} else if (event.type === PoolEventType.taskFailed) {
|
|
372
380
|
subscription.unsubscribe();
|
|
373
381
|
reject(event.error);
|
|
374
382
|
}
|
|
@@ -407,7 +415,7 @@ var WorkerPool = class {
|
|
|
407
415
|
this.taskQueue = this.taskQueue.filter((someTask) => someTask !== task);
|
|
408
416
|
this.eventSubject.next({
|
|
409
417
|
taskID: task.id,
|
|
410
|
-
type:
|
|
418
|
+
type: PoolEventType.taskCanceled
|
|
411
419
|
});
|
|
412
420
|
},
|
|
413
421
|
id: taskID,
|
|
@@ -423,7 +431,7 @@ var WorkerPool = class {
|
|
|
423
431
|
this.taskQueue.push(task);
|
|
424
432
|
this.eventSubject.next({
|
|
425
433
|
taskID: task.id,
|
|
426
|
-
type:
|
|
434
|
+
type: PoolEventType.taskQueued
|
|
427
435
|
});
|
|
428
436
|
this.scheduleWork();
|
|
429
437
|
return task;
|
|
@@ -435,7 +443,7 @@ var WorkerPool = class {
|
|
|
435
443
|
}
|
|
436
444
|
this.eventSubject.next({
|
|
437
445
|
remainingQueue: [...this.taskQueue],
|
|
438
|
-
type:
|
|
446
|
+
type: PoolEventType.terminated
|
|
439
447
|
});
|
|
440
448
|
this.eventSubject.complete();
|
|
441
449
|
await Promise.all(this.workers.map(async (worker) => Thread.terminate(await worker.init)));
|
|
@@ -472,6 +480,17 @@ function createPromiseWithResolver() {
|
|
|
472
480
|
return [promise, exposedResolver];
|
|
473
481
|
}
|
|
474
482
|
|
|
483
|
+
// src/types/master.ts
|
|
484
|
+
import { Enum as Enum2 } from "@ariestools/sdk/enum";
|
|
485
|
+
var WorkerEventType = Enum2({
|
|
486
|
+
/** The threads implementation encountered an internal error. */
|
|
487
|
+
internalError: "internalError",
|
|
488
|
+
/** The worker emitted a message. */
|
|
489
|
+
message: "message",
|
|
490
|
+
/** The worker terminated. */
|
|
491
|
+
termination: "termination"
|
|
492
|
+
});
|
|
493
|
+
|
|
475
494
|
// src/master/invocation-proxy.ts
|
|
476
495
|
import DebugLogger2 from "debug";
|
|
477
496
|
import { multicast as multicast2, Observable as Observable3 } from "observable-fns";
|
|
@@ -646,13 +665,34 @@ function Transfer(payload, transferables) {
|
|
|
646
665
|
return descriptor;
|
|
647
666
|
}
|
|
648
667
|
|
|
668
|
+
// src/types/messages.ts
|
|
669
|
+
import { Enum as Enum3 } from "@ariestools/sdk/enum";
|
|
670
|
+
var MasterMessageType = Enum3({
|
|
671
|
+
/** Cancel a previously submitted job. */
|
|
672
|
+
cancel: "cancel",
|
|
673
|
+
/** Run a job in the worker. */
|
|
674
|
+
run: "run"
|
|
675
|
+
});
|
|
676
|
+
var WorkerMessageType = Enum3({
|
|
677
|
+
/** A job failed. */
|
|
678
|
+
error: "error",
|
|
679
|
+
/** The worker exposed its callable API. */
|
|
680
|
+
init: "init",
|
|
681
|
+
/** A job produced a result. */
|
|
682
|
+
result: "result",
|
|
683
|
+
/** A job started running. */
|
|
684
|
+
running: "running",
|
|
685
|
+
/** An error escaped the worker job handler. */
|
|
686
|
+
uncaughtError: "uncaughtError"
|
|
687
|
+
});
|
|
688
|
+
|
|
649
689
|
// src/master/invocation-proxy.ts
|
|
650
690
|
var debugMessages = DebugLogger2("threads:master:messages");
|
|
651
691
|
var nextJobUID = 1;
|
|
652
692
|
var dedupe = (array) => [...new Set(array)];
|
|
653
|
-
var isJobErrorMessage = (data) => data?.type ===
|
|
654
|
-
var isJobResultMessage = (data) => data?.type ===
|
|
655
|
-
var isJobStartMessage = (data) => data?.type ===
|
|
693
|
+
var isJobErrorMessage = (data) => data?.type === WorkerMessageType.error;
|
|
694
|
+
var isJobResultMessage = (data) => data?.type === WorkerMessageType.result;
|
|
695
|
+
var isJobStartMessage = (data) => data?.type === WorkerMessageType.running;
|
|
656
696
|
function createObservableForJob(worker, jobUID) {
|
|
657
697
|
return new Observable3((observer) => {
|
|
658
698
|
let asyncType;
|
|
@@ -691,7 +731,7 @@ function createObservableForJob(worker, jobUID) {
|
|
|
691
731
|
return () => {
|
|
692
732
|
if (asyncType === "observable" || asyncType === void 0) {
|
|
693
733
|
const cancelMessage = {
|
|
694
|
-
type:
|
|
734
|
+
type: MasterMessageType.cancel,
|
|
695
735
|
uid: jobUID
|
|
696
736
|
};
|
|
697
737
|
worker.postMessage(cancelMessage);
|
|
@@ -729,7 +769,7 @@ function createProxyFunction(worker, method) {
|
|
|
729
769
|
const runMessage = {
|
|
730
770
|
args,
|
|
731
771
|
method,
|
|
732
|
-
type:
|
|
772
|
+
type: MasterMessageType.run,
|
|
733
773
|
uid
|
|
734
774
|
};
|
|
735
775
|
debugMessages("Sending command to run function to worker:", runMessage);
|
|
@@ -786,7 +826,7 @@ function createEventObservable(worker, workerTermination) {
|
|
|
786
826
|
const messageHandler = ((messageEvent) => {
|
|
787
827
|
const workerEvent = {
|
|
788
828
|
data: messageEvent.data,
|
|
789
|
-
type:
|
|
829
|
+
type: WorkerEventType.message
|
|
790
830
|
};
|
|
791
831
|
observer.next(workerEvent);
|
|
792
832
|
});
|
|
@@ -794,7 +834,7 @@ function createEventObservable(worker, workerTermination) {
|
|
|
794
834
|
debugThreadUtils("Unhandled promise rejection event in thread:", errorEvent);
|
|
795
835
|
const workerEvent = {
|
|
796
836
|
error: new Error(errorEvent.reason),
|
|
797
|
-
type:
|
|
837
|
+
type: WorkerEventType.internalError
|
|
798
838
|
};
|
|
799
839
|
observer.next(workerEvent);
|
|
800
840
|
});
|
|
@@ -802,7 +842,7 @@ function createEventObservable(worker, workerTermination) {
|
|
|
802
842
|
worker.addEventListener("unhandledrejection", rejectionHandler);
|
|
803
843
|
void (async () => {
|
|
804
844
|
await workerTermination;
|
|
805
|
-
const terminationEvent = { type:
|
|
845
|
+
const terminationEvent = { type: WorkerEventType.termination };
|
|
806
846
|
worker.removeEventListener("message", messageHandler);
|
|
807
847
|
worker.removeEventListener("unhandledrejection", rejectionHandler);
|
|
808
848
|
observer.next(terminationEvent);
|
|
@@ -820,7 +860,7 @@ function createTerminator(worker) {
|
|
|
820
860
|
return { terminate, termination };
|
|
821
861
|
}
|
|
822
862
|
function setPrivateThreadProps(raw, worker, workerEvents, terminate) {
|
|
823
|
-
const workerErrors = workerEvents.filter((event) => event.type ===
|
|
863
|
+
const workerErrors = workerEvents.filter((event) => event.type === WorkerEventType.internalError).map((errorEvent) => errorEvent.error);
|
|
824
864
|
const result = raw;
|
|
825
865
|
const privateProps = [
|
|
826
866
|
[$errors, { enumerable: false, value: workerErrors }],
|