@xylabs/threads 4.12.43 → 4.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/common-Cuiya5FG.d.ts +21 -0
- package/dist/browser/index-browser-B8TCfn7g.d.ts +20 -0
- package/dist/browser/index-browser.d.ts +8 -0
- package/dist/browser/index-browser.mjs +209 -119
- package/dist/browser/index-browser.mjs.map +1 -1
- package/dist/browser/master/implementation.browser.d.ts +9 -0
- package/dist/browser/master/implementation.browser.mjs +36 -11
- package/dist/browser/master/implementation.browser.mjs.map +1 -1
- package/dist/browser/master/index-browser.d.ts +7 -0
- package/dist/browser/master/index-browser.mjs +201 -117
- package/dist/browser/master/index-browser.mjs.map +1 -1
- package/dist/browser/master/pool-browser.d.ts +104 -0
- package/dist/browser/master/pool-browser.mjs +65 -53
- package/dist/browser/master/pool-browser.mjs.map +1 -1
- package/dist/browser/master-D4MAqspp.d.ts +109 -0
- package/dist/browser/transferable-Cv9t618f.d.ts +15 -0
- package/dist/{types → browser}/worker/worker.browser.d.ts +8 -8
- package/dist/browser/worker/worker.browser.mjs +79 -43
- package/dist/browser/worker/worker.browser.mjs.map +1 -1
- package/dist/{types/types/worker.d.ts → browser/worker-04t9iwDh.d.ts} +5 -5
- package/dist/neutral/master/register.d.ts +2 -0
- package/dist/neutral/master/register.mjs +223 -33
- package/dist/neutral/master/register.mjs.map +1 -1
- package/dist/neutral/master/spawn.d.ts +19 -0
- package/dist/neutral/master/spawn.mjs +106 -53
- package/dist/neutral/master/spawn.mjs.map +1 -1
- package/dist/neutral/master/thread.d.ts +12 -0
- package/dist/neutral/master/thread.mjs +4 -0
- package/dist/neutral/master/thread.mjs.map +1 -1
- package/dist/neutral/master-DDdg1BKb.d.ts +74 -0
- package/dist/{types → neutral}/observable-promise.d.ts +5 -18
- package/dist/neutral/observable-promise.mjs +27 -20
- package/dist/neutral/observable-promise.mjs.map +1 -1
- package/dist/neutral/observable.d.ts +13 -0
- package/dist/neutral/observable.mjs +12 -3
- package/dist/neutral/observable.mjs.map +1 -1
- package/dist/{types → neutral}/types/messages.d.ts +12 -11
- package/dist/neutral/types/messages.mjs +19 -0
- package/dist/neutral/types/messages.mjs.map +1 -0
- package/dist/node/common-Cuiya5FG.d.ts +21 -0
- package/dist/node/index-node-DB1sNl0d.d.ts +66 -0
- package/dist/node/index-node.d.ts +8 -0
- package/dist/node/index-node.mjs +396 -141
- package/dist/node/index-node.mjs.map +1 -1
- package/dist/node/master/implementation.node.d.ts +9 -0
- package/dist/node/master/implementation.node.mjs +223 -33
- package/dist/node/master/implementation.node.mjs.map +1 -1
- package/dist/node/master/index-node.d.ts +7 -0
- package/dist/node/master/index-node.mjs +388 -139
- package/dist/node/master/index-node.mjs.map +1 -1
- package/dist/node/master/pool-node.d.ts +51 -0
- package/dist/node/master/pool-node.mjs +285 -86
- package/dist/node/master/pool-node.mjs.map +1 -1
- package/dist/node/master-BjjSaJAj.d.ts +109 -0
- package/dist/{types/master/pool-types.d.ts → node/pool-types-Bzei07Nj.d.ts} +16 -24
- package/dist/node/transferable-Cv9t618f.d.ts +15 -0
- package/dist/{types → node}/worker/worker.node.d.ts +11 -10
- package/dist/node/worker/worker.node.mjs +80 -43
- package/dist/node/worker/worker.node.mjs.map +1 -1
- package/dist/node/worker-04t9iwDh.d.ts +12 -0
- package/package.json +29 -22
- package/src/master/invocation-proxy.ts +2 -0
- package/src/transferable.ts +2 -0
- package/src/types/worker.ts +1 -0
- package/src/worker/WorkerGlobalScope.ts +1 -0
- package/src/worker/worker.browser.ts +1 -1
- package/dist/types/common.d.ts +0 -8
- package/dist/types/common.d.ts.map +0 -1
- package/dist/types/index-browser.d.ts +0 -9
- package/dist/types/index-browser.d.ts.map +0 -1
- package/dist/types/index-node.d.ts +0 -9
- package/dist/types/index-node.d.ts.map +0 -1
- package/dist/types/master/get-bundle-url.browser.d.ts +0 -3
- package/dist/types/master/get-bundle-url.browser.d.ts.map +0 -1
- package/dist/types/master/implementation.browser.d.ts +0 -5
- package/dist/types/master/implementation.browser.d.ts.map +0 -1
- package/dist/types/master/implementation.node.d.ts +0 -5
- package/dist/types/master/implementation.node.d.ts.map +0 -1
- package/dist/types/master/index-browser.d.ts +0 -13
- package/dist/types/master/index-browser.d.ts.map +0 -1
- package/dist/types/master/index-node.d.ts +0 -13
- package/dist/types/master/index-node.d.ts.map +0 -1
- package/dist/types/master/invocation-proxy.d.ts +0 -4
- package/dist/types/master/invocation-proxy.d.ts.map +0 -1
- package/dist/types/master/pool-browser.d.ts +0 -93
- package/dist/types/master/pool-browser.d.ts.map +0 -1
- package/dist/types/master/pool-node.d.ts +0 -93
- package/dist/types/master/pool-node.d.ts.map +0 -1
- package/dist/types/master/pool-types.d.ts.map +0 -1
- package/dist/types/master/register.d.ts +0 -2
- package/dist/types/master/register.d.ts.map +0 -1
- package/dist/types/master/spawn.d.ts +0 -21
- package/dist/types/master/spawn.d.ts.map +0 -1
- package/dist/types/master/thread.d.ts +0 -13
- package/dist/types/master/thread.d.ts.map +0 -1
- package/dist/types/observable-promise.d.ts.map +0 -1
- package/dist/types/observable.d.ts +0 -21
- package/dist/types/observable.d.ts.map +0 -1
- package/dist/types/promise.d.ts +0 -6
- package/dist/types/promise.d.ts.map +0 -1
- package/dist/types/serializers.d.ts +0 -17
- package/dist/types/serializers.d.ts.map +0 -1
- package/dist/types/symbols.d.ts +0 -6
- package/dist/types/symbols.d.ts.map +0 -1
- package/dist/types/transferable.d.ts +0 -43
- package/dist/types/transferable.d.ts.map +0 -1
- package/dist/types/types/master.d.ts +0 -99
- package/dist/types/types/master.d.ts.map +0 -1
- package/dist/types/types/messages.d.ts.map +0 -1
- package/dist/types/types/worker.d.ts.map +0 -1
- package/dist/types/worker/WorkerGlobalScope.d.ts +0 -6
- package/dist/types/worker/WorkerGlobalScope.d.ts.map +0 -1
- package/dist/types/worker/expose.d.ts +0 -4
- package/dist/types/worker/expose.d.ts.map +0 -1
- package/dist/types/worker/worker.browser.d.ts.map +0 -1
- package/dist/types/worker/worker.node.d.ts.map +0 -1
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
|
|
1
4
|
// src/master/spawn.ts
|
|
2
5
|
import DebugLogger2 from "debug";
|
|
3
6
|
import { Observable as Observable3 } from "observable-fns";
|
|
@@ -19,7 +22,7 @@ var DefaultErrorSerializer = {
|
|
|
19
22
|
};
|
|
20
23
|
}
|
|
21
24
|
};
|
|
22
|
-
var isSerializedError = (thing) => thing && typeof thing === "object" && "__error_marker" in thing && thing.__error_marker === "$$error";
|
|
25
|
+
var isSerializedError = /* @__PURE__ */ __name((thing) => thing && typeof thing === "object" && "__error_marker" in thing && thing.__error_marker === "$$error", "isSerializedError");
|
|
23
26
|
var DefaultSerializer = {
|
|
24
27
|
deserialize(message) {
|
|
25
28
|
return isSerializedError(message) ? DefaultErrorSerializer.deserialize(message) : message;
|
|
@@ -34,12 +37,14 @@ globalThis.registeredSerializer = globalThis.registeredSerializer ?? DefaultSeri
|
|
|
34
37
|
function deserialize(message) {
|
|
35
38
|
return globalThis.registeredSerializer.deserialize(message);
|
|
36
39
|
}
|
|
40
|
+
__name(deserialize, "deserialize");
|
|
37
41
|
function serialize(input) {
|
|
38
42
|
return globalThis.registeredSerializer.serialize(input);
|
|
39
43
|
}
|
|
44
|
+
__name(serialize, "serialize");
|
|
40
45
|
|
|
41
46
|
// src/promise.ts
|
|
42
|
-
var doNothing = () => void 0;
|
|
47
|
+
var doNothing = /* @__PURE__ */ __name(() => void 0, "doNothing");
|
|
43
48
|
function createPromiseWithResolver() {
|
|
44
49
|
let alreadyResolved = false;
|
|
45
50
|
let resolvedTo;
|
|
@@ -51,13 +56,17 @@ function createPromiseWithResolver() {
|
|
|
51
56
|
resolver = resolve;
|
|
52
57
|
}
|
|
53
58
|
});
|
|
54
|
-
const exposedResolver = (value) => {
|
|
59
|
+
const exposedResolver = /* @__PURE__ */ __name((value) => {
|
|
55
60
|
alreadyResolved = true;
|
|
56
61
|
resolvedTo = value;
|
|
57
62
|
resolver(resolvedTo);
|
|
58
|
-
};
|
|
59
|
-
return [
|
|
63
|
+
}, "exposedResolver");
|
|
64
|
+
return [
|
|
65
|
+
promise,
|
|
66
|
+
exposedResolver
|
|
67
|
+
];
|
|
60
68
|
}
|
|
69
|
+
__name(createPromiseWithResolver, "createPromiseWithResolver");
|
|
61
70
|
|
|
62
71
|
// src/symbols.ts
|
|
63
72
|
var $errors = Symbol("thread.errors");
|
|
@@ -66,23 +75,36 @@ var $terminate = Symbol("thread.terminate");
|
|
|
66
75
|
var $transferable = Symbol("thread.transferable");
|
|
67
76
|
var $worker = Symbol("thread.worker");
|
|
68
77
|
|
|
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
|
+
|
|
69
86
|
// src/master/invocation-proxy.ts
|
|
70
87
|
import DebugLogger from "debug";
|
|
71
88
|
import { multicast, Observable as Observable2 } from "observable-fns";
|
|
72
89
|
|
|
73
90
|
// src/observable-promise.ts
|
|
74
91
|
import { Observable } from "observable-fns";
|
|
75
|
-
var doNothing2 = () => {
|
|
76
|
-
};
|
|
77
|
-
var returnInput = (input) => input;
|
|
78
|
-
var runDeferred = (fn) => Promise.resolve().then(fn);
|
|
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");
|
|
79
96
|
function fail(error) {
|
|
80
97
|
throw error;
|
|
81
98
|
}
|
|
99
|
+
__name(fail, "fail");
|
|
82
100
|
function isThenable(thing) {
|
|
83
101
|
return thing && typeof thing.then === "function";
|
|
84
102
|
}
|
|
103
|
+
__name(isThenable, "isThenable");
|
|
85
104
|
var ObservablePromise = class _ObservablePromise extends Observable {
|
|
105
|
+
static {
|
|
106
|
+
__name(this, "ObservablePromise");
|
|
107
|
+
}
|
|
86
108
|
[Symbol.toStringTag] = "[object ObservablePromise]";
|
|
87
109
|
initHasRun = false;
|
|
88
110
|
fulfillmentCallbacks = [];
|
|
@@ -141,7 +163,7 @@ var ObservablePromise = class _ObservablePromise extends Observable {
|
|
|
141
163
|
const onRejected = onRejectedRaw || fail;
|
|
142
164
|
let onRejectedCalled = false;
|
|
143
165
|
return new Promise((resolve, reject) => {
|
|
144
|
-
const rejectionCallback = (error) => {
|
|
166
|
+
const rejectionCallback = /* @__PURE__ */ __name((error) => {
|
|
145
167
|
if (onRejectedCalled) return;
|
|
146
168
|
onRejectedCalled = true;
|
|
147
169
|
try {
|
|
@@ -149,17 +171,19 @@ var ObservablePromise = class _ObservablePromise extends Observable {
|
|
|
149
171
|
} catch (anotherError) {
|
|
150
172
|
reject(anotherError);
|
|
151
173
|
}
|
|
152
|
-
};
|
|
153
|
-
const fulfillmentCallback = (value) => {
|
|
174
|
+
}, "rejectionCallback");
|
|
175
|
+
const fulfillmentCallback = /* @__PURE__ */ __name((value) => {
|
|
154
176
|
try {
|
|
155
177
|
resolve(onFulfilled(value));
|
|
156
178
|
} catch (ex) {
|
|
157
179
|
const error = ex;
|
|
158
180
|
rejectionCallback(error);
|
|
159
181
|
}
|
|
160
|
-
};
|
|
182
|
+
}, "fulfillmentCallback");
|
|
161
183
|
if (!this.initHasRun) {
|
|
162
|
-
this.subscribe({
|
|
184
|
+
this.subscribe({
|
|
185
|
+
error: rejectionCallback
|
|
186
|
+
});
|
|
163
187
|
}
|
|
164
188
|
if (this.state === "fulfilled") {
|
|
165
189
|
return resolve(onFulfilled(this.firstValue));
|
|
@@ -177,23 +201,20 @@ var ObservablePromise = class _ObservablePromise extends Observable {
|
|
|
177
201
|
}
|
|
178
202
|
finally(onCompleted) {
|
|
179
203
|
const handler = onCompleted || doNothing2;
|
|
180
|
-
return this.then(
|
|
181
|
-
(
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
},
|
|
185
|
-
() => handler()
|
|
186
|
-
);
|
|
204
|
+
return this.then((value) => {
|
|
205
|
+
handler();
|
|
206
|
+
return value;
|
|
207
|
+
}, () => handler());
|
|
187
208
|
}
|
|
188
209
|
static from(thing) {
|
|
189
210
|
return isThenable(thing) ? new _ObservablePromise((observer) => {
|
|
190
|
-
const onFulfilled = (value) => {
|
|
211
|
+
const onFulfilled = /* @__PURE__ */ __name((value) => {
|
|
191
212
|
observer.next(value);
|
|
192
213
|
observer.complete();
|
|
193
|
-
};
|
|
194
|
-
const onRejected = (error) => {
|
|
214
|
+
}, "onFulfilled");
|
|
215
|
+
const onRejected = /* @__PURE__ */ __name((error) => {
|
|
195
216
|
observer.error(error);
|
|
196
|
-
};
|
|
217
|
+
}, "onRejected");
|
|
197
218
|
thing.then(onFulfilled, onRejected);
|
|
198
219
|
}) : super.from(thing);
|
|
199
220
|
}
|
|
@@ -203,18 +224,36 @@ var ObservablePromise = class _ObservablePromise extends Observable {
|
|
|
203
224
|
function isTransferDescriptor(thing) {
|
|
204
225
|
return thing && typeof thing === "object" && thing[$transferable];
|
|
205
226
|
}
|
|
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
|
+
}({});
|
|
206
243
|
|
|
207
244
|
// src/master/invocation-proxy.ts
|
|
208
245
|
var debugMessages = DebugLogger("threads:master:messages");
|
|
209
246
|
var nextJobUID = 1;
|
|
210
|
-
var dedupe = (array) => [
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
var
|
|
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");
|
|
214
253
|
function createObservableForJob(worker, jobUID) {
|
|
215
254
|
return new Observable2((observer) => {
|
|
216
255
|
let asyncType;
|
|
217
|
-
const messageHandler = (event) => {
|
|
256
|
+
const messageHandler = /* @__PURE__ */ __name((event) => {
|
|
218
257
|
debugMessages("Message from worker:", event.data);
|
|
219
258
|
if (!event.data || event.data.uid !== jobUID) return;
|
|
220
259
|
if (isJobStartMessage(event.data)) {
|
|
@@ -244,12 +283,12 @@ function createObservableForJob(worker, jobUID) {
|
|
|
244
283
|
}
|
|
245
284
|
worker.removeEventListener("message", messageHandler);
|
|
246
285
|
}
|
|
247
|
-
};
|
|
286
|
+
}, "messageHandler");
|
|
248
287
|
worker.addEventListener("message", messageHandler);
|
|
249
288
|
return () => {
|
|
250
289
|
if (asyncType === "observable" || !asyncType) {
|
|
251
290
|
const cancelMessage = {
|
|
252
|
-
type:
|
|
291
|
+
type: MasterMessageType.cancel,
|
|
253
292
|
uid: jobUID
|
|
254
293
|
};
|
|
255
294
|
worker.postMessage(cancelMessage);
|
|
@@ -258,6 +297,7 @@ function createObservableForJob(worker, jobUID) {
|
|
|
258
297
|
};
|
|
259
298
|
});
|
|
260
299
|
}
|
|
300
|
+
__name(createObservableForJob, "createObservableForJob");
|
|
261
301
|
function prepareArguments(rawArgs) {
|
|
262
302
|
if (rawArgs.length === 0) {
|
|
263
303
|
return {
|
|
@@ -280,6 +320,7 @@ function prepareArguments(rawArgs) {
|
|
|
280
320
|
transferables: transferables.length === 0 ? transferables : dedupe(transferables)
|
|
281
321
|
};
|
|
282
322
|
}
|
|
323
|
+
__name(prepareArguments, "prepareArguments");
|
|
283
324
|
function createProxyFunction(worker, method) {
|
|
284
325
|
return (...rawArgs) => {
|
|
285
326
|
const uid = nextJobUID++;
|
|
@@ -287,7 +328,7 @@ function createProxyFunction(worker, method) {
|
|
|
287
328
|
const runMessage = {
|
|
288
329
|
args,
|
|
289
330
|
method,
|
|
290
|
-
type:
|
|
331
|
+
type: MasterMessageType.run,
|
|
291
332
|
uid
|
|
292
333
|
};
|
|
293
334
|
debugMessages("Sending command to run function to worker:", runMessage);
|
|
@@ -299,6 +340,7 @@ function createProxyFunction(worker, method) {
|
|
|
299
340
|
return ObservablePromise.from(multicast(createObservableForJob(worker, uid)));
|
|
300
341
|
};
|
|
301
342
|
}
|
|
343
|
+
__name(createProxyFunction, "createProxyFunction");
|
|
302
344
|
function createProxyModule(worker, methodNames) {
|
|
303
345
|
const proxy = {};
|
|
304
346
|
for (const methodName of methodNames) {
|
|
@@ -306,26 +348,31 @@ function createProxyModule(worker, methodNames) {
|
|
|
306
348
|
}
|
|
307
349
|
return proxy;
|
|
308
350
|
}
|
|
351
|
+
__name(createProxyModule, "createProxyModule");
|
|
309
352
|
|
|
310
353
|
// src/master/spawn.ts
|
|
311
354
|
var debugMessages2 = DebugLogger2("threads:master:messages");
|
|
312
355
|
var debugSpawn = DebugLogger2("threads:master:spawn");
|
|
313
356
|
var debugThreadUtils = DebugLogger2("threads:master:thread-utils");
|
|
314
|
-
var isInitMessage = (data) => data && data.type === "init";
|
|
315
|
-
var isUncaughtErrorMessage = (data) => data && data.type === "uncaughtError";
|
|
357
|
+
var isInitMessage = /* @__PURE__ */ __name((data) => data && data.type === "init", "isInitMessage");
|
|
358
|
+
var isUncaughtErrorMessage = /* @__PURE__ */ __name((data) => data && data.type === "uncaughtError", "isUncaughtErrorMessage");
|
|
316
359
|
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;
|
|
317
360
|
async function withTimeout(promise, timeoutInMs, errorMessage) {
|
|
318
361
|
let timeoutHandle;
|
|
319
362
|
const timeout = new Promise((resolve, reject) => {
|
|
320
363
|
timeoutHandle = setTimeout(() => reject(new Error(errorMessage)), timeoutInMs);
|
|
321
364
|
});
|
|
322
|
-
const result = await Promise.race([
|
|
365
|
+
const result = await Promise.race([
|
|
366
|
+
promise,
|
|
367
|
+
timeout
|
|
368
|
+
]);
|
|
323
369
|
clearTimeout(timeoutHandle);
|
|
324
370
|
return result;
|
|
325
371
|
}
|
|
372
|
+
__name(withTimeout, "withTimeout");
|
|
326
373
|
function receiveInitMessage(worker) {
|
|
327
374
|
return new Promise((resolve, reject) => {
|
|
328
|
-
const messageHandler = (event) => {
|
|
375
|
+
const messageHandler = /* @__PURE__ */ __name((event) => {
|
|
329
376
|
debugMessages2("Message from worker before finishing initialization:", event.data);
|
|
330
377
|
if (isInitMessage(event.data)) {
|
|
331
378
|
worker.removeEventListener("message", messageHandler);
|
|
@@ -334,31 +381,34 @@ function receiveInitMessage(worker) {
|
|
|
334
381
|
worker.removeEventListener("message", messageHandler);
|
|
335
382
|
reject(deserialize(event.data.error));
|
|
336
383
|
}
|
|
337
|
-
};
|
|
384
|
+
}, "messageHandler");
|
|
338
385
|
worker.addEventListener("message", messageHandler);
|
|
339
386
|
});
|
|
340
387
|
}
|
|
388
|
+
__name(receiveInitMessage, "receiveInitMessage");
|
|
341
389
|
function createEventObservable(worker, workerTermination) {
|
|
342
390
|
return new Observable3((observer) => {
|
|
343
|
-
const messageHandler = (messageEvent) => {
|
|
391
|
+
const messageHandler = /* @__PURE__ */ __name((messageEvent) => {
|
|
344
392
|
const workerEvent = {
|
|
345
393
|
data: messageEvent.data,
|
|
346
|
-
type:
|
|
394
|
+
type: WorkerEventType.message
|
|
347
395
|
};
|
|
348
396
|
observer.next(workerEvent);
|
|
349
|
-
};
|
|
350
|
-
const rejectionHandler = (errorEvent) => {
|
|
397
|
+
}, "messageHandler");
|
|
398
|
+
const rejectionHandler = /* @__PURE__ */ __name((errorEvent) => {
|
|
351
399
|
debugThreadUtils("Unhandled promise rejection event in thread:", errorEvent);
|
|
352
400
|
const workerEvent = {
|
|
353
401
|
error: new Error(errorEvent.reason),
|
|
354
|
-
type:
|
|
402
|
+
type: WorkerEventType.internalError
|
|
355
403
|
};
|
|
356
404
|
observer.next(workerEvent);
|
|
357
|
-
};
|
|
405
|
+
}, "rejectionHandler");
|
|
358
406
|
worker.addEventListener("message", messageHandler);
|
|
359
407
|
worker.addEventListener("unhandledrejection", rejectionHandler);
|
|
360
408
|
workerTermination.then(() => {
|
|
361
|
-
const terminationEvent = {
|
|
409
|
+
const terminationEvent = {
|
|
410
|
+
type: WorkerEventType.termination
|
|
411
|
+
};
|
|
362
412
|
worker.removeEventListener("message", messageHandler);
|
|
363
413
|
worker.removeEventListener("unhandledrejection", rejectionHandler);
|
|
364
414
|
observer.next(terminationEvent);
|
|
@@ -366,17 +416,22 @@ function createEventObservable(worker, workerTermination) {
|
|
|
366
416
|
});
|
|
367
417
|
});
|
|
368
418
|
}
|
|
419
|
+
__name(createEventObservable, "createEventObservable");
|
|
369
420
|
function createTerminator(worker) {
|
|
370
421
|
const [termination, resolver] = createPromiseWithResolver();
|
|
371
|
-
const terminate = async () => {
|
|
422
|
+
const terminate = /* @__PURE__ */ __name(async () => {
|
|
372
423
|
debugThreadUtils("Terminating worker");
|
|
373
424
|
await worker.terminate();
|
|
374
425
|
resolver();
|
|
426
|
+
}, "terminate");
|
|
427
|
+
return {
|
|
428
|
+
terminate,
|
|
429
|
+
termination
|
|
375
430
|
};
|
|
376
|
-
return { terminate, termination };
|
|
377
431
|
}
|
|
432
|
+
__name(createTerminator, "createTerminator");
|
|
378
433
|
function setPrivateThreadProps(raw, worker, workerEvents, terminate) {
|
|
379
|
-
const workerErrors = workerEvents.filter((event) => event.type ===
|
|
434
|
+
const workerErrors = workerEvents.filter((event) => event.type === WorkerEventType.internalError).map((errorEvent) => errorEvent.error);
|
|
380
435
|
return Object.assign(raw, {
|
|
381
436
|
[$errors]: workerErrors,
|
|
382
437
|
[$events]: workerEvents,
|
|
@@ -384,14 +439,11 @@ function setPrivateThreadProps(raw, worker, workerEvents, terminate) {
|
|
|
384
439
|
[$worker]: worker
|
|
385
440
|
});
|
|
386
441
|
}
|
|
442
|
+
__name(setPrivateThreadProps, "setPrivateThreadProps");
|
|
387
443
|
async function spawn(worker, options) {
|
|
388
444
|
debugSpawn("Initializing new thread");
|
|
389
445
|
const timeout = options && options.timeout ? options.timeout : initMessageTimeout;
|
|
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
|
-
);
|
|
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().`);
|
|
395
447
|
const exposed = initMessage.exposed;
|
|
396
448
|
const { termination, terminate } = createTerminator(worker);
|
|
397
449
|
const events = createEventObservable(worker, termination);
|
|
@@ -406,6 +458,7 @@ async function spawn(worker, options) {
|
|
|
406
458
|
throw new Error(`Worker init message states unexpected type of expose(): ${type}`);
|
|
407
459
|
}
|
|
408
460
|
}
|
|
461
|
+
__name(spawn, "spawn");
|
|
409
462
|
export {
|
|
410
463
|
spawn
|
|
411
464
|
};
|
|
@@ -1 +1 @@
|
|
|
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","/* 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","/* 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
|
+
{"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"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Observable } from 'observable-fns';
|
|
2
|
+
import { T as Thread$1, W as WorkerEvent } from '../master-DDdg1BKb.js';
|
|
3
|
+
import '../observable-promise.js';
|
|
4
|
+
|
|
5
|
+
type Thread = Thread$1;
|
|
6
|
+
declare const Thread: {
|
|
7
|
+
errors<ThreadT extends Thread$1>(thread: ThreadT): Observable<Error>;
|
|
8
|
+
events<ThreadT extends Thread$1>(thread: ThreadT): Observable<WorkerEvent>;
|
|
9
|
+
terminate<ThreadT extends Thread$1>(thread: ThreadT): Promise<void>;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export { Thread };
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
|
|
1
4
|
// src/symbols.ts
|
|
2
5
|
var $errors = Symbol("thread.errors");
|
|
3
6
|
var $events = Symbol("thread.events");
|
|
@@ -9,6 +12,7 @@ var $worker = Symbol("thread.worker");
|
|
|
9
12
|
function fail(message) {
|
|
10
13
|
throw new Error(message);
|
|
11
14
|
}
|
|
15
|
+
__name(fail, "fail");
|
|
12
16
|
var Thread = {
|
|
13
17
|
/** Return an observable that can be used to subscribe to all errors happening in the thread. */
|
|
14
18
|
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":"
|
|
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"]}
|