@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
package/README.md
CHANGED
|
@@ -7,6 +7,10 @@
|
|
|
7
7
|
|
|
8
8
|
> Web workers & worker threads as simple as a function call
|
|
9
9
|
|
|
10
|
+
> Internal status: public-only package with zero consumers inside this monorepo.
|
|
11
|
+
> The `dead.package.internal` / `dead.repo.internal` ignores and coverage excludes
|
|
12
|
+
> for this package are intentional.
|
|
13
|
+
|
|
10
14
|
## Install
|
|
11
15
|
|
|
12
16
|
Using npm:
|
package/dist/browser/common.d.ts
CHANGED
|
@@ -6,17 +6,24 @@ declare global {
|
|
|
6
6
|
* Register a custom serializer to extend the default serialization behavior for worker messages.
|
|
7
7
|
* @param serializer - The serializer implementation to register.
|
|
8
8
|
*/
|
|
9
|
+
/** Register a custom serializer to extend the default serialization behavior for worker messages.
|
|
10
|
+
* @param serializer - The serializer implementation to register.
|
|
11
|
+
*/
|
|
9
12
|
export declare function registerSerializer(serializer: SerializerImplementation<JsonSerializable>): void;
|
|
10
13
|
/**
|
|
11
14
|
* Deserialize a message using the registered serializer.
|
|
12
15
|
* @param message - The serialized message to deserialize.
|
|
13
16
|
* @returns The deserialized value.
|
|
14
17
|
*/
|
|
15
|
-
export declare function deserialize(message: JsonSerializable):
|
|
18
|
+
export declare function deserialize(message: JsonSerializable): unknown;
|
|
16
19
|
/**
|
|
17
20
|
* Serialize an input value using the registered serializer.
|
|
18
21
|
* @param input - The value to serialize.
|
|
19
22
|
* @returns The serialized message.
|
|
20
23
|
*/
|
|
24
|
+
/** Serialize an input value using the registered serializer.
|
|
25
|
+
* @param input - The value to serialize.
|
|
26
|
+
* @returns The serialized message.
|
|
27
|
+
*/
|
|
21
28
|
export declare function serialize(input: any): JsonSerializable;
|
|
22
29
|
//# sourceMappingURL=common.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/common.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAAE,UAAU,EAAE,wBAAwB,EACvD,MAAM,kBAAkB,CAAA;AAGzB,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,oBAAoB,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAA;CACvD;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,wBAAwB,CAAC,gBAAgB,CAAC,QAExF;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/common.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAAE,UAAU,EAAE,wBAAwB,EACvD,MAAM,kBAAkB,CAAA;AAGzB,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,oBAAoB,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAA;CACvD;AAID;;;GAGG;AACH;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,wBAAwB,CAAC,gBAAgB,CAAC,QAExF;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAE9D;AAED;;;;GAIG;AACH;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,gBAAgB,CAEtD"}
|
|
@@ -134,17 +134,25 @@ import {
|
|
|
134
134
|
} from "observable-fns";
|
|
135
135
|
|
|
136
136
|
// src/master/pool-types.ts
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
137
|
+
import { Enum } from "@ariestools/sdk/enum";
|
|
138
|
+
var PoolEventType = Enum({
|
|
139
|
+
/** All workers in the pool have initialized. */
|
|
140
|
+
initialized: "initialized",
|
|
141
|
+
/** A queued task was canceled before execution. */
|
|
142
|
+
taskCanceled: "taskCanceled",
|
|
143
|
+
/** A task completed successfully. */
|
|
144
|
+
taskCompleted: "taskCompleted",
|
|
145
|
+
/** A task failed during execution. */
|
|
146
|
+
taskFailed: "taskFailed",
|
|
147
|
+
/** A task was added to the queue. */
|
|
148
|
+
taskQueued: "taskQueued",
|
|
149
|
+
/** The pool has no remaining queued tasks. */
|
|
150
|
+
taskQueueDrained: "taskQueueDrained",
|
|
151
|
+
/** A worker started executing a task. */
|
|
152
|
+
taskStart: "taskStart",
|
|
153
|
+
/** The pool and its workers were terminated. */
|
|
154
|
+
terminated: "terminated"
|
|
155
|
+
});
|
|
148
156
|
|
|
149
157
|
// src/symbols.ts
|
|
150
158
|
var $errors = /* @__PURE__ */ Symbol("thread.errors");
|
|
@@ -220,7 +228,7 @@ var WorkerPool = class {
|
|
|
220
228
|
await Promise.all(workers.map((worker) => worker.init));
|
|
221
229
|
this.eventSubject.next({
|
|
222
230
|
size: workers.length,
|
|
223
|
-
type:
|
|
231
|
+
type: PoolEventType.initialized
|
|
224
232
|
});
|
|
225
233
|
} catch (error) {
|
|
226
234
|
const initError = error instanceof Error ? error : new Error(String(error));
|
|
@@ -239,7 +247,7 @@ var WorkerPool = class {
|
|
|
239
247
|
this.debug(`Running task #${task.id} on worker #${workerID}...`);
|
|
240
248
|
this.eventSubject.next({
|
|
241
249
|
taskID: task.id,
|
|
242
|
-
type:
|
|
250
|
+
type: PoolEventType.taskStart,
|
|
243
251
|
workerID
|
|
244
252
|
});
|
|
245
253
|
try {
|
|
@@ -248,7 +256,7 @@ var WorkerPool = class {
|
|
|
248
256
|
this.eventSubject.next({
|
|
249
257
|
returnValue,
|
|
250
258
|
taskID: task.id,
|
|
251
|
-
type:
|
|
259
|
+
type: PoolEventType.taskCompleted,
|
|
252
260
|
workerID
|
|
253
261
|
});
|
|
254
262
|
} catch (ex) {
|
|
@@ -257,7 +265,7 @@ var WorkerPool = class {
|
|
|
257
265
|
this.eventSubject.next({
|
|
258
266
|
error,
|
|
259
267
|
taskID: task.id,
|
|
260
|
-
type:
|
|
268
|
+
type: PoolEventType.taskFailed,
|
|
261
269
|
workerID
|
|
262
270
|
});
|
|
263
271
|
}
|
|
@@ -286,7 +294,7 @@ var WorkerPool = class {
|
|
|
286
294
|
const nextTask = this.taskQueue.shift();
|
|
287
295
|
if (!nextTask) {
|
|
288
296
|
this.debug("Task queue is empty");
|
|
289
|
-
this.eventSubject.next({ type:
|
|
297
|
+
this.eventSubject.next({ type: PoolEventType.taskQueueDrained });
|
|
290
298
|
return;
|
|
291
299
|
}
|
|
292
300
|
this.run(availableWorker, nextTask);
|
|
@@ -294,13 +302,13 @@ var WorkerPool = class {
|
|
|
294
302
|
taskCompletion(taskID) {
|
|
295
303
|
return new Promise((resolve, reject) => {
|
|
296
304
|
const eventSubscription = this.events().subscribe((event) => {
|
|
297
|
-
if (event.type ===
|
|
305
|
+
if (event.type === PoolEventType.taskCompleted && event.taskID === taskID) {
|
|
298
306
|
eventSubscription.unsubscribe();
|
|
299
307
|
resolve(event.returnValue);
|
|
300
|
-
} else if (event.type ===
|
|
308
|
+
} else if (event.type === PoolEventType.taskFailed && event.taskID === taskID) {
|
|
301
309
|
eventSubscription.unsubscribe();
|
|
302
310
|
reject(event.error);
|
|
303
|
-
} else if (event.type ===
|
|
311
|
+
} else if (event.type === PoolEventType.terminated) {
|
|
304
312
|
eventSubscription.unsubscribe();
|
|
305
313
|
reject(new Error("Pool has been terminated before task was run."));
|
|
306
314
|
}
|
|
@@ -318,7 +326,7 @@ var WorkerPool = class {
|
|
|
318
326
|
const getCurrentlyRunningTasks = () => flatMap(this.workers, (worker) => worker.runningTasks);
|
|
319
327
|
const taskFailures = [];
|
|
320
328
|
const failureSubscription = this.eventObservable.subscribe((event) => {
|
|
321
|
-
if (event.type ===
|
|
329
|
+
if (event.type === PoolEventType.taskFailed) {
|
|
322
330
|
taskFailures.push(event.error);
|
|
323
331
|
}
|
|
324
332
|
});
|
|
@@ -326,7 +334,7 @@ var WorkerPool = class {
|
|
|
326
334
|
const subscription = this.eventObservable.subscribe({
|
|
327
335
|
error: reject,
|
|
328
336
|
next(event) {
|
|
329
|
-
if (event.type !==
|
|
337
|
+
if (event.type !== PoolEventType.taskQueueDrained) {
|
|
330
338
|
return;
|
|
331
339
|
}
|
|
332
340
|
subscription.unsubscribe();
|
|
@@ -345,10 +353,10 @@ var WorkerPool = class {
|
|
|
345
353
|
const subscription = this.eventObservable.subscribe({
|
|
346
354
|
error: reject,
|
|
347
355
|
next(event) {
|
|
348
|
-
if (event.type ===
|
|
356
|
+
if (event.type === PoolEventType.taskQueueDrained) {
|
|
349
357
|
subscription.unsubscribe();
|
|
350
358
|
resolve(settlementPromise);
|
|
351
|
-
} else if (event.type ===
|
|
359
|
+
} else if (event.type === PoolEventType.taskFailed) {
|
|
352
360
|
subscription.unsubscribe();
|
|
353
361
|
reject(event.error);
|
|
354
362
|
}
|
|
@@ -387,7 +395,7 @@ var WorkerPool = class {
|
|
|
387
395
|
this.taskQueue = this.taskQueue.filter((someTask) => someTask !== task);
|
|
388
396
|
this.eventSubject.next({
|
|
389
397
|
taskID: task.id,
|
|
390
|
-
type:
|
|
398
|
+
type: PoolEventType.taskCanceled
|
|
391
399
|
});
|
|
392
400
|
},
|
|
393
401
|
id: taskID,
|
|
@@ -403,7 +411,7 @@ var WorkerPool = class {
|
|
|
403
411
|
this.taskQueue.push(task);
|
|
404
412
|
this.eventSubject.next({
|
|
405
413
|
taskID: task.id,
|
|
406
|
-
type:
|
|
414
|
+
type: PoolEventType.taskQueued
|
|
407
415
|
});
|
|
408
416
|
this.scheduleWork();
|
|
409
417
|
return task;
|
|
@@ -415,7 +423,7 @@ var WorkerPool = class {
|
|
|
415
423
|
}
|
|
416
424
|
this.eventSubject.next({
|
|
417
425
|
remainingQueue: [...this.taskQueue],
|
|
418
|
-
type:
|
|
426
|
+
type: PoolEventType.terminated
|
|
419
427
|
});
|
|
420
428
|
this.eventSubject.complete();
|
|
421
429
|
await Promise.all(this.workers.map(async (worker) => Thread.terminate(await worker.init)));
|
|
@@ -452,6 +460,17 @@ function createPromiseWithResolver() {
|
|
|
452
460
|
return [promise, exposedResolver];
|
|
453
461
|
}
|
|
454
462
|
|
|
463
|
+
// src/types/master.ts
|
|
464
|
+
import { Enum as Enum2 } from "@ariestools/sdk/enum";
|
|
465
|
+
var WorkerEventType = Enum2({
|
|
466
|
+
/** The threads implementation encountered an internal error. */
|
|
467
|
+
internalError: "internalError",
|
|
468
|
+
/** The worker emitted a message. */
|
|
469
|
+
message: "message",
|
|
470
|
+
/** The worker terminated. */
|
|
471
|
+
termination: "termination"
|
|
472
|
+
});
|
|
473
|
+
|
|
455
474
|
// src/master/invocation-proxy.ts
|
|
456
475
|
import DebugLogger2 from "debug";
|
|
457
476
|
import { multicast as multicast2, Observable as Observable3 } from "observable-fns";
|
|
@@ -626,13 +645,34 @@ function Transfer(payload, transferables) {
|
|
|
626
645
|
return descriptor;
|
|
627
646
|
}
|
|
628
647
|
|
|
648
|
+
// src/types/messages.ts
|
|
649
|
+
import { Enum as Enum3 } from "@ariestools/sdk/enum";
|
|
650
|
+
var MasterMessageType = Enum3({
|
|
651
|
+
/** Cancel a previously submitted job. */
|
|
652
|
+
cancel: "cancel",
|
|
653
|
+
/** Run a job in the worker. */
|
|
654
|
+
run: "run"
|
|
655
|
+
});
|
|
656
|
+
var WorkerMessageType = Enum3({
|
|
657
|
+
/** A job failed. */
|
|
658
|
+
error: "error",
|
|
659
|
+
/** The worker exposed its callable API. */
|
|
660
|
+
init: "init",
|
|
661
|
+
/** A job produced a result. */
|
|
662
|
+
result: "result",
|
|
663
|
+
/** A job started running. */
|
|
664
|
+
running: "running",
|
|
665
|
+
/** An error escaped the worker job handler. */
|
|
666
|
+
uncaughtError: "uncaughtError"
|
|
667
|
+
});
|
|
668
|
+
|
|
629
669
|
// src/master/invocation-proxy.ts
|
|
630
670
|
var debugMessages = DebugLogger2("threads:master:messages");
|
|
631
671
|
var nextJobUID = 1;
|
|
632
672
|
var dedupe = (array) => [...new Set(array)];
|
|
633
|
-
var isJobErrorMessage = (data) => data?.type ===
|
|
634
|
-
var isJobResultMessage = (data) => data?.type ===
|
|
635
|
-
var isJobStartMessage = (data) => data?.type ===
|
|
673
|
+
var isJobErrorMessage = (data) => data?.type === WorkerMessageType.error;
|
|
674
|
+
var isJobResultMessage = (data) => data?.type === WorkerMessageType.result;
|
|
675
|
+
var isJobStartMessage = (data) => data?.type === WorkerMessageType.running;
|
|
636
676
|
function createObservableForJob(worker, jobUID) {
|
|
637
677
|
return new Observable3((observer) => {
|
|
638
678
|
let asyncType;
|
|
@@ -671,7 +711,7 @@ function createObservableForJob(worker, jobUID) {
|
|
|
671
711
|
return () => {
|
|
672
712
|
if (asyncType === "observable" || asyncType === void 0) {
|
|
673
713
|
const cancelMessage = {
|
|
674
|
-
type:
|
|
714
|
+
type: MasterMessageType.cancel,
|
|
675
715
|
uid: jobUID
|
|
676
716
|
};
|
|
677
717
|
worker.postMessage(cancelMessage);
|
|
@@ -709,7 +749,7 @@ function createProxyFunction(worker, method) {
|
|
|
709
749
|
const runMessage = {
|
|
710
750
|
args,
|
|
711
751
|
method,
|
|
712
|
-
type:
|
|
752
|
+
type: MasterMessageType.run,
|
|
713
753
|
uid
|
|
714
754
|
};
|
|
715
755
|
debugMessages("Sending command to run function to worker:", runMessage);
|
|
@@ -766,7 +806,7 @@ function createEventObservable(worker, workerTermination) {
|
|
|
766
806
|
const messageHandler = ((messageEvent) => {
|
|
767
807
|
const workerEvent = {
|
|
768
808
|
data: messageEvent.data,
|
|
769
|
-
type:
|
|
809
|
+
type: WorkerEventType.message
|
|
770
810
|
};
|
|
771
811
|
observer.next(workerEvent);
|
|
772
812
|
});
|
|
@@ -774,7 +814,7 @@ function createEventObservable(worker, workerTermination) {
|
|
|
774
814
|
debugThreadUtils("Unhandled promise rejection event in thread:", errorEvent);
|
|
775
815
|
const workerEvent = {
|
|
776
816
|
error: new Error(errorEvent.reason),
|
|
777
|
-
type:
|
|
817
|
+
type: WorkerEventType.internalError
|
|
778
818
|
};
|
|
779
819
|
observer.next(workerEvent);
|
|
780
820
|
});
|
|
@@ -782,7 +822,7 @@ function createEventObservable(worker, workerTermination) {
|
|
|
782
822
|
worker.addEventListener("unhandledrejection", rejectionHandler);
|
|
783
823
|
void (async () => {
|
|
784
824
|
await workerTermination;
|
|
785
|
-
const terminationEvent = { type:
|
|
825
|
+
const terminationEvent = { type: WorkerEventType.termination };
|
|
786
826
|
worker.removeEventListener("message", messageHandler);
|
|
787
827
|
worker.removeEventListener("unhandledrejection", rejectionHandler);
|
|
788
828
|
observer.next(terminationEvent);
|
|
@@ -800,7 +840,7 @@ function createTerminator(worker) {
|
|
|
800
840
|
return { terminate, termination };
|
|
801
841
|
}
|
|
802
842
|
function setPrivateThreadProps(raw, worker, workerEvents, terminate) {
|
|
803
|
-
const workerErrors = workerEvents.filter((event) => event.type ===
|
|
843
|
+
const workerErrors = workerEvents.filter((event) => event.type === WorkerEventType.internalError).map((errorEvent) => errorEvent.error);
|
|
804
844
|
const result = raw;
|
|
805
845
|
const privateProps = [
|
|
806
846
|
[$errors, { enumerable: false, value: workerErrors }],
|