@xylabs/threads 4.8.0-rc.2 → 4.8.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 (73) hide show
  1. package/dist/browser/index-browser.mjs +827 -0
  2. package/dist/browser/index-browser.mjs.map +1 -0
  3. package/dist/browser/master/index-browser.mjs +793 -0
  4. package/dist/browser/master/index-browser.mjs.map +1 -0
  5. package/dist/browser/master/pool-browser.mjs +303 -0
  6. package/dist/browser/master/pool-browser.mjs.map +1 -0
  7. package/dist/browser/worker/worker.browser.mjs +3 -3
  8. package/dist/browser/worker/worker.browser.mjs.map +1 -1
  9. package/dist/neutral/master/register.mjs +21 -131
  10. package/dist/neutral/master/register.mjs.map +1 -1
  11. package/dist/{neutral/master/index.mjs → node/index-node.mjs} +81 -174
  12. package/dist/node/index-node.mjs.map +1 -0
  13. package/dist/{neutral/index.mjs → node/master/index-node.mjs} +56 -217
  14. package/dist/node/master/index-node.mjs.map +1 -0
  15. package/dist/{neutral/master/pool.mjs → node/master/pool-node.mjs} +22 -152
  16. package/dist/node/master/pool-node.mjs.map +1 -0
  17. package/dist/types/index-browser.d.ts +9 -0
  18. package/dist/types/index-browser.d.ts.map +1 -0
  19. package/dist/types/{index.d.ts → index-node.d.ts} +3 -3
  20. package/dist/types/index-node.d.ts.map +1 -0
  21. package/dist/types/master/index-browser.d.ts +13 -0
  22. package/dist/types/master/index-browser.d.ts.map +1 -0
  23. package/dist/types/master/{index.d.ts → index-node.d.ts} +3 -3
  24. package/dist/types/master/index-node.d.ts.map +1 -0
  25. package/dist/types/master/pool-browser.d.ts +93 -0
  26. package/dist/types/master/pool-browser.d.ts.map +1 -0
  27. package/dist/types/master/{pool.d.ts → pool-node.d.ts} +1 -1
  28. package/dist/types/master/pool-node.d.ts.map +1 -0
  29. package/dist/types/worker/worker.browser.d.ts.map +1 -1
  30. package/dist/types/worker/worker.node.d.ts.map +1 -1
  31. package/package.json +37 -27
  32. package/src/common.ts +23 -0
  33. package/src/index-browser.ts +11 -0
  34. package/src/index-node.ts +11 -0
  35. package/src/master/get-bundle-url.browser.ts +32 -0
  36. package/src/master/implementation.browser.ts +82 -0
  37. package/src/master/implementation.node.ts +208 -0
  38. package/src/master/index-browser.ts +19 -0
  39. package/src/master/index-node.ts +19 -0
  40. package/src/master/invocation-proxy.ts +151 -0
  41. package/src/master/pool-browser.ts +399 -0
  42. package/src/master/pool-node.ts +399 -0
  43. package/src/master/pool-types.ts +83 -0
  44. package/src/master/register.ts +11 -0
  45. package/src/master/spawn.ts +172 -0
  46. package/src/master/thread.ts +29 -0
  47. package/src/observable-promise.ts +184 -0
  48. package/src/observable.ts +44 -0
  49. package/src/promise.ts +26 -0
  50. package/src/serializers.ts +68 -0
  51. package/src/symbols.ts +5 -0
  52. package/src/transferable.ts +69 -0
  53. package/src/types/master.ts +132 -0
  54. package/src/types/messages.ts +72 -0
  55. package/src/types/worker.ts +14 -0
  56. package/src/worker/WorkerGlobalScope.ts +5 -0
  57. package/src/worker/expose.ts +234 -0
  58. package/src/worker/is-observable.d.ts +7 -0
  59. package/src/worker/worker.browser.ts +56 -0
  60. package/src/worker/worker.node.ts +68 -0
  61. package/CHANGELOG.md +0 -11
  62. package/dist/neutral/index.mjs.map +0 -1
  63. package/dist/neutral/master/implementation.mjs +0 -264
  64. package/dist/neutral/master/implementation.mjs.map +0 -1
  65. package/dist/neutral/master/index.mjs.map +0 -1
  66. package/dist/neutral/master/pool.mjs.map +0 -1
  67. package/dist/types/index.d.ts.map +0 -1
  68. package/dist/types/master/implementation.d.ts +0 -7
  69. package/dist/types/master/implementation.d.ts.map +0 -1
  70. package/dist/types/master/index.d.ts.map +0 -1
  71. package/dist/types/master/pool.d.ts.map +0 -1
  72. package/dist/types/ponyfills.d.ts +0 -9
  73. package/dist/types/ponyfills.d.ts.map +0 -1
@@ -1,16 +1,11 @@
1
- var __defProp = Object.defineProperty;
2
1
  var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
3
2
  get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
4
3
  }) : x)(function(x) {
5
4
  if (typeof require !== "undefined") return require.apply(this, arguments);
6
5
  throw Error('Dynamic require of "' + x + '" is not supported');
7
6
  });
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
7
 
13
- // src/master/pool.ts
8
+ // src/master/pool-node.ts
14
9
  import DebugLogger from "debug";
15
10
  import {
16
11
  multicast,
@@ -18,131 +13,13 @@ import {
18
13
  Subject
19
14
  } from "observable-fns";
20
15
 
21
- // src/ponyfills.ts
22
- function allSettled(values) {
23
- return Promise.all(
24
- values.map((item) => {
25
- const onFulfill = (value) => {
26
- return { status: "fulfilled", value };
27
- };
28
- const onReject = (reason) => {
29
- return { reason, status: "rejected" };
30
- };
31
- const itemPromise = Promise.resolve(item);
32
- try {
33
- return itemPromise.then(onFulfill, onReject);
34
- } catch (error) {
35
- return Promise.reject(error);
36
- }
37
- })
38
- );
39
- }
40
-
41
- // src/master/implementation.browser.ts
42
- var implementation_browser_exports = {};
43
- __export(implementation_browser_exports, {
44
- defaultPoolSize: () => defaultPoolSize,
45
- getWorkerImplementation: () => getWorkerImplementation,
46
- isWorkerRuntime: () => isWorkerRuntime
47
- });
48
-
49
- // src/master/get-bundle-url.browser.ts
50
- var bundleURL;
51
- function getBundleURLCached() {
52
- if (!bundleURL) {
53
- bundleURL = getBundleURL();
54
- }
55
- return bundleURL;
56
- }
57
- function getBundleURL() {
58
- try {
59
- throw new Error("getBundleURL failed");
60
- } catch (ex) {
61
- const err = ex;
62
- const matches = ("" + err.stack).match(/(https?|file|ftp|chrome-extension|moz-extension):\/\/[^\n)]+/g);
63
- if (matches) {
64
- return getBaseURL(matches[0]);
65
- }
66
- }
67
- return "/";
68
- }
69
- function getBaseURL(url) {
70
- return ("" + url).replace(/^((?:https?|file|ftp|chrome-extension|moz-extension):\/\/.+)?\/[^/]+(?:\?.*)?$/, "$1") + "/";
71
- }
72
-
73
- // src/master/implementation.browser.ts
74
- var defaultPoolSize = typeof navigator !== "undefined" && navigator.hardwareConcurrency ? navigator.hardwareConcurrency : 4;
75
- var isAbsoluteURL = (value) => /^[A-Za-z][\d+.A-Za-z\-]*:/.test(value);
76
- function createSourceBlobURL(code) {
77
- const blob = new Blob([code], { type: "application/javascript" });
78
- return URL.createObjectURL(blob);
79
- }
80
- function selectWorkerImplementation() {
81
- if (typeof Worker === "undefined") {
82
- return class NoWebWorker {
83
- constructor() {
84
- throw new Error(
85
- "No web worker implementation available. You might have tried to spawn a worker within a worker in a browser that doesn't support workers in workers."
86
- );
87
- }
88
- };
89
- }
90
- class WebWorker extends Worker {
91
- constructor(url, options) {
92
- if (typeof url === "string" && options && options._baseURL) {
93
- url = new URL(url, options._baseURL);
94
- } else if (typeof url === "string" && !isAbsoluteURL(url) && /^file:\/\//i.test(getBundleURLCached())) {
95
- url = new URL(url, getBundleURLCached().replace(/\/[^/]+$/, "/"));
96
- if (options?.CORSWorkaround ?? true) {
97
- url = createSourceBlobURL(`importScripts(${JSON.stringify(url)});`);
98
- }
99
- }
100
- if (typeof url === "string" && isAbsoluteURL(url) && (options?.CORSWorkaround ?? true)) {
101
- url = createSourceBlobURL(`importScripts(${JSON.stringify(url)});`);
102
- }
103
- super(url, options);
104
- }
105
- }
106
- class BlobWorker extends WebWorker {
107
- constructor(blob, options) {
108
- const url = globalThis.URL.createObjectURL(blob);
109
- super(url, options);
110
- }
111
- static fromText(source, options) {
112
- const blob = new globalThis.Blob([source], { type: "text/javascript" });
113
- return new BlobWorker(blob, options);
114
- }
115
- }
116
- return {
117
- blob: BlobWorker,
118
- default: WebWorker
119
- };
120
- }
121
- var implementation;
122
- function getWorkerImplementation() {
123
- if (!implementation) {
124
- implementation = selectWorkerImplementation();
125
- }
126
- return implementation;
127
- }
128
- function isWorkerRuntime() {
129
- const isWindowContext = typeof globalThis !== "undefined" && typeof Window !== "undefined" && globalThis instanceof Window;
130
- return typeof globalThis !== "undefined" && self["postMessage"] && !isWindowContext ? true : false;
131
- }
132
-
133
16
  // src/master/implementation.node.ts
134
- var implementation_node_exports = {};
135
- __export(implementation_node_exports, {
136
- defaultPoolSize: () => defaultPoolSize2,
137
- getWorkerImplementation: () => getWorkerImplementation2,
138
- isWorkerRuntime: () => isWorkerRuntime2
139
- });
140
17
  import { EventEmitter } from "node:events";
141
18
  import { cpus } from "node:os";
142
19
  import path from "node:path";
143
20
  import { cwd } from "node:process";
144
21
  import { Worker as NativeWorker } from "node:worker_threads";
145
- var defaultPoolSize2 = cpus().length;
22
+ var defaultPoolSize = cpus().length;
146
23
  function resolveScriptPath(scriptPath, baseURL) {
147
24
  const makeAbsolute = (filePath) => {
148
25
  return path.isAbsolute(filePath) ? filePath : path.join(baseURL ?? cwd(), filePath);
@@ -152,7 +29,7 @@ function resolveScriptPath(scriptPath, baseURL) {
152
29
  }
153
30
  function initWorkerThreadsWorker() {
154
31
  let allWorkers = [];
155
- class Worker2 extends NativeWorker {
32
+ class Worker extends NativeWorker {
156
33
  mappedEventListeners;
157
34
  constructor(scriptPath, options) {
158
35
  const resolvedScriptPath = options && options.fromSource ? null : resolveScriptPath(scriptPath, (options ?? {})._baseURL);
@@ -186,23 +63,23 @@ function initWorkerThreadsWorker() {
186
63
  };
187
64
  process.on("SIGINT", () => terminateWorkersAndMaster());
188
65
  process.on("SIGTERM", () => terminateWorkersAndMaster());
189
- class BlobWorker extends Worker2 {
66
+ class BlobWorker extends Worker {
190
67
  constructor(blob, options) {
191
68
  super(Buffer.from(blob).toString("utf-8"), { ...options, fromSource: true });
192
69
  }
193
70
  static fromText(source, options) {
194
- return new Worker2(source, { ...options, fromSource: true });
71
+ return new Worker(source, { ...options, fromSource: true });
195
72
  }
196
73
  }
197
74
  return {
198
75
  blob: BlobWorker,
199
- default: Worker2
76
+ default: Worker
200
77
  };
201
78
  }
202
79
  function initTinyWorker() {
203
80
  const TinyWorker = __require("tiny-worker");
204
81
  let allWorkers = [];
205
- class Worker2 extends TinyWorker {
82
+ class Worker extends TinyWorker {
206
83
  emitter;
207
84
  constructor(scriptPath, options) {
208
85
  const resolvedScriptPath = options && options.fromSource ? null : process.platform === "win32" ? `file:///${resolveScriptPath(scriptPath).replaceAll("\\", "/")}` : resolveScriptPath(scriptPath);
@@ -237,22 +114,22 @@ function initTinyWorker() {
237
114
  };
238
115
  process.on("SIGINT", () => terminateWorkersAndMaster());
239
116
  process.on("SIGTERM", () => terminateWorkersAndMaster());
240
- class BlobWorker extends Worker2 {
117
+ class BlobWorker extends Worker {
241
118
  constructor(blob, options) {
242
119
  super(Buffer.from(blob).toString("utf-8"), { ...options, fromSource: true });
243
120
  }
244
121
  static fromText(source, options) {
245
- return new Worker2(source, { ...options, fromSource: true });
122
+ return new Worker(source, { ...options, fromSource: true });
246
123
  }
247
124
  }
248
125
  return {
249
126
  blob: BlobWorker,
250
- default: Worker2
127
+ default: Worker
251
128
  };
252
129
  }
253
- var implementation2;
130
+ var implementation;
254
131
  var isTinyWorker;
255
- function selectWorkerImplementation2() {
132
+ function selectWorkerImplementation() {
256
133
  try {
257
134
  isTinyWorker = false;
258
135
  return initWorkerThreadsWorker();
@@ -263,13 +140,13 @@ function selectWorkerImplementation2() {
263
140
  return initTinyWorker();
264
141
  }
265
142
  }
266
- function getWorkerImplementation2() {
267
- if (!implementation2) {
268
- implementation2 = selectWorkerImplementation2();
143
+ function getWorkerImplementation() {
144
+ if (!implementation) {
145
+ implementation = selectWorkerImplementation();
269
146
  }
270
- return implementation2;
147
+ return implementation;
271
148
  }
272
- function isWorkerRuntime2() {
149
+ function isWorkerRuntime() {
273
150
  if (isTinyWorker) {
274
151
  return globalThis !== void 0 && self["postMessage"] ? true : false;
275
152
  } else {
@@ -278,13 +155,6 @@ function isWorkerRuntime2() {
278
155
  }
279
156
  }
280
157
 
281
- // src/master/implementation.ts
282
- var runningInNode = typeof process !== "undefined" && process.arch !== "browser" && "pid" in process;
283
- var implementation3 = runningInNode ? implementation_node_exports : implementation_browser_exports;
284
- var defaultPoolSize3 = implementation3.defaultPoolSize;
285
- var getWorkerImplementation3 = implementation3.getWorkerImplementation;
286
- var isWorkerRuntime3 = implementation3.isWorkerRuntime;
287
-
288
158
  // src/master/pool-types.ts
289
159
  var PoolEventType = /* @__PURE__ */ ((PoolEventType2) => {
290
160
  PoolEventType2["initialized"] = "initialized";
@@ -324,7 +194,7 @@ var Thread = {
324
194
  }
325
195
  };
326
196
 
327
- // src/master/pool.ts
197
+ // src/master/pool-node.ts
328
198
  var nextPoolID = 1;
329
199
  function createArray(size) {
330
200
  const array = [];
@@ -363,7 +233,7 @@ var WorkerPool = class {
363
233
  taskQueue = [];
364
234
  constructor(spawnWorker, optionsOrSize) {
365
235
  const options = typeof optionsOrSize === "number" ? { size: optionsOrSize } : optionsOrSize || {};
366
- const { size = defaultPoolSize3 } = options;
236
+ const { size = defaultPoolSize } = options;
367
237
  this.debug = DebugLogger(`threads:pool:${slugify(options.name || String(nextPoolID++))}`);
368
238
  this.options = options;
369
239
  this.workers = spawnWorkers(spawnWorker, size);
@@ -469,7 +339,7 @@ var WorkerPool = class {
469
339
  throw this.initErrors[0];
470
340
  }
471
341
  if (allowResolvingImmediately && this.taskQueue.length === 0) {
472
- await allSettled(getCurrentlyRunningTasks());
342
+ await Promise.allSettled(getCurrentlyRunningTasks());
473
343
  return taskFailures;
474
344
  }
475
345
  await new Promise((resolve, reject) => {
@@ -484,7 +354,7 @@ var WorkerPool = class {
484
354
  // make a pool-wide error reject the completed() result promise
485
355
  });
486
356
  });
487
- await allSettled(getCurrentlyRunningTasks());
357
+ await Promise.allSettled(getCurrentlyRunningTasks());
488
358
  failureSubscription.unsubscribe();
489
359
  return taskFailures;
490
360
  }
@@ -576,4 +446,4 @@ export {
576
446
  PoolEventType,
577
447
  Thread
578
448
  };
579
- //# sourceMappingURL=pool.mjs.map
449
+ //# sourceMappingURL=pool-node.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/master/pool-node.ts","../../../src/master/implementation.node.ts","../../../src/master/pool-types.ts","../../../src/symbols.ts","../../../src/master/thread.ts"],"sourcesContent":["/* eslint-disable import-x/export */\n/* eslint-disable unicorn/no-thenable */\n\n/* eslint-disable @typescript-eslint/member-ordering */\n/* eslint-disable unicorn/no-array-reduce */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-namespace */\n\n/// <reference lib=\"esnext\" />\n\nimport DebugLogger from 'debug'\nimport {\n multicast, Observable, Subject,\n} from 'observable-fns'\n\nimport { defaultPoolSize } from './implementation.node.ts'\nimport type {\n PoolEvent, QueuedTask, TaskRunFunction, WorkerDescriptor,\n} from './pool-types.ts'\nimport { PoolEventType } from './pool-types.ts'\nimport { Thread } from './thread.ts'\n\nexport declare namespace Pool {\n type Event<ThreadType extends Thread = any> = PoolEvent<ThreadType>\n type EventType = PoolEventType\n}\n\nlet nextPoolID = 1\n\nfunction createArray(size: number): number[] {\n const array: number[] = []\n for (let index = 0; index < size; index++) {\n array.push(index)\n }\n return array\n}\n\nfunction delay(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n\nfunction flatMap<In, Out>(array: In[], mapper: (element: In) => Out[]): Out[] {\n return array.reduce<Out[]>((flattened, element) => [...flattened, ...mapper(element)], [])\n}\n\nfunction slugify(text: string) {\n return text.replaceAll(/\\W/g, ' ').trim().replaceAll(/\\s+/g, '-')\n}\n\nfunction spawnWorkers<ThreadType extends Thread>(spawnWorker: () => Promise<ThreadType>, count: number): Array<WorkerDescriptor<ThreadType>> {\n return createArray(count).map(\n (): WorkerDescriptor<ThreadType> => ({\n init: spawnWorker(),\n runningTasks: [],\n }),\n )\n}\n\n/**\n * Thread pool managing a set of worker threads.\n * Use it to queue tasks that are run on those threads with limited\n * concurrency.\n */\nexport interface Pool<ThreadType extends Thread> {\n /**\n * Returns a promise that resolves once the task queue is emptied.\n * Promise will be rejected if any task fails.\n *\n * @param allowResolvingImmediately Set to `true` to resolve immediately if task queue is currently empty.\n */\n completed(allowResolvingImmediately?: boolean): Promise<any>\n\n /**\n * Returns a promise that resolves once the task queue is emptied.\n * Failing tasks will not cause the promise to be rejected.\n *\n * @param allowResolvingImmediately Set to `true` to resolve immediately if task queue is currently empty.\n */\n settled(allowResolvingImmediately?: boolean): Promise<Error[]>\n\n /**\n * Returns an observable that yields pool events.\n */\n events(): Observable<PoolEvent<ThreadType>>\n\n /**\n * Queue a task and return a promise that resolves once the task has been dequeued,\n * started and finished.\n *\n * @param task An async function that takes a thread instance and invokes it.\n */\n queue<Return>(task: TaskRunFunction<ThreadType, Return>): QueuedTask<ThreadType, Return>\n\n /**\n * Terminate all pool threads.\n *\n * @param force Set to `true` to kill the thread even if it cannot be stopped gracefully.\n */\n terminate(force?: boolean): Promise<void>\n}\n\ninterface PoolOptions {\n /** Maximum no. of tasks to run on one worker thread at a time. Defaults to one. */\n concurrency?: number\n\n /** Maximum no. of jobs to be queued for execution before throwing an error. */\n maxQueuedJobs?: number\n\n /** Gives that pool a name to be used for debug logging, letting you distinguish between log output of different pools. */\n name?: string\n\n /** No. of worker threads to spawn and to be managed by the pool. */\n size?: number\n}\n\nclass WorkerPool<ThreadType extends Thread> implements Pool<ThreadType> {\n static EventType = PoolEventType\n\n private readonly debug: DebugLogger.Debugger\n private readonly eventObservable: Observable<PoolEvent<ThreadType>>\n private readonly options: PoolOptions\n private readonly workers: Array<WorkerDescriptor<ThreadType>>\n\n private readonly eventSubject = new Subject<PoolEvent<ThreadType>>()\n private initErrors: Error[] = []\n private isClosing = false\n private nextTaskID = 1\n private taskQueue: Array<QueuedTask<ThreadType, any>> = []\n\n constructor(spawnWorker: () => Promise<ThreadType>, optionsOrSize?: number | PoolOptions) {\n const options: PoolOptions = typeof optionsOrSize === 'number' ? { size: optionsOrSize } : optionsOrSize || {}\n\n const { size = defaultPoolSize } = options\n\n this.debug = DebugLogger(`threads:pool:${slugify(options.name || String(nextPoolID++))}`)\n this.options = options\n this.workers = spawnWorkers(spawnWorker, size)\n\n this.eventObservable = multicast(Observable.from(this.eventSubject))\n\n Promise.all(this.workers.map(worker => worker.init)).then(\n () =>\n this.eventSubject.next({\n size: this.workers.length,\n type: PoolEventType.initialized,\n }),\n (error) => {\n this.debug('Error while initializing pool worker:', error)\n this.eventSubject.error(error)\n this.initErrors.push(error)\n },\n )\n }\n\n private findIdlingWorker(): WorkerDescriptor<ThreadType> | undefined {\n const { concurrency = 1 } = this.options\n return this.workers.find(worker => worker.runningTasks.length < concurrency)\n }\n\n private async runPoolTask(worker: WorkerDescriptor<ThreadType>, task: QueuedTask<ThreadType, any>) {\n const workerID = this.workers.indexOf(worker) + 1\n\n this.debug(`Running task #${task.id} on worker #${workerID}...`)\n this.eventSubject.next({\n taskID: task.id,\n type: PoolEventType.taskStart,\n workerID,\n })\n\n try {\n const returnValue = await task.run(await worker.init)\n\n this.debug(`Task #${task.id} completed successfully`)\n this.eventSubject.next({\n returnValue,\n taskID: task.id,\n type: PoolEventType.taskCompleted,\n workerID,\n })\n } catch (ex) {\n const error = ex as Error\n this.debug(`Task #${task.id} failed`)\n this.eventSubject.next({\n error,\n taskID: task.id,\n type: PoolEventType.taskFailed,\n workerID,\n })\n }\n }\n\n private run(worker: WorkerDescriptor<ThreadType>, task: QueuedTask<ThreadType, any>) {\n const runPromise = (async () => {\n const removeTaskFromWorkersRunningTasks = () => {\n worker.runningTasks = worker.runningTasks.filter(someRunPromise => someRunPromise !== runPromise)\n }\n\n // Defer task execution by one tick to give handlers time to subscribe\n await delay(0)\n\n try {\n await this.runPoolTask(worker, task)\n } finally {\n removeTaskFromWorkersRunningTasks()\n\n if (!this.isClosing) {\n this.scheduleWork()\n }\n }\n })()\n\n worker.runningTasks.push(runPromise)\n }\n\n private scheduleWork() {\n this.debug('Attempt de-queueing a task in order to run it...')\n\n const availableWorker = this.findIdlingWorker()\n if (!availableWorker) return\n\n const nextTask = this.taskQueue.shift()\n if (!nextTask) {\n this.debug('Task queue is empty')\n this.eventSubject.next({ type: PoolEventType.taskQueueDrained })\n return\n }\n\n this.run(availableWorker, nextTask)\n }\n\n private taskCompletion(taskID: number) {\n return new Promise<any>((resolve, reject) => {\n const eventSubscription = this.events().subscribe((event) => {\n if (event.type === PoolEventType.taskCompleted && event.taskID === taskID) {\n eventSubscription.unsubscribe()\n resolve(event.returnValue)\n } else if (event.type === PoolEventType.taskFailed && event.taskID === taskID) {\n eventSubscription.unsubscribe()\n reject(event.error)\n } else if (event.type === PoolEventType.terminated) {\n eventSubscription.unsubscribe()\n reject(new Error('Pool has been terminated before task was run.'))\n }\n })\n })\n }\n\n async settled(allowResolvingImmediately: boolean = false): Promise<Error[]> {\n const getCurrentlyRunningTasks = () => flatMap(this.workers, worker => worker.runningTasks)\n\n const taskFailures: Error[] = []\n\n const failureSubscription = this.eventObservable.subscribe((event) => {\n if (event.type === PoolEventType.taskFailed) {\n taskFailures.push(event.error)\n }\n })\n\n if (this.initErrors.length > 0) {\n throw this.initErrors[0]\n }\n if (allowResolvingImmediately && this.taskQueue.length === 0) {\n await Promise.allSettled(getCurrentlyRunningTasks())\n return taskFailures\n }\n\n await new Promise<void>((resolve, reject) => {\n const subscription = this.eventObservable.subscribe({\n error: reject,\n next(event) {\n if (event.type === PoolEventType.taskQueueDrained) {\n subscription.unsubscribe()\n resolve(void 0)\n }\n }, // make a pool-wide error reject the completed() result promise\n })\n })\n\n await Promise.allSettled(getCurrentlyRunningTasks())\n failureSubscription.unsubscribe()\n\n return taskFailures\n }\n\n async completed(allowResolvingImmediately: boolean = false) {\n const settlementPromise = this.settled(allowResolvingImmediately)\n\n const earlyExitPromise = new Promise<Error[]>((resolve, reject) => {\n const subscription = this.eventObservable.subscribe({\n error: reject,\n next(event) {\n if (event.type === PoolEventType.taskQueueDrained) {\n subscription.unsubscribe()\n resolve(settlementPromise)\n } else if (event.type === PoolEventType.taskFailed) {\n subscription.unsubscribe()\n reject(event.error)\n }\n }, // make a pool-wide error reject the completed() result promise\n })\n })\n\n const errors = await Promise.race([settlementPromise, earlyExitPromise])\n\n if (errors.length > 0) {\n throw errors[0]\n }\n }\n\n events() {\n return this.eventObservable\n }\n\n queue(taskFunction: TaskRunFunction<ThreadType, any>) {\n const { maxQueuedJobs = Number.POSITIVE_INFINITY } = this.options\n\n if (this.isClosing) {\n throw new Error('Cannot schedule pool tasks after terminate() has been called.')\n }\n if (this.initErrors.length > 0) {\n throw this.initErrors[0]\n }\n\n const taskID = this.nextTaskID++\n const taskCompletion = this.taskCompletion(taskID)\n\n taskCompletion.catch((error) => {\n // Prevent unhandled rejections here as we assume the user will use\n // `pool.completed()`, `pool.settled()` or `task.catch()` to handle errors\n this.debug(`Task #${taskID} errored:`, error)\n })\n\n const task: QueuedTask<ThreadType, any> = {\n cancel: () => {\n if (!this.taskQueue.includes(task)) return\n this.taskQueue = this.taskQueue.filter(someTask => someTask !== task)\n this.eventSubject.next({\n taskID: task.id,\n type: PoolEventType.taskCanceled,\n })\n },\n id: taskID,\n run: taskFunction,\n then: taskCompletion.then.bind(taskCompletion),\n }\n\n if (this.taskQueue.length >= maxQueuedJobs) {\n throw new Error(\n 'Maximum number of pool tasks queued. Refusing to queue another one.\\n'\n + 'This usually happens for one of two reasons: We are either at peak '\n + \"workload right now or some tasks just won't finish, thus blocking the pool.\",\n )\n }\n\n this.debug(`Queueing task #${task.id}...`)\n this.taskQueue.push(task)\n\n this.eventSubject.next({\n taskID: task.id,\n type: PoolEventType.taskQueued,\n })\n\n this.scheduleWork()\n return task\n }\n\n async terminate(force?: boolean) {\n this.isClosing = true\n if (!force) {\n await this.completed(true)\n }\n this.eventSubject.next({\n remainingQueue: [...this.taskQueue],\n type: PoolEventType.terminated,\n })\n this.eventSubject.complete()\n await Promise.all(this.workers.map(async worker => Thread.terminate(await worker.init)))\n }\n}\n\n/**\n * Thread pool constructor. Creates a new pool and spawns its worker threads.\n */\nfunction PoolConstructor<ThreadType extends Thread>(spawnWorker: () => Promise<ThreadType>, optionsOrSize?: number | PoolOptions) {\n // The function exists only so we don't need to use `new` to create a pool (we still can, though).\n // If the Pool is a class or not is an implementation detail that should not concern the user.\n return new WorkerPool(spawnWorker, optionsOrSize)\n}\n\n;(PoolConstructor as any).EventType = PoolEventType\n\n/**\n * Thread pool constructor. Creates a new pool and spawns its worker threads.\n */\nexport const Pool = PoolConstructor as typeof PoolConstructor & { EventType: typeof PoolEventType }\n\nexport type { PoolEvent, QueuedTask } from './pool-types.ts'\nexport { PoolEventType } from './pool-types.ts'\nexport { Thread } from './thread.ts'\n","/* eslint-disable @typescript-eslint/no-require-imports */\n\n/* eslint-disable unicorn/prefer-add-event-listener */\n/* eslint-disable unicorn/prefer-event-target */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable unicorn/text-encoding-identifier-case */\n\nimport { EventEmitter } from 'node:events'\nimport { cpus } from 'node:os'\nimport path from 'node:path'\nimport { cwd } from 'node:process'\nimport { Worker as NativeWorker } from 'node:worker_threads'\n\nimport type {\n ImplementationExport, ThreadsWorkerOptions, WorkerImplementation,\n// eslint-disable-next-line import-x/no-internal-modules\n} from '../types/master.ts'\n\ndeclare const __non_webpack_require__: typeof require\n\ntype WorkerEventName = 'error' | 'message'\n\nexport const defaultPoolSize = cpus().length\n\nfunction resolveScriptPath(scriptPath: string, baseURL?: string | undefined) {\n const makeAbsolute = (filePath: string) => {\n return path.isAbsolute(filePath) ? filePath : path.join(baseURL ?? cwd(), filePath)\n }\n\n const absolutePath = makeAbsolute(scriptPath)\n return absolutePath\n}\n\nfunction initWorkerThreadsWorker(): ImplementationExport {\n let allWorkers: Array<NativeWorker> = []\n\n class Worker extends NativeWorker {\n private mappedEventListeners: WeakMap<EventListener, EventListener>\n\n constructor(scriptPath: string, options?: ThreadsWorkerOptions & { fromSource: boolean }) {\n const resolvedScriptPath = options && options.fromSource ? null : resolveScriptPath(scriptPath, (options ?? {})._baseURL)\n if (resolvedScriptPath) {\n super(resolvedScriptPath, options)\n } else {\n // `options.fromSource` is true\n const sourceCode = scriptPath\n super(sourceCode, { ...options, eval: true })\n }\n\n this.mappedEventListeners = new WeakMap()\n allWorkers.push(this)\n }\n\n addEventListener(eventName: string, rawListener: EventListener) {\n const listener = (message: any) => {\n rawListener({ data: message } as any)\n }\n this.mappedEventListeners.set(rawListener, listener)\n this.on(eventName, listener)\n }\n\n removeEventListener(eventName: string, rawListener: EventListener) {\n const listener = this.mappedEventListeners.get(rawListener) || rawListener\n this.off(eventName, listener)\n }\n }\n\n const terminateWorkersAndMaster = () => {\n // we should terminate all workers and then gracefully shutdown self process\n Promise.all(allWorkers.map(worker => worker.terminate())).then(\n () => process.exit(0),\n () => process.exit(1),\n )\n allWorkers = []\n }\n\n // Take care to not leave orphaned processes behind. See #147.\n process.on('SIGINT', () => terminateWorkersAndMaster())\n process.on('SIGTERM', () => terminateWorkersAndMaster())\n\n class BlobWorker extends Worker {\n constructor(blob: Uint8Array, options?: ThreadsWorkerOptions) {\n super(Buffer.from(blob).toString('utf-8'), { ...options, fromSource: true })\n }\n\n static fromText(source: string, options?: ThreadsWorkerOptions): WorkerImplementation {\n return new Worker(source, { ...options, fromSource: true }) as any\n }\n }\n\n return {\n blob: BlobWorker as any,\n default: Worker as any,\n }\n}\n\nfunction initTinyWorker(): ImplementationExport {\n const TinyWorker = require('tiny-worker')\n\n let allWorkers: Array<typeof TinyWorker> = []\n\n class Worker extends TinyWorker {\n private emitter: EventEmitter\n\n constructor(scriptPath: string, options?: ThreadsWorkerOptions & { fromSource?: boolean }) {\n // Need to apply a work-around for Windows or it will choke upon the absolute path\n // (`Error [ERR_INVALID_PROTOCOL]: Protocol 'c:' not supported`)\n const resolvedScriptPath\n = options && options.fromSource\n ? null\n : process.platform === 'win32'\n ? `file:///${resolveScriptPath(scriptPath).replaceAll('\\\\', '/')}`\n : resolveScriptPath(scriptPath)\n\n if (resolvedScriptPath) {\n super(resolvedScriptPath, [], { esm: true })\n } else {\n // `options.fromSource` is true\n const sourceCode = scriptPath\n super(new Function(sourceCode), [], { esm: true })\n }\n\n allWorkers.push(this)\n\n this.emitter = new EventEmitter()\n this.onerror = (error: Error) => this.emitter.emit('error', error)\n this.onmessage = (message: MessageEvent) => this.emitter.emit('message', message)\n }\n\n addEventListener(eventName: WorkerEventName, listener: EventListener) {\n this.emitter.addListener(eventName, listener)\n }\n\n removeEventListener(eventName: WorkerEventName, listener: EventListener) {\n this.emitter.removeListener(eventName, listener)\n }\n\n terminate() {\n allWorkers = allWorkers.filter(worker => worker !== this)\n return super.terminate()\n }\n }\n\n const terminateWorkersAndMaster = () => {\n // we should terminate all workers and then gracefully shutdown self process\n Promise.all(allWorkers.map(worker => worker.terminate())).then(\n () => process.exit(0),\n () => process.exit(1),\n )\n allWorkers = []\n }\n\n // Take care to not leave orphaned processes behind\n // See <https://github.com/avoidwork/tiny-worker#faq>\n process.on('SIGINT', () => terminateWorkersAndMaster())\n process.on('SIGTERM', () => terminateWorkersAndMaster())\n\n class BlobWorker extends Worker {\n constructor(blob: Uint8Array, options?: ThreadsWorkerOptions) {\n super(Buffer.from(blob).toString('utf-8'), { ...options, fromSource: true })\n }\n\n static fromText(source: string, options?: ThreadsWorkerOptions): WorkerImplementation {\n return new Worker(source, { ...options, fromSource: true }) as any\n }\n }\n\n return {\n blob: BlobWorker as any,\n default: Worker as any,\n }\n}\n\nlet implementation: ImplementationExport\nlet isTinyWorker: boolean\n\nfunction selectWorkerImplementation(): ImplementationExport {\n try {\n isTinyWorker = false\n return initWorkerThreadsWorker()\n } catch (ex) {\n console.error(ex)\n // tslint:disable-next-line no-console\n console.debug('Node worker_threads not available. Trying to fall back to tiny-worker polyfill...')\n isTinyWorker = true\n return initTinyWorker()\n }\n}\n\nexport function getWorkerImplementation(): ImplementationExport {\n if (!implementation) {\n implementation = selectWorkerImplementation()\n }\n return implementation\n}\n\nexport function isWorkerRuntime() {\n if (isTinyWorker) {\n return globalThis !== undefined && self['postMessage'] ? true : false\n } else {\n // Webpack hack\n const isMainThread\n = typeof __non_webpack_require__ === 'function'\n ? __non_webpack_require__('worker_threads').isMainThread\n : eval('require')('worker_threads').isMainThread\n return !isMainThread\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/member-ordering */\nimport type { Thread } from './thread.ts'\n\n/** Pool event type. Specifies the type of each `PoolEvent`. */\nexport enum PoolEventType {\n initialized = 'initialized',\n taskCanceled = 'taskCanceled',\n taskCompleted = 'taskCompleted',\n taskFailed = 'taskFailed',\n taskQueued = 'taskQueued',\n taskQueueDrained = 'taskQueueDrained',\n taskStart = 'taskStart',\n terminated = 'terminated',\n}\n\nexport type TaskRunFunction<ThreadType extends Thread, Return> = (worker: ThreadType) => Promise<Return>\n\n/** Pool event. Subscribe to those events using `pool.events()`. Useful for debugging. */\nexport type PoolEvent<ThreadType extends Thread> =\n | {\n type: PoolEventType.initialized\n size: number\n }\n | {\n type: PoolEventType.taskQueued\n taskID: number\n }\n | {\n type: PoolEventType.taskQueueDrained\n }\n | {\n type: PoolEventType.taskStart\n taskID: number\n workerID: number\n }\n | {\n type: PoolEventType.taskCompleted\n returnValue: any\n taskID: number\n workerID: number\n }\n | {\n type: PoolEventType.taskFailed\n error: Error\n taskID: number\n workerID: number\n }\n | {\n type: PoolEventType.taskCanceled\n taskID: number\n }\n | {\n type: PoolEventType.terminated\n remainingQueue: Array<QueuedTask<ThreadType, any>>\n }\n\nexport interface WorkerDescriptor<ThreadType extends Thread> {\n init: Promise<ThreadType>\n runningTasks: Array<Promise<any>>\n}\n\n/**\n * Task that has been `pool.queued()`-ed.\n */\nexport interface QueuedTask<ThreadType extends Thread, Return> {\n /** @private */\n id: number\n\n /** @private */\n run: TaskRunFunction<ThreadType, Return>\n\n /**\n * Queued tasks can be cancelled until the pool starts running them on a worker thread.\n */\n cancel(): void\n\n /**\n * `QueuedTask` is thenable, so you can `await` it.\n * Resolves when the task has successfully been executed. Rejects if the task fails.\n */\n then: Promise<Return>['then']\n}\n","export const $errors = Symbol('thread.errors')\nexport const $events = Symbol('thread.events')\nexport const $terminate = Symbol('thread.terminate')\nexport const $transferable = Symbol('thread.transferable')\nexport const $worker = Symbol('thread.worker')\n","/* eslint-disable import-x/no-internal-modules */\nimport type { Observable } from 'observable-fns'\n\nimport {\n $errors, $events, $terminate,\n} from '../symbols.ts'\nimport type { Thread as ThreadType, WorkerEvent } from '../types/master.ts'\n\nfunction fail(message: string): never {\n throw new Error(message)\n}\n\nexport type Thread = ThreadType\n\n/** Thread utility functions. Use them to manage or inspect a `spawn()`-ed thread. */\nexport const Thread = {\n /** Return an observable that can be used to subscribe to all errors happening in the thread. */\n errors<ThreadT extends ThreadType>(thread: ThreadT): Observable<Error> {\n return thread[$errors] || fail('Error observable not found. Make sure to pass a thread instance as returned by the spawn() promise.')\n },\n /** Return an observable that can be used to subscribe to internal events happening in the thread. Useful for debugging. */\n events<ThreadT extends ThreadType>(thread: ThreadT): Observable<WorkerEvent> {\n return thread[$events] || fail('Events observable not found. Make sure to pass a thread instance as returned by the spawn() promise.')\n },\n /** Terminate a thread. Remember to terminate every thread when you are done using it. */\n terminate<ThreadT extends ThreadType>(thread: ThreadT) {\n return thread[$terminate]()\n },\n}\n"],"mappings":"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","names":["PoolEventType"]}
@@ -0,0 +1,9 @@
1
+ export { registerSerializer } from './common.ts';
2
+ export * from './master/index-browser.ts';
3
+ export type { QueuedTask } from './master/pool-node.ts';
4
+ export type { ExposedToThreadType as ExposedAs } from './master/spawn.ts';
5
+ export type { JsonSerializable, Serializer, SerializerImplementation, } from './serializers.ts';
6
+ export { DefaultSerializer } from './serializers.ts';
7
+ export type { TransferDescriptor } from './transferable.ts';
8
+ export { Transfer } from './transferable.ts';
9
+ //# sourceMappingURL=index-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-browser.d.ts","sourceRoot":"","sources":["../../src/index-browser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAChD,cAAc,2BAA2B,CAAA;AACzC,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AACvD,YAAY,EAAE,mBAAmB,IAAI,SAAS,EAAE,MAAM,mBAAmB,CAAA;AACzE,YAAY,EACV,gBAAgB,EAAE,UAAU,EAAE,wBAAwB,GACvD,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA"}
@@ -1,9 +1,9 @@
1
1
  export { registerSerializer } from './common.ts';
2
- export * from './master/index.ts';
3
- export type { QueuedTask } from './master/pool.ts';
2
+ export * from './master/index-node.ts';
3
+ export type { QueuedTask } from './master/pool-node.ts';
4
4
  export type { ExposedToThreadType as ExposedAs } from './master/spawn.ts';
5
5
  export type { JsonSerializable, Serializer, SerializerImplementation, } from './serializers.ts';
6
6
  export { DefaultSerializer } from './serializers.ts';
7
7
  export type { TransferDescriptor } from './transferable.ts';
8
8
  export { Transfer } from './transferable.ts';
9
- //# sourceMappingURL=index.d.ts.map
9
+ //# sourceMappingURL=index-node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-node.d.ts","sourceRoot":"","sources":["../../src/index-node.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAChD,cAAc,wBAAwB,CAAA;AACtC,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AACvD,YAAY,EAAE,mBAAmB,IAAI,SAAS,EAAE,MAAM,mBAAmB,CAAA;AACzE,YAAY,EACV,gBAAgB,EAAE,UAAU,EAAE,wBAAwB,GACvD,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,13 @@
1
+ import type { BlobWorker as BlobWorkerClass, Worker as WorkerType } from '../types/master.ts';
2
+ export type { FunctionThread, ModuleThread } from '../types/master.ts';
3
+ export { Pool } from './pool-browser.ts';
4
+ export { spawn } from './spawn.ts';
5
+ export { Thread } from './thread.ts';
6
+ export type BlobWorker = typeof BlobWorkerClass;
7
+ export type Worker = WorkerType;
8
+ /** Separate class to spawn workers from source code blobs or strings. */
9
+ export declare const BlobWorker: typeof BlobWorkerClass;
10
+ /** Worker implementation. Either web worker or a node.js Worker class. */
11
+ export declare const Worker: typeof import("../types/master.ts").WorkerImplementation;
12
+ export { isWorkerRuntime } from './implementation.browser.ts';
13
+ //# sourceMappingURL=index-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-browser.d.ts","sourceRoot":"","sources":["../../../src/master/index-browser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,IAAI,eAAe,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAG7F,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtE,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,MAAM,MAAM,UAAU,GAAG,OAAO,eAAe,CAAA;AAC/C,MAAM,MAAM,MAAM,GAAG,UAAU,CAAA;AAE/B,yEAAyE;AACzE,eAAO,MAAM,UAAU,wBAAuD,CAAA;AAE9E,0EAA0E;AAC1E,eAAO,MAAM,MAAM,0DAA0D,CAAA;AAE7E,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import type { BlobWorker as BlobWorkerClass, Worker as WorkerType } from '../types/master.ts';
2
2
  export type { FunctionThread, ModuleThread } from '../types/master.ts';
3
- export { Pool } from './pool.ts';
3
+ export { Pool } from './pool-browser.ts';
4
4
  export { spawn } from './spawn.ts';
5
5
  export { Thread } from './thread.ts';
6
6
  export type BlobWorker = typeof BlobWorkerClass;
@@ -9,5 +9,5 @@ export type Worker = WorkerType;
9
9
  export declare const BlobWorker: typeof BlobWorkerClass;
10
10
  /** Worker implementation. Either web worker or a node.js Worker class. */
11
11
  export declare const Worker: typeof import("../types/master.ts").WorkerImplementation;
12
- export { isWorkerRuntime } from './implementation.ts';
13
- //# sourceMappingURL=index.d.ts.map
12
+ export { isWorkerRuntime } from './implementation.node.ts';
13
+ //# sourceMappingURL=index-node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-node.d.ts","sourceRoot":"","sources":["../../../src/master/index-node.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,IAAI,eAAe,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAG7F,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtE,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,MAAM,MAAM,UAAU,GAAG,OAAO,eAAe,CAAA;AAC/C,MAAM,MAAM,MAAM,GAAG,UAAU,CAAA;AAE/B,yEAAyE;AACzE,eAAO,MAAM,UAAU,wBAAoD,CAAA;AAE3E,0EAA0E;AAC1E,eAAO,MAAM,MAAM,0DAAuD,CAAA;AAE1E,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA"}
@@ -0,0 +1,93 @@
1
+ import { Observable } from 'observable-fns';
2
+ import type { PoolEvent, QueuedTask, TaskRunFunction } from './pool-types.ts';
3
+ import { PoolEventType } from './pool-types.ts';
4
+ import { Thread } from './thread.ts';
5
+ export declare namespace Pool {
6
+ type Event<ThreadType extends Thread = any> = PoolEvent<ThreadType>;
7
+ type EventType = PoolEventType;
8
+ }
9
+ /**
10
+ * Thread pool managing a set of worker threads.
11
+ * Use it to queue tasks that are run on those threads with limited
12
+ * concurrency.
13
+ */
14
+ export interface Pool<ThreadType extends Thread> {
15
+ /**
16
+ * Returns a promise that resolves once the task queue is emptied.
17
+ * Promise will be rejected if any task fails.
18
+ *
19
+ * @param allowResolvingImmediately Set to `true` to resolve immediately if task queue is currently empty.
20
+ */
21
+ completed(allowResolvingImmediately?: boolean): Promise<any>;
22
+ /**
23
+ * Returns a promise that resolves once the task queue is emptied.
24
+ * Failing tasks will not cause the promise to be rejected.
25
+ *
26
+ * @param allowResolvingImmediately Set to `true` to resolve immediately if task queue is currently empty.
27
+ */
28
+ settled(allowResolvingImmediately?: boolean): Promise<Error[]>;
29
+ /**
30
+ * Returns an observable that yields pool events.
31
+ */
32
+ events(): Observable<PoolEvent<ThreadType>>;
33
+ /**
34
+ * Queue a task and return a promise that resolves once the task has been dequeued,
35
+ * started and finished.
36
+ *
37
+ * @param task An async function that takes a thread instance and invokes it.
38
+ */
39
+ queue<Return>(task: TaskRunFunction<ThreadType, Return>): QueuedTask<ThreadType, Return>;
40
+ /**
41
+ * Terminate all pool threads.
42
+ *
43
+ * @param force Set to `true` to kill the thread even if it cannot be stopped gracefully.
44
+ */
45
+ terminate(force?: boolean): Promise<void>;
46
+ }
47
+ interface PoolOptions {
48
+ /** Maximum no. of tasks to run on one worker thread at a time. Defaults to one. */
49
+ concurrency?: number;
50
+ /** Maximum no. of jobs to be queued for execution before throwing an error. */
51
+ maxQueuedJobs?: number;
52
+ /** Gives that pool a name to be used for debug logging, letting you distinguish between log output of different pools. */
53
+ name?: string;
54
+ /** No. of worker threads to spawn and to be managed by the pool. */
55
+ size?: number;
56
+ }
57
+ declare class WorkerPool<ThreadType extends Thread> implements Pool<ThreadType> {
58
+ static EventType: typeof PoolEventType;
59
+ private readonly debug;
60
+ private readonly eventObservable;
61
+ private readonly options;
62
+ private readonly workers;
63
+ private readonly eventSubject;
64
+ private initErrors;
65
+ private isClosing;
66
+ private nextTaskID;
67
+ private taskQueue;
68
+ constructor(spawnWorker: () => Promise<ThreadType>, optionsOrSize?: number | PoolOptions);
69
+ private findIdlingWorker;
70
+ private runPoolTask;
71
+ private run;
72
+ private scheduleWork;
73
+ private taskCompletion;
74
+ settled(allowResolvingImmediately?: boolean): Promise<Error[]>;
75
+ completed(allowResolvingImmediately?: boolean): Promise<void>;
76
+ events(): Observable<PoolEvent<ThreadType>>;
77
+ queue(taskFunction: TaskRunFunction<ThreadType, any>): QueuedTask<ThreadType, any>;
78
+ terminate(force?: boolean): Promise<void>;
79
+ }
80
+ /**
81
+ * Thread pool constructor. Creates a new pool and spawns its worker threads.
82
+ */
83
+ declare function PoolConstructor<ThreadType extends Thread>(spawnWorker: () => Promise<ThreadType>, optionsOrSize?: number | PoolOptions): WorkerPool<ThreadType>;
84
+ /**
85
+ * Thread pool constructor. Creates a new pool and spawns its worker threads.
86
+ */
87
+ export declare const Pool: typeof PoolConstructor & {
88
+ EventType: typeof PoolEventType;
89
+ };
90
+ export type { PoolEvent, QueuedTask } from './pool-types.ts';
91
+ export { PoolEventType } from './pool-types.ts';
92
+ export { Thread } from './thread.ts';
93
+ //# sourceMappingURL=pool-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool-browser.d.ts","sourceRoot":"","sources":["../../../src/master/pool-browser.ts"],"names":[],"mappings":"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"}
@@ -90,4 +90,4 @@ export declare const Pool: typeof PoolConstructor & {
90
90
  export type { PoolEvent, QueuedTask } from './pool-types.ts';
91
91
  export { PoolEventType } from './pool-types.ts';
92
92
  export { Thread } from './thread.ts';
93
- //# sourceMappingURL=pool.d.ts.map
93
+ //# sourceMappingURL=pool-node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool-node.d.ts","sourceRoot":"","sources":["../../../src/master/pool-node.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"worker.browser.d.ts","sourceRoot":"","sources":["../../../src/worker/worker.browser.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAM7D,QAAA,MAAM,eAAe,EAAE,mBAAmB,CAAC,iBAAiB,CAG3D,CAAA;AAED,QAAA,MAAM,mBAAmB,EAAE,mBAAmB,CAAC,qBAAqB,CAEnE,CAAA;AAED,QAAA,MAAM,yBAAyB,EAAE,mBAAmB,CAAC,2BAA2B,CAS/E,CAAA;AAED,QAAA,MAAM,gBAAgB,+DAAwB,CAAA;AAC9C,QAAA,MAAM,WAAW,qEAAmB,CAAA;AACpC,QAAA,MAAM,mBAAmB,+DAA2B,CAAA;AAEpD,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,mBAAmB,GACpB,CAAA;AAED,QAAA,MAAM,MAAM,iHAIV,CAAA;AAEF,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,yBAAyB,GAC1B,CAAA;AAED,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,CAAA"}
1
+ {"version":3,"file":"worker.browser.d.ts","sourceRoot":"","sources":["../../../src/worker/worker.browser.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAM7D,QAAA,MAAM,eAAe,EAAE,mBAAmB,CAAC,iBAAiB,CAG3D,CAAA;AAED,QAAA,MAAM,mBAAmB,EAAE,mBAAmB,CAAC,qBAAqB,CAEnE,CAAA;AAED,QAAA,MAAM,yBAAyB,EAAE,mBAAmB,CAAC,2BAA2B,CAS/E,CAAA;AAED,QAAA,MAAM,gBAAgB,+DAAmC,CAAA;AACzD,QAAA,MAAM,WAAW,qEAA8B,CAAA;AAC/C,QAAA,MAAM,mBAAmB,+DAAsC,CAAA;AAE/D,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,mBAAmB,GACpB,CAAA;AAED,QAAA,MAAM,MAAM,iHAIV,CAAA;AAEF,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,yBAAyB,GAC1B,CAAA;AAED,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"worker.node.d.ts","sourceRoot":"","sources":["../../../src/worker/worker.node.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAKxE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAY7D,QAAA,MAAM,eAAe,EAAE,mBAAmB,CAAC,iBAAiB,CAE3D,CAAA;AAED,QAAA,MAAM,mBAAmB,EAAE,mBAAmB,CAAC,qBAAqB,CAEnE,CAAA;AAED,QAAA,MAAM,yBAAyB,EAAE,mBAAmB,CAAC,2BAA2B,CAY/E,CAAA;AAED,QAAA,MAAM,gBAAgB;;;;wCAyB0gR,GAAG;CAzB3+Q,CAAA;AACxD,QAAA,MAAM,WAAW,kEAA2C,CAAA;AAC5D,QAAA,MAAM,mBAAmB;;;;wCAuBoiU,GAAG;CAvBpgU,CAAA;AAE5D,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,mBAAmB,GACpB,CAAA;AAED,QAAA,MAAM,MAAM,iHAIV,CAAA;AAEF,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,yBAAyB,GAC1B,CAAA;AAED,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,CAAA"}
1
+ {"version":3,"file":"worker.node.d.ts","sourceRoot":"","sources":["../../../src/worker/worker.node.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAKxE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAY7D,QAAA,MAAM,eAAe,EAAE,mBAAmB,CAAC,iBAAiB,CAE3D,CAAA;AAED,QAAA,MAAM,mBAAmB,EAAE,mBAAmB,CAAC,qBAAqB,CAEnE,CAAA;AAED,QAAA,MAAM,yBAAyB,EAAE,mBAAmB,CAAC,2BAA2B,CAY/E,CAAA;AAED,QAAA,MAAM,gBAAgB;;;;wCAyB+iR,GAAG;CAzBhhR,CAAA;AACxD,QAAA,MAAM,WAAW,kEAA2C,CAAA;AAC5D,QAAA,MAAM,mBAAmB;;;;wCAuBykU,GAAG;CAvBziU,CAAA;AAE5D,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,mBAAmB,GACpB,CAAA;AAED,QAAA,MAAM,MAAM,iHAIV,CAAA;AAEF,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,yBAAyB,GAC1B,CAAA;AAED,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,CAAA"}