@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
@@ -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
- var PoolEventType = /* @__PURE__ */ ((PoolEventType2) => {
158
- PoolEventType2["initialized"] = "initialized";
159
- PoolEventType2["taskCanceled"] = "taskCanceled";
160
- PoolEventType2["taskCompleted"] = "taskCompleted";
161
- PoolEventType2["taskFailed"] = "taskFailed";
162
- PoolEventType2["taskQueued"] = "taskQueued";
163
- PoolEventType2["taskQueueDrained"] = "taskQueueDrained";
164
- PoolEventType2["taskStart"] = "taskStart";
165
- PoolEventType2["terminated"] = "terminated";
166
- return PoolEventType2;
167
- })(PoolEventType || {});
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: "initialized" /* initialized */
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: "taskStart" /* taskStart */,
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: "taskCompleted" /* taskCompleted */,
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: "taskFailed" /* taskFailed */,
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: "taskQueueDrained" /* taskQueueDrained */ });
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 === "taskCompleted" /* taskCompleted */ && event.taskID === taskID) {
325
+ if (event.type === PoolEventType.taskCompleted && event.taskID === taskID) {
318
326
  eventSubscription.unsubscribe();
319
327
  resolve(event.returnValue);
320
- } else if (event.type === "taskFailed" /* taskFailed */ && event.taskID === taskID) {
328
+ } else if (event.type === PoolEventType.taskFailed && event.taskID === taskID) {
321
329
  eventSubscription.unsubscribe();
322
330
  reject(event.error);
323
- } else if (event.type === "terminated" /* terminated */) {
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 === "taskFailed" /* taskFailed */) {
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 !== "taskQueueDrained" /* taskQueueDrained */) {
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 === "taskQueueDrained" /* taskQueueDrained */) {
376
+ if (event.type === PoolEventType.taskQueueDrained) {
369
377
  subscription.unsubscribe();
370
378
  resolve(settlementPromise);
371
- } else if (event.type === "taskFailed" /* taskFailed */) {
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: "taskCanceled" /* taskCanceled */
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: "taskQueued" /* taskQueued */
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: "terminated" /* terminated */
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 === "error" /* error */;
654
- var isJobResultMessage = (data) => data?.type === "result" /* result */;
655
- var isJobStartMessage = (data) => data?.type === "running" /* running */;
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: "cancel" /* cancel */,
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: "run" /* run */,
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: "message" /* message */
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: "internalError" /* internalError */
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: "termination" /* termination */ };
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 === "internalError" /* internalError */).map((errorEvent) => errorEvent.error);
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 }],