@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.
Files changed (52) hide show
  1. package/README.md +4 -0
  2. package/dist/browser/index-browser.mjs +75 -35
  3. package/dist/browser/index-browser.mjs.map +4 -4
  4. package/dist/browser/master/index-browser.mjs +75 -35
  5. package/dist/browser/master/index-browser.mjs.map +4 -4
  6. package/dist/browser/master/pool-browser.d.ts +10 -1
  7. package/dist/browser/master/pool-browser.d.ts.map +1 -1
  8. package/dist/browser/master/pool-browser.mjs +34 -26
  9. package/dist/browser/master/pool-browser.mjs.map +3 -3
  10. package/dist/browser/master/pool-node.d.ts +10 -1
  11. package/dist/browser/master/pool-node.d.ts.map +1 -1
  12. package/dist/browser/master/pool-types.d.ts +21 -26
  13. package/dist/browser/master/pool-types.d.ts.map +1 -1
  14. package/dist/browser/types/master.d.ts +11 -11
  15. package/dist/browser/types/master.d.ts.map +1 -1
  16. package/dist/browser/types/messages.d.ts +23 -25
  17. package/dist/browser/types/messages.d.ts.map +1 -1
  18. package/dist/browser/worker/worker.browser.mjs +29 -8
  19. package/dist/browser/worker/worker.browser.mjs.map +3 -3
  20. package/dist/neutral/master/pool-browser.d.ts +10 -1
  21. package/dist/neutral/master/pool-browser.d.ts.map +1 -1
  22. package/dist/neutral/master/pool-node.d.ts +10 -1
  23. package/dist/neutral/master/pool-node.d.ts.map +1 -1
  24. package/dist/neutral/master/pool-types.d.ts +21 -26
  25. package/dist/neutral/master/pool-types.d.ts.map +1 -1
  26. package/dist/neutral/master/spawn.mjs +41 -9
  27. package/dist/neutral/master/spawn.mjs.map +4 -4
  28. package/dist/neutral/types/master.d.ts +11 -11
  29. package/dist/neutral/types/master.d.ts.map +1 -1
  30. package/dist/neutral/types/messages.d.ts +23 -25
  31. package/dist/neutral/types/messages.d.ts.map +1 -1
  32. package/dist/neutral/types/messages.mjs +19 -13
  33. package/dist/neutral/types/messages.mjs.map +3 -3
  34. package/dist/node/index-node.mjs +75 -35
  35. package/dist/node/index-node.mjs.map +4 -4
  36. package/dist/node/master/index-node.mjs +75 -35
  37. package/dist/node/master/index-node.mjs.map +4 -4
  38. package/dist/node/master/pool-browser.d.ts +10 -1
  39. package/dist/node/master/pool-browser.d.ts.map +1 -1
  40. package/dist/node/master/pool-node.d.ts +10 -1
  41. package/dist/node/master/pool-node.d.ts.map +1 -1
  42. package/dist/node/master/pool-node.mjs +34 -26
  43. package/dist/node/master/pool-node.mjs.map +3 -3
  44. package/dist/node/master/pool-types.d.ts +21 -26
  45. package/dist/node/master/pool-types.d.ts.map +1 -1
  46. package/dist/node/types/master.d.ts +11 -11
  47. package/dist/node/types/master.d.ts.map +1 -1
  48. package/dist/node/types/messages.d.ts +23 -25
  49. package/dist/node/types/messages.d.ts.map +1 -1
  50. package/dist/node/worker/worker.node.mjs +29 -8
  51. package/dist/node/worker/worker.node.mjs.map +3 -3
  52. 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
- var PoolEventType = /* @__PURE__ */ ((PoolEventType2) => {
96
- PoolEventType2["initialized"] = "initialized";
97
- PoolEventType2["taskCanceled"] = "taskCanceled";
98
- PoolEventType2["taskCompleted"] = "taskCompleted";
99
- PoolEventType2["taskFailed"] = "taskFailed";
100
- PoolEventType2["taskQueued"] = "taskQueued";
101
- PoolEventType2["taskQueueDrained"] = "taskQueueDrained";
102
- PoolEventType2["taskStart"] = "taskStart";
103
- PoolEventType2["terminated"] = "terminated";
104
- return PoolEventType2;
105
- })(PoolEventType || {});
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: "initialized" /* initialized */
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: "taskStart" /* taskStart */,
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: "taskCompleted" /* taskCompleted */,
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: "taskFailed" /* taskFailed */,
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: "taskQueueDrained" /* taskQueueDrained */ });
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 === "taskCompleted" /* taskCompleted */ && event.taskID === taskID) {
263
+ if (event.type === PoolEventType.taskCompleted && event.taskID === taskID) {
256
264
  eventSubscription.unsubscribe();
257
265
  resolve(event.returnValue);
258
- } else if (event.type === "taskFailed" /* taskFailed */ && event.taskID === taskID) {
266
+ } else if (event.type === PoolEventType.taskFailed && event.taskID === taskID) {
259
267
  eventSubscription.unsubscribe();
260
268
  reject(event.error);
261
- } else if (event.type === "terminated" /* terminated */) {
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 === "taskFailed" /* taskFailed */) {
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 !== "taskQueueDrained" /* taskQueueDrained */) {
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 === "taskQueueDrained" /* taskQueueDrained */) {
314
+ if (event.type === PoolEventType.taskQueueDrained) {
307
315
  subscription.unsubscribe();
308
316
  resolve(settlementPromise);
309
- } else if (event.type === "taskFailed" /* taskFailed */) {
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: "taskCanceled" /* taskCanceled */
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: "taskQueued" /* taskQueued */
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: "terminated" /* terminated */
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 === "error" /* error */;
606
- var isJobResultMessage = (data) => data?.type === "result" /* result */;
607
- var isJobStartMessage = (data) => data?.type === "running" /* running */;
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: "cancel" /* cancel */,
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: "run" /* run */,
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: "message" /* message */
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: "internalError" /* internalError */
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: "termination" /* termination */ };
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 === "internalError" /* internalError */).map((errorEvent) => errorEvent.error);
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 }],