@xylabs/threads 5.0.13 → 5.0.15

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 (33) hide show
  1. package/dist/browser/index-browser.mjs +119 -209
  2. package/dist/browser/index-browser.mjs.map +1 -1
  3. package/dist/browser/master/implementation.browser.mjs +11 -36
  4. package/dist/browser/master/implementation.browser.mjs.map +1 -1
  5. package/dist/browser/master/index-browser.mjs +117 -201
  6. package/dist/browser/master/index-browser.mjs.map +1 -1
  7. package/dist/browser/master/pool-browser.mjs +53 -65
  8. package/dist/browser/master/pool-browser.mjs.map +1 -1
  9. package/dist/browser/worker/worker.browser.mjs +43 -79
  10. package/dist/browser/worker/worker.browser.mjs.map +1 -1
  11. package/dist/neutral/master/register.mjs +62 -121
  12. package/dist/neutral/master/register.mjs.map +1 -1
  13. package/dist/neutral/master/spawn.mjs +53 -106
  14. package/dist/neutral/master/spawn.mjs.map +1 -1
  15. package/dist/neutral/master/thread.mjs +0 -4
  16. package/dist/neutral/master/thread.mjs.map +1 -1
  17. package/dist/neutral/observable-promise.mjs +20 -27
  18. package/dist/neutral/observable-promise.mjs.map +1 -1
  19. package/dist/neutral/observable.mjs +3 -12
  20. package/dist/neutral/observable.mjs.map +1 -1
  21. package/dist/neutral/types/messages.mjs +4 -4
  22. package/dist/neutral/types/messages.mjs.map +1 -1
  23. package/dist/node/index-node.mjs +169 -293
  24. package/dist/node/index-node.mjs.map +1 -1
  25. package/dist/node/master/implementation.node.mjs +62 -121
  26. package/dist/node/master/implementation.node.mjs.map +1 -1
  27. package/dist/node/master/index-node.mjs +168 -286
  28. package/dist/node/master/index-node.mjs.map +1 -1
  29. package/dist/node/master/pool-node.mjs +115 -183
  30. package/dist/node/master/pool-node.mjs.map +1 -1
  31. package/dist/node/worker/worker.node.mjs +43 -80
  32. package/dist/node/worker/worker.node.mjs.map +1 -1
  33. package/package.json +3 -4
@@ -1,6 +1,3 @@
1
- var __defProp = Object.defineProperty;
2
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
-
4
1
  // src/master/spawn.ts
5
2
  import DebugLogger2 from "debug";
6
3
  import { Observable as Observable3 } from "observable-fns";
@@ -22,7 +19,7 @@ var DefaultErrorSerializer = {
22
19
  };
23
20
  }
24
21
  };
25
- var isSerializedError = /* @__PURE__ */ __name((thing) => thing && typeof thing === "object" && "__error_marker" in thing && thing.__error_marker === "$$error", "isSerializedError");
22
+ var isSerializedError = (thing) => thing && typeof thing === "object" && "__error_marker" in thing && thing.__error_marker === "$$error";
26
23
  var DefaultSerializer = {
27
24
  deserialize(message) {
28
25
  return isSerializedError(message) ? DefaultErrorSerializer.deserialize(message) : message;
@@ -37,14 +34,12 @@ globalThis.registeredSerializer = globalThis.registeredSerializer ?? DefaultSeri
37
34
  function deserialize(message) {
38
35
  return globalThis.registeredSerializer.deserialize(message);
39
36
  }
40
- __name(deserialize, "deserialize");
41
37
  function serialize(input) {
42
38
  return globalThis.registeredSerializer.serialize(input);
43
39
  }
44
- __name(serialize, "serialize");
45
40
 
46
41
  // src/promise.ts
47
- var doNothing = /* @__PURE__ */ __name(() => void 0, "doNothing");
42
+ var doNothing = () => void 0;
48
43
  function createPromiseWithResolver() {
49
44
  let alreadyResolved = false;
50
45
  let resolvedTo;
@@ -56,17 +51,13 @@ function createPromiseWithResolver() {
56
51
  resolver = resolve;
57
52
  }
58
53
  });
59
- const exposedResolver = /* @__PURE__ */ __name((value) => {
54
+ const exposedResolver = (value) => {
60
55
  alreadyResolved = true;
61
56
  resolvedTo = value;
62
57
  resolver(resolvedTo);
63
- }, "exposedResolver");
64
- return [
65
- promise,
66
- exposedResolver
67
- ];
58
+ };
59
+ return [promise, exposedResolver];
68
60
  }
69
- __name(createPromiseWithResolver, "createPromiseWithResolver");
70
61
 
71
62
  // src/symbols.ts
72
63
  var $errors = Symbol("thread.errors");
@@ -75,36 +66,23 @@ var $terminate = Symbol("thread.terminate");
75
66
  var $transferable = Symbol("thread.transferable");
76
67
  var $worker = Symbol("thread.worker");
77
68
 
78
- // src/types/master.ts
79
- var WorkerEventType = /* @__PURE__ */ function(WorkerEventType2) {
80
- WorkerEventType2["internalError"] = "internalError";
81
- WorkerEventType2["message"] = "message";
82
- WorkerEventType2["termination"] = "termination";
83
- return WorkerEventType2;
84
- }({});
85
-
86
69
  // src/master/invocation-proxy.ts
87
70
  import DebugLogger from "debug";
88
71
  import { multicast, Observable as Observable2 } from "observable-fns";
89
72
 
90
73
  // src/observable-promise.ts
91
74
  import { Observable } from "observable-fns";
92
- var doNothing2 = /* @__PURE__ */ __name(() => {
93
- }, "doNothing");
94
- var returnInput = /* @__PURE__ */ __name((input) => input, "returnInput");
95
- var runDeferred = /* @__PURE__ */ __name((fn) => Promise.resolve().then(fn), "runDeferred");
75
+ var doNothing2 = () => {
76
+ };
77
+ var returnInput = (input) => input;
78
+ var runDeferred = (fn) => Promise.resolve().then(fn);
96
79
  function fail(error) {
97
80
  throw error;
98
81
  }
99
- __name(fail, "fail");
100
82
  function isThenable(thing) {
101
83
  return thing && typeof thing.then === "function";
102
84
  }
103
- __name(isThenable, "isThenable");
104
85
  var ObservablePromise = class _ObservablePromise extends Observable {
105
- static {
106
- __name(this, "ObservablePromise");
107
- }
108
86
  [Symbol.toStringTag] = "[object ObservablePromise]";
109
87
  initHasRun = false;
110
88
  fulfillmentCallbacks = [];
@@ -163,7 +141,7 @@ var ObservablePromise = class _ObservablePromise extends Observable {
163
141
  const onRejected = onRejectedRaw || fail;
164
142
  let onRejectedCalled = false;
165
143
  return new Promise((resolve, reject) => {
166
- const rejectionCallback = /* @__PURE__ */ __name((error) => {
144
+ const rejectionCallback = (error) => {
167
145
  if (onRejectedCalled) return;
168
146
  onRejectedCalled = true;
169
147
  try {
@@ -171,19 +149,17 @@ var ObservablePromise = class _ObservablePromise extends Observable {
171
149
  } catch (anotherError) {
172
150
  reject(anotherError);
173
151
  }
174
- }, "rejectionCallback");
175
- const fulfillmentCallback = /* @__PURE__ */ __name((value) => {
152
+ };
153
+ const fulfillmentCallback = (value) => {
176
154
  try {
177
155
  resolve(onFulfilled(value));
178
156
  } catch (ex) {
179
157
  const error = ex;
180
158
  rejectionCallback(error);
181
159
  }
182
- }, "fulfillmentCallback");
160
+ };
183
161
  if (!this.initHasRun) {
184
- this.subscribe({
185
- error: rejectionCallback
186
- });
162
+ this.subscribe({ error: rejectionCallback });
187
163
  }
188
164
  if (this.state === "fulfilled") {
189
165
  return resolve(onFulfilled(this.firstValue));
@@ -201,20 +177,23 @@ var ObservablePromise = class _ObservablePromise extends Observable {
201
177
  }
202
178
  finally(onCompleted) {
203
179
  const handler = onCompleted || doNothing2;
204
- return this.then((value) => {
205
- handler();
206
- return value;
207
- }, () => handler());
180
+ return this.then(
181
+ (value) => {
182
+ handler();
183
+ return value;
184
+ },
185
+ () => handler()
186
+ );
208
187
  }
209
188
  static from(thing) {
210
189
  return isThenable(thing) ? new _ObservablePromise((observer) => {
211
- const onFulfilled = /* @__PURE__ */ __name((value) => {
190
+ const onFulfilled = (value) => {
212
191
  observer.next(value);
213
192
  observer.complete();
214
- }, "onFulfilled");
215
- const onRejected = /* @__PURE__ */ __name((error) => {
193
+ };
194
+ const onRejected = (error) => {
216
195
  observer.error(error);
217
- }, "onRejected");
196
+ };
218
197
  thing.then(onFulfilled, onRejected);
219
198
  }) : super.from(thing);
220
199
  }
@@ -224,36 +203,18 @@ var ObservablePromise = class _ObservablePromise extends Observable {
224
203
  function isTransferDescriptor(thing) {
225
204
  return thing && typeof thing === "object" && thing[$transferable];
226
205
  }
227
- __name(isTransferDescriptor, "isTransferDescriptor");
228
-
229
- // src/types/messages.ts
230
- var MasterMessageType = /* @__PURE__ */ function(MasterMessageType2) {
231
- MasterMessageType2["cancel"] = "cancel";
232
- MasterMessageType2["run"] = "run";
233
- return MasterMessageType2;
234
- }({});
235
- var WorkerMessageType = /* @__PURE__ */ function(WorkerMessageType2) {
236
- WorkerMessageType2["error"] = "error";
237
- WorkerMessageType2["init"] = "init";
238
- WorkerMessageType2["result"] = "result";
239
- WorkerMessageType2["running"] = "running";
240
- WorkerMessageType2["uncaughtError"] = "uncaughtError";
241
- return WorkerMessageType2;
242
- }({});
243
206
 
244
207
  // src/master/invocation-proxy.ts
245
208
  var debugMessages = DebugLogger("threads:master:messages");
246
209
  var nextJobUID = 1;
247
- var dedupe = /* @__PURE__ */ __name((array) => [
248
- ...new Set(array)
249
- ], "dedupe");
250
- var isJobErrorMessage = /* @__PURE__ */ __name((data) => data && data.type === WorkerMessageType.error, "isJobErrorMessage");
251
- var isJobResultMessage = /* @__PURE__ */ __name((data) => data && data.type === WorkerMessageType.result, "isJobResultMessage");
252
- var isJobStartMessage = /* @__PURE__ */ __name((data) => data && data.type === WorkerMessageType.running, "isJobStartMessage");
210
+ var dedupe = (array) => [...new Set(array)];
211
+ var isJobErrorMessage = (data) => data && data.type === "error" /* error */;
212
+ var isJobResultMessage = (data) => data && data.type === "result" /* result */;
213
+ var isJobStartMessage = (data) => data && data.type === "running" /* running */;
253
214
  function createObservableForJob(worker, jobUID) {
254
215
  return new Observable2((observer) => {
255
216
  let asyncType;
256
- const messageHandler = /* @__PURE__ */ __name((event) => {
217
+ const messageHandler = (event) => {
257
218
  debugMessages("Message from worker:", event.data);
258
219
  if (!event.data || event.data.uid !== jobUID) return;
259
220
  if (isJobStartMessage(event.data)) {
@@ -283,12 +244,12 @@ function createObservableForJob(worker, jobUID) {
283
244
  }
284
245
  worker.removeEventListener("message", messageHandler);
285
246
  }
286
- }, "messageHandler");
247
+ };
287
248
  worker.addEventListener("message", messageHandler);
288
249
  return () => {
289
250
  if (asyncType === "observable" || !asyncType) {
290
251
  const cancelMessage = {
291
- type: MasterMessageType.cancel,
252
+ type: "cancel" /* cancel */,
292
253
  uid: jobUID
293
254
  };
294
255
  worker.postMessage(cancelMessage);
@@ -297,7 +258,6 @@ function createObservableForJob(worker, jobUID) {
297
258
  };
298
259
  });
299
260
  }
300
- __name(createObservableForJob, "createObservableForJob");
301
261
  function prepareArguments(rawArgs) {
302
262
  if (rawArgs.length === 0) {
303
263
  return {
@@ -320,7 +280,6 @@ function prepareArguments(rawArgs) {
320
280
  transferables: transferables.length === 0 ? transferables : dedupe(transferables)
321
281
  };
322
282
  }
323
- __name(prepareArguments, "prepareArguments");
324
283
  function createProxyFunction(worker, method) {
325
284
  return (...rawArgs) => {
326
285
  const uid = nextJobUID++;
@@ -328,7 +287,7 @@ function createProxyFunction(worker, method) {
328
287
  const runMessage = {
329
288
  args,
330
289
  method,
331
- type: MasterMessageType.run,
290
+ type: "run" /* run */,
332
291
  uid
333
292
  };
334
293
  debugMessages("Sending command to run function to worker:", runMessage);
@@ -340,7 +299,6 @@ function createProxyFunction(worker, method) {
340
299
  return ObservablePromise.from(multicast(createObservableForJob(worker, uid)));
341
300
  };
342
301
  }
343
- __name(createProxyFunction, "createProxyFunction");
344
302
  function createProxyModule(worker, methodNames) {
345
303
  const proxy = {};
346
304
  for (const methodName of methodNames) {
@@ -348,31 +306,26 @@ function createProxyModule(worker, methodNames) {
348
306
  }
349
307
  return proxy;
350
308
  }
351
- __name(createProxyModule, "createProxyModule");
352
309
 
353
310
  // src/master/spawn.ts
354
311
  var debugMessages2 = DebugLogger2("threads:master:messages");
355
312
  var debugSpawn = DebugLogger2("threads:master:spawn");
356
313
  var debugThreadUtils = DebugLogger2("threads:master:thread-utils");
357
- var isInitMessage = /* @__PURE__ */ __name((data) => data && data.type === "init", "isInitMessage");
358
- var isUncaughtErrorMessage = /* @__PURE__ */ __name((data) => data && data.type === "uncaughtError", "isUncaughtErrorMessage");
314
+ var isInitMessage = (data) => data && data.type === "init";
315
+ var isUncaughtErrorMessage = (data) => data && data.type === "uncaughtError";
359
316
  var initMessageTimeout = typeof process !== "undefined" && process.env !== void 0 && process.env.THREADS_WORKER_INIT_TIMEOUT ? Number.parseInt(process.env.THREADS_WORKER_INIT_TIMEOUT, 10) : 1e4;
360
317
  async function withTimeout(promise, timeoutInMs, errorMessage) {
361
318
  let timeoutHandle;
362
319
  const timeout = new Promise((resolve, reject) => {
363
320
  timeoutHandle = setTimeout(() => reject(new Error(errorMessage)), timeoutInMs);
364
321
  });
365
- const result = await Promise.race([
366
- promise,
367
- timeout
368
- ]);
322
+ const result = await Promise.race([promise, timeout]);
369
323
  clearTimeout(timeoutHandle);
370
324
  return result;
371
325
  }
372
- __name(withTimeout, "withTimeout");
373
326
  function receiveInitMessage(worker) {
374
327
  return new Promise((resolve, reject) => {
375
- const messageHandler = /* @__PURE__ */ __name((event) => {
328
+ const messageHandler = (event) => {
376
329
  debugMessages2("Message from worker before finishing initialization:", event.data);
377
330
  if (isInitMessage(event.data)) {
378
331
  worker.removeEventListener("message", messageHandler);
@@ -381,34 +334,31 @@ function receiveInitMessage(worker) {
381
334
  worker.removeEventListener("message", messageHandler);
382
335
  reject(deserialize(event.data.error));
383
336
  }
384
- }, "messageHandler");
337
+ };
385
338
  worker.addEventListener("message", messageHandler);
386
339
  });
387
340
  }
388
- __name(receiveInitMessage, "receiveInitMessage");
389
341
  function createEventObservable(worker, workerTermination) {
390
342
  return new Observable3((observer) => {
391
- const messageHandler = /* @__PURE__ */ __name((messageEvent) => {
343
+ const messageHandler = (messageEvent) => {
392
344
  const workerEvent = {
393
345
  data: messageEvent.data,
394
- type: WorkerEventType.message
346
+ type: "message" /* message */
395
347
  };
396
348
  observer.next(workerEvent);
397
- }, "messageHandler");
398
- const rejectionHandler = /* @__PURE__ */ __name((errorEvent) => {
349
+ };
350
+ const rejectionHandler = (errorEvent) => {
399
351
  debugThreadUtils("Unhandled promise rejection event in thread:", errorEvent);
400
352
  const workerEvent = {
401
353
  error: new Error(errorEvent.reason),
402
- type: WorkerEventType.internalError
354
+ type: "internalError" /* internalError */
403
355
  };
404
356
  observer.next(workerEvent);
405
- }, "rejectionHandler");
357
+ };
406
358
  worker.addEventListener("message", messageHandler);
407
359
  worker.addEventListener("unhandledrejection", rejectionHandler);
408
360
  workerTermination.then(() => {
409
- const terminationEvent = {
410
- type: WorkerEventType.termination
411
- };
361
+ const terminationEvent = { type: "termination" /* termination */ };
412
362
  worker.removeEventListener("message", messageHandler);
413
363
  worker.removeEventListener("unhandledrejection", rejectionHandler);
414
364
  observer.next(terminationEvent);
@@ -416,22 +366,17 @@ function createEventObservable(worker, workerTermination) {
416
366
  });
417
367
  });
418
368
  }
419
- __name(createEventObservable, "createEventObservable");
420
369
  function createTerminator(worker) {
421
370
  const [termination, resolver] = createPromiseWithResolver();
422
- const terminate = /* @__PURE__ */ __name(async () => {
371
+ const terminate = async () => {
423
372
  debugThreadUtils("Terminating worker");
424
373
  await worker.terminate();
425
374
  resolver();
426
- }, "terminate");
427
- return {
428
- terminate,
429
- termination
430
375
  };
376
+ return { terminate, termination };
431
377
  }
432
- __name(createTerminator, "createTerminator");
433
378
  function setPrivateThreadProps(raw, worker, workerEvents, terminate) {
434
- const workerErrors = workerEvents.filter((event) => event.type === WorkerEventType.internalError).map((errorEvent) => errorEvent.error);
379
+ const workerErrors = workerEvents.filter((event) => event.type === "internalError" /* internalError */).map((errorEvent) => errorEvent.error);
435
380
  return Object.assign(raw, {
436
381
  [$errors]: workerErrors,
437
382
  [$events]: workerEvents,
@@ -439,11 +384,14 @@ function setPrivateThreadProps(raw, worker, workerEvents, terminate) {
439
384
  [$worker]: worker
440
385
  });
441
386
  }
442
- __name(setPrivateThreadProps, "setPrivateThreadProps");
443
387
  async function spawn(worker, options) {
444
388
  debugSpawn("Initializing new thread");
445
389
  const timeout = options && options.timeout ? options.timeout : initMessageTimeout;
446
- const initMessage = await withTimeout(receiveInitMessage(worker), timeout, `Timeout: Did not receive an init message from worker after ${timeout}ms. Make sure the worker calls expose().`);
390
+ const initMessage = await withTimeout(
391
+ receiveInitMessage(worker),
392
+ timeout,
393
+ `Timeout: Did not receive an init message from worker after ${timeout}ms. Make sure the worker calls expose().`
394
+ );
447
395
  const exposed = initMessage.exposed;
448
396
  const { termination, terminate } = createTerminator(worker);
449
397
  const events = createEventObservable(worker, termination);
@@ -458,7 +406,6 @@ async function spawn(worker, options) {
458
406
  throw new Error(`Worker init message states unexpected type of expose(): ${type}`);
459
407
  }
460
408
  }
461
- __name(spawn, "spawn");
462
409
  export {
463
410
  spawn
464
411
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/master/spawn.ts","../../../src/serializers.ts","../../../src/common.ts","../../../src/promise.ts","../../../src/symbols.ts","../../../src/types/master.ts","../../../src/master/invocation-proxy.ts","../../../src/observable-promise.ts","../../../src/transferable.ts","../../../src/types/messages.ts"],"sourcesContent":["/* eslint-disable import-x/no-internal-modules */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-floating-promises */\nimport DebugLogger from 'debug'\nimport { Observable } from 'observable-fns'\n\nimport { deserialize } from '../common.ts'\nimport { createPromiseWithResolver } from '../promise.ts'\nimport {\n $errors, $events, $terminate, $worker,\n} from '../symbols.ts'\nimport type {\n FunctionThread,\n ModuleThread,\n PrivateThreadProps,\n StripAsync,\n Worker as WorkerType,\n WorkerEvent,\n WorkerInternalErrorEvent,\n WorkerMessageEvent,\n WorkerTerminationEvent,\n} from '../types/master.ts'\nimport { WorkerEventType } from '../types/master.ts'\nimport type { WorkerInitMessage, WorkerUncaughtErrorMessage } from '../types/messages.ts'\nimport type { WorkerFunction, WorkerModule } from '../types/worker.ts'\nimport { createProxyFunction, createProxyModule } from './invocation-proxy.ts'\n\ntype ArbitraryWorkerInterface = WorkerFunction & WorkerModule<string> & { somekeythatisneverusedinproductioncode123: 'magicmarker123' }\ntype ArbitraryThreadType = FunctionThread<any, any> & ModuleThread<any>\n\nexport type ExposedToThreadType<Exposed extends WorkerFunction | WorkerModule<any>> =\n Exposed extends ArbitraryWorkerInterface ? ArbitraryThreadType\n : Exposed extends WorkerFunction ? FunctionThread<Parameters<Exposed>, StripAsync<ReturnType<Exposed>>>\n : Exposed extends WorkerModule<any> ? ModuleThread<Exposed>\n : never\n\nconst debugMessages = DebugLogger('threads:master:messages')\nconst debugSpawn = DebugLogger('threads:master:spawn')\nconst debugThreadUtils = DebugLogger('threads:master:thread-utils')\n\nconst isInitMessage = (data: any): data is WorkerInitMessage => data && data.type === ('init' as const)\nconst isUncaughtErrorMessage = (data: any): data is WorkerUncaughtErrorMessage => data && data.type === ('uncaughtError' as const)\n\nconst initMessageTimeout\n = typeof process !== 'undefined' && process.env !== undefined && process.env.THREADS_WORKER_INIT_TIMEOUT\n ? Number.parseInt(process.env.THREADS_WORKER_INIT_TIMEOUT, 10)\n : 10_000\n\nasync function withTimeout<T>(promise: Promise<T>, timeoutInMs: number, errorMessage: string): Promise<T> {\n let timeoutHandle: any\n\n const timeout = new Promise<never>((resolve, reject) => {\n timeoutHandle = setTimeout(() => reject(new Error(errorMessage)), timeoutInMs)\n })\n const result = await Promise.race([promise, timeout])\n\n clearTimeout(timeoutHandle)\n return result\n}\n\nfunction receiveInitMessage(worker: WorkerType): Promise<WorkerInitMessage> {\n return new Promise((resolve, reject) => {\n const messageHandler = ((event: MessageEvent) => {\n debugMessages('Message from worker before finishing initialization:', event.data)\n if (isInitMessage(event.data)) {\n worker.removeEventListener('message', messageHandler)\n resolve(event.data)\n } else if (isUncaughtErrorMessage(event.data)) {\n worker.removeEventListener('message', messageHandler)\n reject(deserialize(event.data.error))\n }\n }) as EventListener\n worker.addEventListener('message', messageHandler)\n })\n}\n\nfunction createEventObservable(worker: WorkerType, workerTermination: Promise<any>): Observable<WorkerEvent> {\n return new Observable<WorkerEvent>((observer) => {\n const messageHandler = ((messageEvent: MessageEvent) => {\n const workerEvent: WorkerMessageEvent<any> = {\n data: messageEvent.data,\n type: WorkerEventType.message,\n }\n observer.next(workerEvent)\n }) as EventListener\n const rejectionHandler = ((errorEvent: PromiseRejectionEvent) => {\n debugThreadUtils('Unhandled promise rejection event in thread:', errorEvent)\n const workerEvent: WorkerInternalErrorEvent = {\n error: new Error(errorEvent.reason),\n type: WorkerEventType.internalError,\n }\n observer.next(workerEvent)\n }) as EventListener\n worker.addEventListener('message', messageHandler)\n worker.addEventListener('unhandledrejection', rejectionHandler)\n\n workerTermination.then(() => {\n const terminationEvent: WorkerTerminationEvent = { type: WorkerEventType.termination }\n worker.removeEventListener('message', messageHandler)\n worker.removeEventListener('unhandledrejection', rejectionHandler)\n observer.next(terminationEvent)\n observer.complete()\n })\n })\n}\n\nfunction createTerminator(worker: WorkerType): { terminate: () => Promise<void>; termination: Promise<void> } {\n const [termination, resolver] = createPromiseWithResolver<void>()\n const terminate = async () => {\n debugThreadUtils('Terminating worker')\n // Newer versions of worker_threads workers return a promise\n await worker.terminate()\n resolver()\n }\n return { terminate, termination }\n}\n\nfunction setPrivateThreadProps<T>(\n raw: T,\n worker: WorkerType,\n workerEvents: Observable<WorkerEvent>,\n terminate: () => Promise<void>,\n): T & PrivateThreadProps {\n const workerErrors = workerEvents\n .filter(event => event.type === WorkerEventType.internalError)\n .map(errorEvent => (errorEvent as WorkerInternalErrorEvent).error)\n\n return Object.assign(raw as any, {\n [$errors]: workerErrors,\n [$events]: workerEvents,\n [$terminate]: terminate,\n [$worker]: worker,\n })\n}\n\n/**\n * Spawn a new thread. Takes a fresh worker instance, wraps it in a thin\n * abstraction layer to provide the transparent API and verifies that\n * the worker has initialized successfully.\n *\n * @param worker Instance of `Worker`. Either a web worker, `worker_threads` worker or `tiny-worker` worker.\n * @param [options]\n * @param [options.timeout] Init message timeout. Default: 10000 or set by environment variable.\n */\nexport async function spawn<Exposed extends WorkerFunction | WorkerModule<any> = ArbitraryWorkerInterface>(\n worker: WorkerType,\n options?: { timeout?: number },\n): Promise<ExposedToThreadType<Exposed>> {\n debugSpawn('Initializing new thread')\n\n const timeout = options && options.timeout ? options.timeout : initMessageTimeout\n const initMessage = await withTimeout(\n receiveInitMessage(worker),\n timeout,\n `Timeout: Did not receive an init message from worker after ${timeout}ms. Make sure the worker calls expose().`,\n )\n const exposed = initMessage.exposed\n\n const { termination, terminate } = createTerminator(worker)\n const events = createEventObservable(worker, termination)\n\n if (exposed.type === 'function') {\n const proxy = createProxyFunction(worker)\n return setPrivateThreadProps(proxy, worker, events, terminate) as ExposedToThreadType<Exposed>\n } else if (exposed.type === 'module') {\n const proxy = createProxyModule(worker, exposed.methods)\n return setPrivateThreadProps(proxy, worker, events, terminate) as ExposedToThreadType<Exposed>\n } else {\n const type = (exposed as WorkerInitMessage['exposed']).type\n throw new Error(`Worker init message states unexpected type of expose(): ${type}`)\n }\n}\n","/* eslint-disable import-x/no-internal-modules */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { SerializedError } from './types/messages.ts'\n\nexport interface Serializer<Msg = JsonSerializable, Input = any> {\n deserialize(message: Msg): Input\n serialize(input: Input): Msg\n}\n\nexport interface SerializerImplementation<Msg = JsonSerializable, Input = any> {\n deserialize(message: Msg, defaultDeserialize: (msg: Msg) => Input): Input\n serialize(input: Input, defaultSerialize: (inp: Input) => Msg): Msg\n}\n\nexport function extendSerializer<MessageType, InputType = any>(\n extend: Serializer<MessageType, InputType>,\n implementation: SerializerImplementation<MessageType, InputType>,\n): Serializer<MessageType, InputType> {\n const fallbackDeserializer = extend.deserialize.bind(extend)\n const fallbackSerializer = extend.serialize.bind(extend)\n\n return {\n deserialize(message: MessageType): InputType {\n return implementation.deserialize(message, fallbackDeserializer)\n },\n\n serialize(input: InputType): MessageType {\n return implementation.serialize(input, fallbackSerializer)\n },\n }\n}\n\ntype JsonSerializablePrimitive = string | number | boolean | null\n\ntype JsonSerializableObject = {\n [key: string]: JsonSerializablePrimitive | JsonSerializablePrimitive[] | JsonSerializableObject | JsonSerializableObject[] | undefined\n}\n\nexport type JsonSerializable = JsonSerializablePrimitive | JsonSerializablePrimitive[] | JsonSerializableObject | JsonSerializableObject[]\n\nconst DefaultErrorSerializer: Serializer<SerializedError, Error> = {\n deserialize(message: SerializedError): Error {\n return Object.assign(new Error(message.message), {\n name: message.name,\n stack: message.stack,\n })\n },\n serialize(error: Error): SerializedError {\n return {\n __error_marker: '$$error',\n message: error.message,\n name: error.name,\n stack: error.stack,\n }\n },\n}\n\nconst isSerializedError = (thing: any): thing is SerializedError =>\n thing && typeof thing === 'object' && '__error_marker' in thing && thing.__error_marker === '$$error'\n\nexport const DefaultSerializer: Serializer<JsonSerializable> = {\n deserialize(message: JsonSerializable): any {\n return isSerializedError(message) ? DefaultErrorSerializer.deserialize(message) : message\n },\n serialize(input: any): JsonSerializable {\n return input instanceof Error ? (DefaultErrorSerializer.serialize(input) as any as JsonSerializable) : input\n },\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type {\n JsonSerializable, Serializer, SerializerImplementation,\n} from './serializers.ts'\nimport { DefaultSerializer, extendSerializer } from './serializers.ts'\n\ndeclare global {\n var registeredSerializer: Serializer<JsonSerializable>\n}\n\nglobalThis.registeredSerializer = globalThis.registeredSerializer ?? DefaultSerializer\n\nexport function registerSerializer(serializer: SerializerImplementation<JsonSerializable>) {\n globalThis.registeredSerializer = extendSerializer(globalThis.registeredSerializer, serializer)\n}\n\nexport function deserialize(message: JsonSerializable): any {\n return globalThis.registeredSerializer.deserialize(message)\n}\n\nexport function serialize(input: any): JsonSerializable {\n return globalThis.registeredSerializer.serialize(input)\n}\n","// eslint-disable-next-line unicorn/no-useless-undefined\nconst doNothing = () => undefined\n\n/**\n * Creates a new promise and exposes its resolver function.\n * Use with care!\n */\nexport function createPromiseWithResolver<T>(): [Promise<T>, (result: T) => void] {\n let alreadyResolved = false\n let resolvedTo: T\n let resolver: (value: T | PromiseLike<T>) => void = doNothing\n\n const promise = new Promise<T>((resolve) => {\n if (alreadyResolved) {\n resolve(resolvedTo)\n } else {\n resolver = resolve\n }\n })\n const exposedResolver = (value: T) => {\n alreadyResolved = true\n resolvedTo = value\n resolver(resolvedTo)\n }\n return [promise, exposedResolver]\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 @typescript-eslint/no-explicit-any */\n/// <reference lib=\"dom\" />\n// tslint:disable max-classes-per-file\n\n// Cannot use `compilerOptions.esModuleInterop` and default import syntax\n// See <https://github.com/microsoft/TypeScript/issues/28009>\nimport type { Observable } from 'observable-fns'\n\nimport type { ObservablePromise } from '../observable-promise.ts'\nimport type {\n $errors, $events, $terminate, $worker,\n} from '../symbols.ts'\nimport type { TransferDescriptor } from '../transferable.ts'\n\ninterface ObservableLikeSubscription {\n unsubscribe(): any\n}\ninterface ObservableLike<T> {\n subscribe(onNext: (value: T) => any, onError?: (error: any) => any, onComplete?: () => any): ObservableLikeSubscription\n subscribe(listeners: { complete?(): any; error?(error: any): any; next?(value: T): any }): ObservableLikeSubscription\n}\n\nexport type StripAsync<Type> =\n Type extends Promise<infer PromiseBaseType> ? PromiseBaseType\n : Type extends ObservableLike<infer ObservableBaseType> ? ObservableBaseType\n : Type\n\ntype StripTransfer<Type> = Type extends TransferDescriptor<infer BaseType> ? BaseType : Type\n\nexport type ModuleMethods = { [methodName: string]: (...args: any) => any }\n\ntype ProxyableArgs<Args extends any[]> =\n Args extends [arg0: infer Arg0, ...rest: infer RestArgs] ? [Arg0 extends Transferable ? Arg0 | TransferDescriptor<Arg0> : Arg0, ...RestArgs] : Args\n\nexport type ProxyableFunction<Args extends any[], ReturnType> =\n Args extends [] ? () => ObservablePromise<StripTransfer<StripAsync<ReturnType>>>\n : (...args: ProxyableArgs<Args>) => ObservablePromise<StripTransfer<StripAsync<ReturnType>>>\n\nexport type ModuleProxy<Methods extends ModuleMethods> = {\n [method in keyof Methods]: ProxyableFunction<Parameters<Methods[method]>, ReturnType<Methods[method]>>\n}\n\nexport interface PrivateThreadProps {\n [$errors]: Observable<Error>\n [$events]: Observable<WorkerEvent>\n [$terminate]: () => Promise<void>\n [$worker]: Worker\n}\n\nexport type FunctionThread<Args extends any[] = any[], ReturnType = any> = ProxyableFunction<Args, ReturnType> & PrivateThreadProps\nexport type ModuleThread<Methods extends ModuleMethods = any> = ModuleProxy<Methods> & PrivateThreadProps\n\n// We have those extra interfaces to keep the general non-specific `Thread` type\n// as an interface, so it's displayed concisely in any TypeScript compiler output.\ninterface AnyFunctionThread extends PrivateThreadProps {\n (...args: any[]): ObservablePromise<any>\n}\n\n// tslint:disable-next-line no-empty-interface\ninterface AnyModuleThread extends PrivateThreadProps {\n // Not specifying an index signature here as that would make `ModuleThread` incompatible\n}\n\n/** Worker thread. Either a `FunctionThread` or a `ModuleThread`. */\nexport type Thread = AnyFunctionThread | AnyModuleThread\n\nexport type TransferList = Transferable[]\n\n/** Worker instance. Either a web worker or a node.js Worker provided by `worker_threads` or `tiny-worker`. */\nexport interface Worker extends EventTarget {\n postMessage(value: any, transferList?: TransferList): void\n /** In nodejs 10+ return type is Promise while with tiny-worker and in browser return type is void */\n terminate(callback?: (error?: Error, exitCode?: number) => void): void | Promise<number>\n}\nexport interface ThreadsWorkerOptions extends WorkerOptions {\n /** Whether to apply CORS protection workaround. Defaults to true. */\n CORSWorkaround?: boolean\n /** Prefix for the path passed to the Worker constructor. Web worker only. */\n _baseURL?: string\n /** Resource limits passed on to Node worker_threads */\n resourceLimits?: {\n /** The size of a pre-allocated memory range used for generated code. */\n codeRangeSizeMb?: number\n /** The maximum size of the main heap in MB. */\n maxOldGenerationSizeMb?: number\n /** The maximum size of a heap space for recently created objects. */\n maxYoungGenerationSizeMb?: number\n }\n /** Data passed on to node.js worker_threads. */\n workerData?: any\n}\n\n/** Worker implementation. Either web worker or a node.js Worker class. */\nexport declare class WorkerImplementation extends EventTarget implements Worker {\n constructor(path: string, options?: ThreadsWorkerOptions)\n postMessage(value: any, transferList?: TransferList): void\n terminate(): void | Promise<number>\n}\n\n/** Class to spawn workers from a blob or source string. */\nexport declare class BlobWorker extends WorkerImplementation {\n constructor(blob: Blob, options?: ThreadsWorkerOptions)\n static fromText(source: string, options?: ThreadsWorkerOptions): WorkerImplementation\n}\n\nexport interface ImplementationExport {\n blob: typeof BlobWorker\n default: typeof WorkerImplementation\n}\n\n/** Event as emitted by worker thread. Subscribe to using `Thread.events(thread)`. */\nexport enum WorkerEventType {\n internalError = 'internalError',\n message = 'message',\n termination = 'termination',\n}\n\nexport interface WorkerInternalErrorEvent {\n error: Error\n type: WorkerEventType.internalError\n}\n\nexport interface WorkerMessageEvent<Data> {\n data: Data\n type: WorkerEventType.message\n}\n\nexport interface WorkerTerminationEvent {\n type: WorkerEventType.termination\n}\n\nexport type WorkerEvent = WorkerInternalErrorEvent | WorkerMessageEvent<any> | WorkerTerminationEvent\n","/// <reference lib=\"webworker\" />\n\n/* eslint-disable import-x/no-internal-modules */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/*\n * This source file contains the code for proxying calls in the master thread to calls in the workers\n * by `.postMessage()`-ing.\n *\n * Keep in mind that this code can make or break the program's performance! Need to optimize more…\n */\n\nimport DebugLogger from 'debug'\nimport { multicast, Observable } from 'observable-fns'\n\nimport { deserialize, serialize } from '../common.ts'\nimport { ObservablePromise } from '../observable-promise.ts'\nimport { isTransferDescriptor } from '../transferable.ts'\nimport type {\n ModuleMethods, ModuleProxy, ProxyableFunction, Worker as WorkerType,\n} from '../types/master.ts'\nimport type {\n MasterJobCancelMessage,\n MasterJobRunMessage,\n WorkerJobErrorMessage,\n WorkerJobResultMessage,\n WorkerJobStartMessage,\n} from '../types/messages.ts'\nimport {\n MasterMessageType,\n WorkerMessageType,\n} from '../types/messages.ts'\n\nconst debugMessages = DebugLogger('threads:master:messages')\n\nlet nextJobUID = 1\n\nconst dedupe = <T>(array: T[]): T[] => [...new Set(array)]\n\nconst isJobErrorMessage = (data: any): data is WorkerJobErrorMessage => data && data.type === WorkerMessageType.error\nconst isJobResultMessage = (data: any): data is WorkerJobResultMessage => data && data.type === WorkerMessageType.result\nconst isJobStartMessage = (data: any): data is WorkerJobStartMessage => data && data.type === WorkerMessageType.running\n\nfunction createObservableForJob<ResultType>(worker: WorkerType, jobUID: number): Observable<ResultType> {\n return new Observable((observer) => {\n let asyncType: 'observable' | 'promise' | undefined\n\n const messageHandler = ((event: MessageEvent) => {\n debugMessages('Message from worker:', event.data)\n if (!event.data || event.data.uid !== jobUID) return\n\n if (isJobStartMessage(event.data)) {\n asyncType = event.data.resultType\n } else if (isJobResultMessage(event.data)) {\n if (asyncType === 'promise') {\n if (event.data.payload !== undefined) {\n observer.next(deserialize(event.data.payload))\n }\n observer.complete()\n worker.removeEventListener('message', messageHandler)\n } else {\n if (event.data.payload) {\n observer.next(deserialize(event.data.payload))\n }\n if (event.data.complete) {\n observer.complete()\n worker.removeEventListener('message', messageHandler)\n }\n }\n } else if (isJobErrorMessage(event.data)) {\n const error = deserialize(event.data.error as any)\n if (asyncType === 'promise' || !asyncType) {\n observer.error(error)\n } else {\n observer.error(error)\n }\n worker.removeEventListener('message', messageHandler)\n }\n }) as EventListener\n\n worker.addEventListener('message', messageHandler)\n\n return () => {\n if (asyncType === 'observable' || !asyncType) {\n const cancelMessage: MasterJobCancelMessage = {\n type: MasterMessageType.cancel,\n uid: jobUID,\n }\n worker.postMessage(cancelMessage)\n }\n worker.removeEventListener('message', messageHandler)\n }\n })\n}\n\nfunction prepareArguments(rawArgs: any[]): { args: any[]; transferables: Transferable[] } {\n if (rawArgs.length === 0) {\n // Exit early if possible\n return {\n args: [],\n transferables: [],\n }\n }\n\n const args: any[] = []\n const transferables: Transferable[] = []\n\n for (const arg of rawArgs) {\n if (isTransferDescriptor(arg)) {\n args.push(serialize(arg.send))\n transferables.push(...arg.transferables)\n } else {\n args.push(serialize(arg))\n }\n }\n\n return {\n args,\n transferables: transferables.length === 0 ? transferables : dedupe(transferables),\n }\n}\n\nexport function createProxyFunction<Args extends any[], ReturnType>(worker: WorkerType, method?: string) {\n return ((...rawArgs: Args) => {\n const uid = nextJobUID++\n const { args, transferables } = prepareArguments(rawArgs)\n const runMessage: MasterJobRunMessage = {\n args,\n method,\n type: MasterMessageType.run,\n uid,\n }\n\n debugMessages('Sending command to run function to worker:', runMessage)\n\n try {\n worker.postMessage(runMessage, transferables)\n } catch (error) {\n return ObservablePromise.from(Promise.reject(error))\n }\n\n return ObservablePromise.from(multicast(createObservableForJob<ReturnType>(worker, uid)))\n }) as any as ProxyableFunction<Args, ReturnType>\n}\n\nexport function createProxyModule<Methods extends ModuleMethods>(worker: WorkerType, methodNames: string[]): ModuleProxy<Methods> {\n const proxy: any = {}\n\n for (const methodName of methodNames) {\n proxy[methodName] = createProxyFunction(worker, methodName)\n }\n\n return proxy\n}\n","/* eslint-disable unicorn/no-thenable */\n/* eslint-disable @typescript-eslint/member-ordering */\n/* eslint-disable @typescript-eslint/no-floating-promises */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-this-alias */\n/* eslint-disable unicorn/no-this-assignment */\nimport type { ObservableLike, SubscriptionObserver } from 'observable-fns'\nimport { Observable } from 'observable-fns'\n\ntype OnFulfilled<T, Result = void> = (value: T) => Result\ntype OnRejected<Result = void> = (error: Error) => Result\n\ntype Initializer<T> = (observer: SubscriptionObserver<T>) => UnsubscribeFn | void\n\ntype Thenable<T> = { then: (onFulfilled?: (value: T) => any, onRejected?: (error: any) => any) => any }\n\ntype UnsubscribeFn = () => void\n\nconst doNothing = () => {}\nconst returnInput = <T>(input: T): T => input\nconst runDeferred = (fn: () => void) => Promise.resolve().then(fn)\n\nfunction fail(error: Error): never {\n throw error\n}\n\nfunction isThenable(thing: any): thing is Thenable<any> {\n return thing && typeof thing.then === 'function'\n}\n\n/**\n * Creates a hybrid, combining the APIs of an Observable and a Promise.\n *\n * It is used to proxy async process states when we are initially not sure\n * if that async process will yield values once (-> Promise) or multiple\n * times (-> Observable).\n *\n * Note that the observable promise inherits some of the observable's characteristics:\n * The `init` function will be called *once for every time anyone subscribes to it*.\n *\n * If this is undesired, derive a hot observable from it using `makeHot()` and\n * subscribe to that.\n */\nexport class ObservablePromise<T> extends Observable<T> implements Promise<T> {\n readonly [Symbol.toStringTag] = '[object ObservablePromise]'\n private initHasRun = false\n private fulfillmentCallbacks: Array<OnFulfilled<T>> = []\n private rejectionCallbacks: OnRejected[] = []\n\n private firstValue: T | undefined\n private firstValueSet = false\n private rejection: Error | undefined\n private state: 'fulfilled' | 'pending' | 'rejected' = 'pending'\n\n constructor(init: Initializer<T>) {\n super((originalObserver: SubscriptionObserver<T>) => {\n // tslint:disable-next-line no-this-assignment\n const self = this\n const observer: SubscriptionObserver<T> = {\n ...originalObserver,\n complete() {\n originalObserver.complete()\n self.onCompletion()\n },\n error(error: Error) {\n originalObserver.error(error)\n self.onError(error)\n },\n next(value: T) {\n originalObserver.next(value)\n self.onNext(value)\n },\n }\n\n try {\n this.initHasRun = true\n return init(observer)\n } catch (error) {\n observer.error(error)\n }\n })\n }\n\n private onNext(value: T) {\n if (!this.firstValueSet) {\n this.firstValue = value\n this.firstValueSet = true\n }\n }\n\n private onError(error: Error) {\n this.state = 'rejected'\n this.rejection = error\n\n for (const onRejected of this.rejectionCallbacks) {\n // Promisifying the call to turn errors into unhandled promise rejections\n // instead of them failing sync and cancelling the iteration\n runDeferred(() => onRejected(error))\n }\n }\n\n private onCompletion() {\n this.state = 'fulfilled'\n\n for (const onFulfilled of this.fulfillmentCallbacks) {\n // Promisifying the call to turn errors into unhandled promise rejections\n // instead of them failing sync and cancelling the iteration\n runDeferred(() => onFulfilled(this.firstValue as T))\n }\n }\n\n then<TResult1 = T, TResult2 = never>(\n onFulfilledRaw?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null,\n onRejectedRaw?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null,\n ): Promise<TResult1 | TResult2> {\n const onFulfilled: OnFulfilled<T, TResult1> = onFulfilledRaw || (returnInput as any)\n const onRejected = onRejectedRaw || fail\n let onRejectedCalled = false\n\n return new Promise<TResult1 | TResult2>((resolve, reject) => {\n const rejectionCallback = (error: Error) => {\n if (onRejectedCalled) return\n onRejectedCalled = true\n\n try {\n resolve(onRejected(error))\n } catch (anotherError) {\n reject(anotherError)\n }\n }\n const fulfillmentCallback = (value: T) => {\n try {\n resolve(onFulfilled(value))\n } catch (ex) {\n const error = ex as Error\n rejectionCallback(error)\n }\n }\n if (!this.initHasRun) {\n this.subscribe({ error: rejectionCallback })\n }\n if (this.state === 'fulfilled') {\n return resolve(onFulfilled(this.firstValue as T))\n }\n if (this.state === 'rejected') {\n onRejectedCalled = true\n return resolve(onRejected(this.rejection as Error))\n }\n this.fulfillmentCallbacks.push(fulfillmentCallback)\n this.rejectionCallbacks.push(rejectionCallback)\n })\n }\n\n catch<Result = never>(onRejected: ((error: Error) => Promise<Result> | Result) | null | undefined) {\n return this.then(undefined, onRejected) as Promise<Result>\n }\n\n finally(onCompleted?: (() => void) | null | undefined) {\n const handler = onCompleted || doNothing\n return this.then(\n (value: T) => {\n handler()\n return value\n },\n () => handler(),\n ) as Promise<T>\n }\n\n static override from<T>(thing: Observable<T> | ObservableLike<T> | ArrayLike<T> | Thenable<T>): ObservablePromise<T> {\n return isThenable(thing)\n ? new ObservablePromise((observer) => {\n const onFulfilled = (value: T) => {\n observer.next(value)\n observer.complete()\n }\n const onRejected = (error: any) => {\n observer.error(error)\n }\n thing.then(onFulfilled, onRejected)\n })\n : (super.from(thing) as ObservablePromise<T>)\n }\n}\n","/// <reference lib=\"webworker\" />\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { $transferable } from './symbols.ts'\n\nexport interface TransferDescriptor<T = any> {\n [$transferable]: true\n send: T\n transferables: Transferable[]\n}\n\nfunction isTransferable(thing: any): thing is Transferable {\n if (!thing || typeof thing !== 'object') return false\n // Don't check too thoroughly, since the list of transferable things in JS might grow over time\n return true\n}\n\nexport function isTransferDescriptor(thing: any): thing is TransferDescriptor {\n return thing && typeof thing === 'object' && thing[$transferable]\n}\n\n/**\n * Mark a transferable object as such, so it will no be serialized and\n * deserialized on messaging with the main thread, but to transfer\n * ownership of it to the receiving thread.\n *\n * Only works with array buffers, message ports and few more special\n * types of objects, but it's much faster than serializing and\n * deserializing them.\n *\n * Note:\n * The transferable object cannot be accessed by this thread again\n * unless the receiving thread transfers it back again!\n *\n * @param transferable Array buffer, message port or similar.\n * @see <https://developers.google.com/web/updates/2011/12/Transferable-Objects-Lightning-Fast>\n */\nexport function Transfer(transferable: Transferable): TransferDescriptor\n\n/**\n * Mark transferable objects within an arbitrary object or array as\n * being a transferable object. They will then not be serialized\n * and deserialized on messaging with the main thread, but ownership\n * of them will be tranferred to the receiving thread.\n *\n * Only array buffers, message ports and few more special types of\n * objects can be transferred, but it's much faster than serializing and\n * deserializing them.\n *\n * Note:\n * The transferable object cannot be accessed by this thread again\n * unless the receiving thread transfers it back again!\n *\n * @param transferable Array buffer, message port or similar.\n * @see <https://developers.google.com/web/updates/2011/12/Transferable-Objects-Lightning-Fast>\n */\nexport function Transfer<T>(payload: T, transferables: Transferable[]): TransferDescriptor\n\nexport function Transfer<T>(payload: T, transferables?: Transferable[]): TransferDescriptor {\n console.log('Transfer')\n if (!transferables) {\n if (!isTransferable(payload)) throw new Error('Not transferable')\n transferables = [payload]\n }\n\n return {\n [$transferable]: true,\n send: payload,\n transferables,\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/member-ordering */\nexport interface SerializedError {\n __error_marker: '$$error'\n message: string\n name: string\n stack?: string\n}\n\n/////////////////////////////\n// Messages sent by master:\n\nexport enum MasterMessageType {\n cancel = 'cancel',\n run = 'run',\n}\n\nexport type MasterJobCancelMessage = {\n type: MasterMessageType.cancel\n uid: number\n}\n\nexport type MasterJobRunMessage = {\n type: MasterMessageType.run\n uid: number\n method?: string\n args: any[]\n}\n\n////////////////////////////\n// Messages sent by worker:\n\nexport enum WorkerMessageType {\n error = 'error',\n init = 'init',\n result = 'result',\n running = 'running',\n uncaughtError = 'uncaughtError',\n}\n\nexport type WorkerUncaughtErrorMessage = {\n type: WorkerMessageType.uncaughtError\n error: {\n message: string\n name: string\n stack?: string\n }\n}\n\nexport type WorkerInitMessage = {\n type: WorkerMessageType.init\n exposed: { type: 'function' } | { type: 'module'; methods: string[] }\n}\n\nexport type WorkerJobErrorMessage = {\n type: WorkerMessageType.error\n uid: number\n error: SerializedError\n}\n\nexport type WorkerJobResultMessage = {\n type: WorkerMessageType.result\n uid: number\n complete?: true\n payload?: any\n}\n\nexport type WorkerJobStartMessage = {\n type: WorkerMessageType.running\n uid: number\n resultType: 'observable' | 'promise'\n}\n"],"mappings":"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","names":["DebugLogger","Observable","DefaultErrorSerializer","deserialize","message","Object","assign","Error","name","stack","serialize","error","__error_marker","isSerializedError","thing","DefaultSerializer","input","globalThis","registeredSerializer","DefaultSerializer","deserialize","message","globalThis","registeredSerializer","serialize","input","doNothing","undefined","createPromiseWithResolver","alreadyResolved","resolvedTo","resolver","promise","Promise","resolve","exposedResolver","value","$errors","Symbol","$events","$terminate","$transferable","$worker","WorkerEventType","DebugLogger","multicast","Observable","Observable","doNothing","returnInput","input","runDeferred","fn","Promise","resolve","then","fail","error","isThenable","thing","ObservablePromise","Observable","Symbol","toStringTag","initHasRun","fulfillmentCallbacks","rejectionCallbacks","firstValue","firstValueSet","rejection","state","init","originalObserver","self","observer","complete","onCompletion","onError","next","value","onNext","onRejected","onFulfilled","onFulfilledRaw","onRejectedRaw","onRejectedCalled","reject","rejectionCallback","anotherError","fulfillmentCallback","ex","subscribe","push","catch","undefined","finally","onCompleted","handler","from","isTransferDescriptor","thing","$transferable","MasterMessageType","WorkerMessageType","debugMessages","DebugLogger","nextJobUID","dedupe","array","Set","isJobErrorMessage","data","type","WorkerMessageType","error","isJobResultMessage","result","isJobStartMessage","running","createObservableForJob","worker","jobUID","Observable","observer","asyncType","messageHandler","event","uid","resultType","payload","undefined","next","deserialize","complete","removeEventListener","addEventListener","cancelMessage","MasterMessageType","cancel","postMessage","prepareArguments","rawArgs","length","args","transferables","arg","isTransferDescriptor","push","serialize","send","createProxyFunction","method","runMessage","run","ObservablePromise","from","Promise","reject","multicast","createProxyModule","methodNames","proxy","methodName","debugMessages","DebugLogger","debugSpawn","debugThreadUtils","isInitMessage","data","type","isUncaughtErrorMessage","initMessageTimeout","process","env","undefined","THREADS_WORKER_INIT_TIMEOUT","Number","parseInt","withTimeout","promise","timeoutInMs","errorMessage","timeoutHandle","timeout","Promise","resolve","reject","setTimeout","Error","result","race","clearTimeout","receiveInitMessage","worker","messageHandler","event","removeEventListener","deserialize","error","addEventListener","createEventObservable","workerTermination","Observable","observer","messageEvent","workerEvent","WorkerEventType","message","next","rejectionHandler","errorEvent","reason","internalError","then","terminationEvent","termination","complete","createTerminator","resolver","createPromiseWithResolver","terminate","setPrivateThreadProps","raw","workerEvents","workerErrors","filter","map","Object","assign","$errors","$events","$terminate","$worker","spawn","options","initMessage","exposed","events","proxy","createProxyFunction","createProxyModule","methods"]}
1
+ {"version":3,"sources":["../../../src/master/spawn.ts","../../../src/serializers.ts","../../../src/common.ts","../../../src/promise.ts","../../../src/symbols.ts","../../../src/master/invocation-proxy.ts","../../../src/observable-promise.ts","../../../src/transferable.ts"],"sourcesContent":["/* eslint-disable import-x/no-internal-modules */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-floating-promises */\nimport DebugLogger from 'debug'\nimport { Observable } from 'observable-fns'\n\nimport { deserialize } from '../common.ts'\nimport { createPromiseWithResolver } from '../promise.ts'\nimport {\n $errors, $events, $terminate, $worker,\n} from '../symbols.ts'\nimport type {\n FunctionThread,\n ModuleThread,\n PrivateThreadProps,\n StripAsync,\n Worker as WorkerType,\n WorkerEvent,\n WorkerInternalErrorEvent,\n WorkerMessageEvent,\n WorkerTerminationEvent,\n} from '../types/master.ts'\nimport { WorkerEventType } from '../types/master.ts'\nimport type { WorkerInitMessage, WorkerUncaughtErrorMessage } from '../types/messages.ts'\nimport type { WorkerFunction, WorkerModule } from '../types/worker.ts'\nimport { createProxyFunction, createProxyModule } from './invocation-proxy.ts'\n\ntype ArbitraryWorkerInterface = WorkerFunction & WorkerModule<string> & { somekeythatisneverusedinproductioncode123: 'magicmarker123' }\ntype ArbitraryThreadType = FunctionThread<any, any> & ModuleThread<any>\n\nexport type ExposedToThreadType<Exposed extends WorkerFunction | WorkerModule<any>> =\n Exposed extends ArbitraryWorkerInterface ? ArbitraryThreadType\n : Exposed extends WorkerFunction ? FunctionThread<Parameters<Exposed>, StripAsync<ReturnType<Exposed>>>\n : Exposed extends WorkerModule<any> ? ModuleThread<Exposed>\n : never\n\nconst debugMessages = DebugLogger('threads:master:messages')\nconst debugSpawn = DebugLogger('threads:master:spawn')\nconst debugThreadUtils = DebugLogger('threads:master:thread-utils')\n\nconst isInitMessage = (data: any): data is WorkerInitMessage => data && data.type === ('init' as const)\nconst isUncaughtErrorMessage = (data: any): data is WorkerUncaughtErrorMessage => data && data.type === ('uncaughtError' as const)\n\nconst initMessageTimeout\n = typeof process !== 'undefined' && process.env !== undefined && process.env.THREADS_WORKER_INIT_TIMEOUT\n ? Number.parseInt(process.env.THREADS_WORKER_INIT_TIMEOUT, 10)\n : 10_000\n\nasync function withTimeout<T>(promise: Promise<T>, timeoutInMs: number, errorMessage: string): Promise<T> {\n let timeoutHandle: any\n\n const timeout = new Promise<never>((resolve, reject) => {\n timeoutHandle = setTimeout(() => reject(new Error(errorMessage)), timeoutInMs)\n })\n const result = await Promise.race([promise, timeout])\n\n clearTimeout(timeoutHandle)\n return result\n}\n\nfunction receiveInitMessage(worker: WorkerType): Promise<WorkerInitMessage> {\n return new Promise((resolve, reject) => {\n const messageHandler = ((event: MessageEvent) => {\n debugMessages('Message from worker before finishing initialization:', event.data)\n if (isInitMessage(event.data)) {\n worker.removeEventListener('message', messageHandler)\n resolve(event.data)\n } else if (isUncaughtErrorMessage(event.data)) {\n worker.removeEventListener('message', messageHandler)\n reject(deserialize(event.data.error))\n }\n }) as EventListener\n worker.addEventListener('message', messageHandler)\n })\n}\n\nfunction createEventObservable(worker: WorkerType, workerTermination: Promise<any>): Observable<WorkerEvent> {\n return new Observable<WorkerEvent>((observer) => {\n const messageHandler = ((messageEvent: MessageEvent) => {\n const workerEvent: WorkerMessageEvent<any> = {\n data: messageEvent.data,\n type: WorkerEventType.message,\n }\n observer.next(workerEvent)\n }) as EventListener\n const rejectionHandler = ((errorEvent: PromiseRejectionEvent) => {\n debugThreadUtils('Unhandled promise rejection event in thread:', errorEvent)\n const workerEvent: WorkerInternalErrorEvent = {\n error: new Error(errorEvent.reason),\n type: WorkerEventType.internalError,\n }\n observer.next(workerEvent)\n }) as EventListener\n worker.addEventListener('message', messageHandler)\n worker.addEventListener('unhandledrejection', rejectionHandler)\n\n workerTermination.then(() => {\n const terminationEvent: WorkerTerminationEvent = { type: WorkerEventType.termination }\n worker.removeEventListener('message', messageHandler)\n worker.removeEventListener('unhandledrejection', rejectionHandler)\n observer.next(terminationEvent)\n observer.complete()\n })\n })\n}\n\nfunction createTerminator(worker: WorkerType): { terminate: () => Promise<void>; termination: Promise<void> } {\n const [termination, resolver] = createPromiseWithResolver<void>()\n const terminate = async () => {\n debugThreadUtils('Terminating worker')\n // Newer versions of worker_threads workers return a promise\n await worker.terminate()\n resolver()\n }\n return { terminate, termination }\n}\n\nfunction setPrivateThreadProps<T>(\n raw: T,\n worker: WorkerType,\n workerEvents: Observable<WorkerEvent>,\n terminate: () => Promise<void>,\n): T & PrivateThreadProps {\n const workerErrors = workerEvents\n .filter(event => event.type === WorkerEventType.internalError)\n .map(errorEvent => (errorEvent as WorkerInternalErrorEvent).error)\n\n return Object.assign(raw as any, {\n [$errors]: workerErrors,\n [$events]: workerEvents,\n [$terminate]: terminate,\n [$worker]: worker,\n })\n}\n\n/**\n * Spawn a new thread. Takes a fresh worker instance, wraps it in a thin\n * abstraction layer to provide the transparent API and verifies that\n * the worker has initialized successfully.\n *\n * @param worker Instance of `Worker`. Either a web worker, `worker_threads` worker or `tiny-worker` worker.\n * @param [options]\n * @param [options.timeout] Init message timeout. Default: 10000 or set by environment variable.\n */\nexport async function spawn<Exposed extends WorkerFunction | WorkerModule<any> = ArbitraryWorkerInterface>(\n worker: WorkerType,\n options?: { timeout?: number },\n): Promise<ExposedToThreadType<Exposed>> {\n debugSpawn('Initializing new thread')\n\n const timeout = options && options.timeout ? options.timeout : initMessageTimeout\n const initMessage = await withTimeout(\n receiveInitMessage(worker),\n timeout,\n `Timeout: Did not receive an init message from worker after ${timeout}ms. Make sure the worker calls expose().`,\n )\n const exposed = initMessage.exposed\n\n const { termination, terminate } = createTerminator(worker)\n const events = createEventObservable(worker, termination)\n\n if (exposed.type === 'function') {\n const proxy = createProxyFunction(worker)\n return setPrivateThreadProps(proxy, worker, events, terminate) as ExposedToThreadType<Exposed>\n } else if (exposed.type === 'module') {\n const proxy = createProxyModule(worker, exposed.methods)\n return setPrivateThreadProps(proxy, worker, events, terminate) as ExposedToThreadType<Exposed>\n } else {\n const type = (exposed as WorkerInitMessage['exposed']).type\n throw new Error(`Worker init message states unexpected type of expose(): ${type}`)\n }\n}\n","/* eslint-disable import-x/no-internal-modules */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { SerializedError } from './types/messages.ts'\n\nexport interface Serializer<Msg = JsonSerializable, Input = any> {\n deserialize(message: Msg): Input\n serialize(input: Input): Msg\n}\n\nexport interface SerializerImplementation<Msg = JsonSerializable, Input = any> {\n deserialize(message: Msg, defaultDeserialize: (msg: Msg) => Input): Input\n serialize(input: Input, defaultSerialize: (inp: Input) => Msg): Msg\n}\n\nexport function extendSerializer<MessageType, InputType = any>(\n extend: Serializer<MessageType, InputType>,\n implementation: SerializerImplementation<MessageType, InputType>,\n): Serializer<MessageType, InputType> {\n const fallbackDeserializer = extend.deserialize.bind(extend)\n const fallbackSerializer = extend.serialize.bind(extend)\n\n return {\n deserialize(message: MessageType): InputType {\n return implementation.deserialize(message, fallbackDeserializer)\n },\n\n serialize(input: InputType): MessageType {\n return implementation.serialize(input, fallbackSerializer)\n },\n }\n}\n\ntype JsonSerializablePrimitive = string | number | boolean | null\n\ntype JsonSerializableObject = {\n [key: string]: JsonSerializablePrimitive | JsonSerializablePrimitive[] | JsonSerializableObject | JsonSerializableObject[] | undefined\n}\n\nexport type JsonSerializable = JsonSerializablePrimitive | JsonSerializablePrimitive[] | JsonSerializableObject | JsonSerializableObject[]\n\nconst DefaultErrorSerializer: Serializer<SerializedError, Error> = {\n deserialize(message: SerializedError): Error {\n return Object.assign(new Error(message.message), {\n name: message.name,\n stack: message.stack,\n })\n },\n serialize(error: Error): SerializedError {\n return {\n __error_marker: '$$error',\n message: error.message,\n name: error.name,\n stack: error.stack,\n }\n },\n}\n\nconst isSerializedError = (thing: any): thing is SerializedError =>\n thing && typeof thing === 'object' && '__error_marker' in thing && thing.__error_marker === '$$error'\n\nexport const DefaultSerializer: Serializer<JsonSerializable> = {\n deserialize(message: JsonSerializable): any {\n return isSerializedError(message) ? DefaultErrorSerializer.deserialize(message) : message\n },\n serialize(input: any): JsonSerializable {\n return input instanceof Error ? (DefaultErrorSerializer.serialize(input) as any as JsonSerializable) : input\n },\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type {\n JsonSerializable, Serializer, SerializerImplementation,\n} from './serializers.ts'\nimport { DefaultSerializer, extendSerializer } from './serializers.ts'\n\ndeclare global {\n var registeredSerializer: Serializer<JsonSerializable>\n}\n\nglobalThis.registeredSerializer = globalThis.registeredSerializer ?? DefaultSerializer\n\nexport function registerSerializer(serializer: SerializerImplementation<JsonSerializable>) {\n globalThis.registeredSerializer = extendSerializer(globalThis.registeredSerializer, serializer)\n}\n\nexport function deserialize(message: JsonSerializable): any {\n return globalThis.registeredSerializer.deserialize(message)\n}\n\nexport function serialize(input: any): JsonSerializable {\n return globalThis.registeredSerializer.serialize(input)\n}\n","// eslint-disable-next-line unicorn/no-useless-undefined\nconst doNothing = () => undefined\n\n/**\n * Creates a new promise and exposes its resolver function.\n * Use with care!\n */\nexport function createPromiseWithResolver<T>(): [Promise<T>, (result: T) => void] {\n let alreadyResolved = false\n let resolvedTo: T\n let resolver: (value: T | PromiseLike<T>) => void = doNothing\n\n const promise = new Promise<T>((resolve) => {\n if (alreadyResolved) {\n resolve(resolvedTo)\n } else {\n resolver = resolve\n }\n })\n const exposedResolver = (value: T) => {\n alreadyResolved = true\n resolvedTo = value\n resolver(resolvedTo)\n }\n return [promise, exposedResolver]\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","/// <reference lib=\"webworker\" />\n\n/* eslint-disable import-x/no-internal-modules */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/*\n * This source file contains the code for proxying calls in the master thread to calls in the workers\n * by `.postMessage()`-ing.\n *\n * Keep in mind that this code can make or break the program's performance! Need to optimize more…\n */\n\nimport DebugLogger from 'debug'\nimport { multicast, Observable } from 'observable-fns'\n\nimport { deserialize, serialize } from '../common.ts'\nimport { ObservablePromise } from '../observable-promise.ts'\nimport { isTransferDescriptor } from '../transferable.ts'\nimport type {\n ModuleMethods, ModuleProxy, ProxyableFunction, Worker as WorkerType,\n} from '../types/master.ts'\nimport type {\n MasterJobCancelMessage,\n MasterJobRunMessage,\n WorkerJobErrorMessage,\n WorkerJobResultMessage,\n WorkerJobStartMessage,\n} from '../types/messages.ts'\nimport {\n MasterMessageType,\n WorkerMessageType,\n} from '../types/messages.ts'\n\nconst debugMessages = DebugLogger('threads:master:messages')\n\nlet nextJobUID = 1\n\nconst dedupe = <T>(array: T[]): T[] => [...new Set(array)]\n\nconst isJobErrorMessage = (data: any): data is WorkerJobErrorMessage => data && data.type === WorkerMessageType.error\nconst isJobResultMessage = (data: any): data is WorkerJobResultMessage => data && data.type === WorkerMessageType.result\nconst isJobStartMessage = (data: any): data is WorkerJobStartMessage => data && data.type === WorkerMessageType.running\n\nfunction createObservableForJob<ResultType>(worker: WorkerType, jobUID: number): Observable<ResultType> {\n return new Observable((observer) => {\n let asyncType: 'observable' | 'promise' | undefined\n\n const messageHandler = ((event: MessageEvent) => {\n debugMessages('Message from worker:', event.data)\n if (!event.data || event.data.uid !== jobUID) return\n\n if (isJobStartMessage(event.data)) {\n asyncType = event.data.resultType\n } else if (isJobResultMessage(event.data)) {\n if (asyncType === 'promise') {\n if (event.data.payload !== undefined) {\n observer.next(deserialize(event.data.payload))\n }\n observer.complete()\n worker.removeEventListener('message', messageHandler)\n } else {\n if (event.data.payload) {\n observer.next(deserialize(event.data.payload))\n }\n if (event.data.complete) {\n observer.complete()\n worker.removeEventListener('message', messageHandler)\n }\n }\n } else if (isJobErrorMessage(event.data)) {\n const error = deserialize(event.data.error as any)\n if (asyncType === 'promise' || !asyncType) {\n observer.error(error)\n } else {\n observer.error(error)\n }\n worker.removeEventListener('message', messageHandler)\n }\n }) as EventListener\n\n worker.addEventListener('message', messageHandler)\n\n return () => {\n if (asyncType === 'observable' || !asyncType) {\n const cancelMessage: MasterJobCancelMessage = {\n type: MasterMessageType.cancel,\n uid: jobUID,\n }\n worker.postMessage(cancelMessage)\n }\n worker.removeEventListener('message', messageHandler)\n }\n })\n}\n\nfunction prepareArguments(rawArgs: any[]): { args: any[]; transferables: Transferable[] } {\n if (rawArgs.length === 0) {\n // Exit early if possible\n return {\n args: [],\n transferables: [],\n }\n }\n\n const args: any[] = []\n const transferables: Transferable[] = []\n\n for (const arg of rawArgs) {\n if (isTransferDescriptor(arg)) {\n args.push(serialize(arg.send))\n transferables.push(...arg.transferables)\n } else {\n args.push(serialize(arg))\n }\n }\n\n return {\n args,\n transferables: transferables.length === 0 ? transferables : dedupe(transferables),\n }\n}\n\nexport function createProxyFunction<Args extends any[], ReturnType>(worker: WorkerType, method?: string) {\n return ((...rawArgs: Args) => {\n const uid = nextJobUID++\n const { args, transferables } = prepareArguments(rawArgs)\n const runMessage: MasterJobRunMessage = {\n args,\n method,\n type: MasterMessageType.run,\n uid,\n }\n\n debugMessages('Sending command to run function to worker:', runMessage)\n\n try {\n worker.postMessage(runMessage, transferables)\n } catch (error) {\n return ObservablePromise.from(Promise.reject(error))\n }\n\n return ObservablePromise.from(multicast(createObservableForJob<ReturnType>(worker, uid)))\n }) as any as ProxyableFunction<Args, ReturnType>\n}\n\nexport function createProxyModule<Methods extends ModuleMethods>(worker: WorkerType, methodNames: string[]): ModuleProxy<Methods> {\n const proxy: any = {}\n\n for (const methodName of methodNames) {\n proxy[methodName] = createProxyFunction(worker, methodName)\n }\n\n return proxy\n}\n","/* eslint-disable unicorn/no-thenable */\n/* eslint-disable @typescript-eslint/member-ordering */\n/* eslint-disable @typescript-eslint/no-floating-promises */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-this-alias */\n/* eslint-disable unicorn/no-this-assignment */\nimport type { ObservableLike, SubscriptionObserver } from 'observable-fns'\nimport { Observable } from 'observable-fns'\n\ntype OnFulfilled<T, Result = void> = (value: T) => Result\ntype OnRejected<Result = void> = (error: Error) => Result\n\ntype Initializer<T> = (observer: SubscriptionObserver<T>) => UnsubscribeFn | void\n\ntype Thenable<T> = { then: (onFulfilled?: (value: T) => any, onRejected?: (error: any) => any) => any }\n\ntype UnsubscribeFn = () => void\n\nconst doNothing = () => {}\nconst returnInput = <T>(input: T): T => input\nconst runDeferred = (fn: () => void) => Promise.resolve().then(fn)\n\nfunction fail(error: Error): never {\n throw error\n}\n\nfunction isThenable(thing: any): thing is Thenable<any> {\n return thing && typeof thing.then === 'function'\n}\n\n/**\n * Creates a hybrid, combining the APIs of an Observable and a Promise.\n *\n * It is used to proxy async process states when we are initially not sure\n * if that async process will yield values once (-> Promise) or multiple\n * times (-> Observable).\n *\n * Note that the observable promise inherits some of the observable's characteristics:\n * The `init` function will be called *once for every time anyone subscribes to it*.\n *\n * If this is undesired, derive a hot observable from it using `makeHot()` and\n * subscribe to that.\n */\nexport class ObservablePromise<T> extends Observable<T> implements Promise<T> {\n readonly [Symbol.toStringTag] = '[object ObservablePromise]'\n private initHasRun = false\n private fulfillmentCallbacks: Array<OnFulfilled<T>> = []\n private rejectionCallbacks: OnRejected[] = []\n\n private firstValue: T | undefined\n private firstValueSet = false\n private rejection: Error | undefined\n private state: 'fulfilled' | 'pending' | 'rejected' = 'pending'\n\n constructor(init: Initializer<T>) {\n super((originalObserver: SubscriptionObserver<T>) => {\n // tslint:disable-next-line no-this-assignment\n const self = this\n const observer: SubscriptionObserver<T> = {\n ...originalObserver,\n complete() {\n originalObserver.complete()\n self.onCompletion()\n },\n error(error: Error) {\n originalObserver.error(error)\n self.onError(error)\n },\n next(value: T) {\n originalObserver.next(value)\n self.onNext(value)\n },\n }\n\n try {\n this.initHasRun = true\n return init(observer)\n } catch (error) {\n observer.error(error)\n }\n })\n }\n\n private onNext(value: T) {\n if (!this.firstValueSet) {\n this.firstValue = value\n this.firstValueSet = true\n }\n }\n\n private onError(error: Error) {\n this.state = 'rejected'\n this.rejection = error\n\n for (const onRejected of this.rejectionCallbacks) {\n // Promisifying the call to turn errors into unhandled promise rejections\n // instead of them failing sync and cancelling the iteration\n runDeferred(() => onRejected(error))\n }\n }\n\n private onCompletion() {\n this.state = 'fulfilled'\n\n for (const onFulfilled of this.fulfillmentCallbacks) {\n // Promisifying the call to turn errors into unhandled promise rejections\n // instead of them failing sync and cancelling the iteration\n runDeferred(() => onFulfilled(this.firstValue as T))\n }\n }\n\n then<TResult1 = T, TResult2 = never>(\n onFulfilledRaw?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null,\n onRejectedRaw?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null,\n ): Promise<TResult1 | TResult2> {\n const onFulfilled: OnFulfilled<T, TResult1> = onFulfilledRaw || (returnInput as any)\n const onRejected = onRejectedRaw || fail\n let onRejectedCalled = false\n\n return new Promise<TResult1 | TResult2>((resolve, reject) => {\n const rejectionCallback = (error: Error) => {\n if (onRejectedCalled) return\n onRejectedCalled = true\n\n try {\n resolve(onRejected(error))\n } catch (anotherError) {\n reject(anotherError)\n }\n }\n const fulfillmentCallback = (value: T) => {\n try {\n resolve(onFulfilled(value))\n } catch (ex) {\n const error = ex as Error\n rejectionCallback(error)\n }\n }\n if (!this.initHasRun) {\n this.subscribe({ error: rejectionCallback })\n }\n if (this.state === 'fulfilled') {\n return resolve(onFulfilled(this.firstValue as T))\n }\n if (this.state === 'rejected') {\n onRejectedCalled = true\n return resolve(onRejected(this.rejection as Error))\n }\n this.fulfillmentCallbacks.push(fulfillmentCallback)\n this.rejectionCallbacks.push(rejectionCallback)\n })\n }\n\n catch<Result = never>(onRejected: ((error: Error) => Promise<Result> | Result) | null | undefined) {\n return this.then(undefined, onRejected) as Promise<Result>\n }\n\n finally(onCompleted?: (() => void) | null | undefined) {\n const handler = onCompleted || doNothing\n return this.then(\n (value: T) => {\n handler()\n return value\n },\n () => handler(),\n ) as Promise<T>\n }\n\n static override from<T>(thing: Observable<T> | ObservableLike<T> | ArrayLike<T> | Thenable<T>): ObservablePromise<T> {\n return isThenable(thing)\n ? new ObservablePromise((observer) => {\n const onFulfilled = (value: T) => {\n observer.next(value)\n observer.complete()\n }\n const onRejected = (error: any) => {\n observer.error(error)\n }\n thing.then(onFulfilled, onRejected)\n })\n : (super.from(thing) as ObservablePromise<T>)\n }\n}\n","/// <reference lib=\"webworker\" />\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { $transferable } from './symbols.ts'\n\nexport interface TransferDescriptor<T = any> {\n [$transferable]: true\n send: T\n transferables: Transferable[]\n}\n\nfunction isTransferable(thing: any): thing is Transferable {\n if (!thing || typeof thing !== 'object') return false\n // Don't check too thoroughly, since the list of transferable things in JS might grow over time\n return true\n}\n\nexport function isTransferDescriptor(thing: any): thing is TransferDescriptor {\n return thing && typeof thing === 'object' && thing[$transferable]\n}\n\n/**\n * Mark a transferable object as such, so it will no be serialized and\n * deserialized on messaging with the main thread, but to transfer\n * ownership of it to the receiving thread.\n *\n * Only works with array buffers, message ports and few more special\n * types of objects, but it's much faster than serializing and\n * deserializing them.\n *\n * Note:\n * The transferable object cannot be accessed by this thread again\n * unless the receiving thread transfers it back again!\n *\n * @param transferable Array buffer, message port or similar.\n * @see <https://developers.google.com/web/updates/2011/12/Transferable-Objects-Lightning-Fast>\n */\nexport function Transfer(transferable: Transferable): TransferDescriptor\n\n/**\n * Mark transferable objects within an arbitrary object or array as\n * being a transferable object. They will then not be serialized\n * and deserialized on messaging with the main thread, but ownership\n * of them will be tranferred to the receiving thread.\n *\n * Only array buffers, message ports and few more special types of\n * objects can be transferred, but it's much faster than serializing and\n * deserializing them.\n *\n * Note:\n * The transferable object cannot be accessed by this thread again\n * unless the receiving thread transfers it back again!\n *\n * @param transferable Array buffer, message port or similar.\n * @see <https://developers.google.com/web/updates/2011/12/Transferable-Objects-Lightning-Fast>\n */\nexport function Transfer<T>(payload: T, transferables: Transferable[]): TransferDescriptor\n\nexport function Transfer<T>(payload: T, transferables?: Transferable[]): TransferDescriptor {\n console.log('Transfer')\n if (!transferables) {\n if (!isTransferable(payload)) throw new Error('Not transferable')\n transferables = [payload]\n }\n\n return {\n [$transferable]: true,\n send: payload,\n transferables,\n }\n}\n"],"mappings":"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","names":["DebugLogger","Observable","Observable","doNothing","Observable","debugMessages","DebugLogger","Observable"]}
@@ -1,6 +1,3 @@
1
- var __defProp = Object.defineProperty;
2
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
-
4
1
  // src/symbols.ts
5
2
  var $errors = Symbol("thread.errors");
6
3
  var $events = Symbol("thread.events");
@@ -12,7 +9,6 @@ var $worker = Symbol("thread.worker");
12
9
  function fail(message) {
13
10
  throw new Error(message);
14
11
  }
15
- __name(fail, "fail");
16
12
  var Thread = {
17
13
  /** Return an observable that can be used to subscribe to all errors happening in the thread. */
18
14
  errors(thread) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/symbols.ts","../../../src/master/thread.ts"],"sourcesContent":["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":";;;;AAAO,IAAMA,UAAUC,OAAO,eAAA;AACvB,IAAMC,UAAUD,OAAO,eAAA;AACvB,IAAME,aAAaF,OAAO,kBAAA;AAC1B,IAAMG,gBAAgBH,OAAO,qBAAA;AAC7B,IAAMI,UAAUJ,OAAO,eAAA;;;ACI9B,SAASK,KAAKC,SAAe;AAC3B,QAAM,IAAIC,MAAMD,OAAAA;AAClB;AAFSD;AAOF,IAAMG,SAAS;;EAEpBC,OAAmCC,QAAe;AAChD,WAAOA,OAAOC,OAAAA,KAAYN,KAAK,qGAAA;EACjC;;EAEAO,OAAmCF,QAAe;AAChD,WAAOA,OAAOG,OAAAA,KAAYR,KAAK,sGAAA;EACjC;;EAEAS,UAAsCJ,QAAe;AACnD,WAAOA,OAAOK,UAAAA,EAAW;EAC3B;AACF;","names":["$errors","Symbol","$events","$terminate","$transferable","$worker","fail","message","Error","Thread","errors","thread","$errors","events","$events","terminate","$terminate"]}
1
+ {"version":3,"sources":["../../../src/symbols.ts","../../../src/master/thread.ts"],"sourcesContent":["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":";AAAO,IAAM,UAAU,OAAO,eAAe;AACtC,IAAM,UAAU,OAAO,eAAe;AACtC,IAAM,aAAa,OAAO,kBAAkB;AAC5C,IAAM,gBAAgB,OAAO,qBAAqB;AAClD,IAAM,UAAU,OAAO,eAAe;;;ACI7C,SAAS,KAAK,SAAwB;AACpC,QAAM,IAAI,MAAM,OAAO;AACzB;AAKO,IAAM,SAAS;AAAA;AAAA,EAEpB,OAAmC,QAAoC;AACrE,WAAO,OAAO,OAAO,KAAK,KAAK,qGAAqG;AAAA,EACtI;AAAA;AAAA,EAEA,OAAmC,QAA0C;AAC3E,WAAO,OAAO,OAAO,KAAK,KAAK,sGAAsG;AAAA,EACvI;AAAA;AAAA,EAEA,UAAsC,QAAiB;AACrD,WAAO,OAAO,UAAU,EAAE;AAAA,EAC5B;AACF;","names":[]}