@ariestools/threads 8.0.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/LICENSE +21 -0
- package/README.md +946 -0
- package/dist/browser/common.d.ts +22 -0
- package/dist/browser/common.d.ts.map +1 -0
- package/dist/browser/index-browser.d.ts +9 -0
- package/dist/browser/index-browser.d.ts.map +1 -0
- package/dist/browser/index-browser.mjs +844 -0
- package/dist/browser/index-browser.mjs.map +7 -0
- package/dist/browser/index-node.d.ts +9 -0
- package/dist/browser/index-node.d.ts.map +1 -0
- package/dist/browser/isObservable.d.ts +2 -0
- package/dist/browser/isObservable.d.ts.map +1 -0
- package/dist/browser/master/get-bundle-url.browser.d.ts +4 -0
- package/dist/browser/master/get-bundle-url.browser.d.ts.map +1 -0
- package/dist/browser/master/implementation.browser.d.ts +14 -0
- package/dist/browser/master/implementation.browser.d.ts.map +1 -0
- package/dist/browser/master/implementation.browser.mjs +90 -0
- package/dist/browser/master/implementation.browser.mjs.map +7 -0
- package/dist/browser/master/implementation.node.d.ts +14 -0
- package/dist/browser/master/implementation.node.d.ts.map +1 -0
- package/dist/browser/master/index-browser.d.ts +13 -0
- package/dist/browser/master/index-browser.d.ts.map +1 -0
- package/dist/browser/master/index-browser.mjs +813 -0
- package/dist/browser/master/index-browser.mjs.map +7 -0
- package/dist/browser/master/index-node.d.ts +13 -0
- package/dist/browser/master/index-node.d.ts.map +1 -0
- package/dist/browser/master/invocation-proxy.d.ts +16 -0
- package/dist/browser/master/invocation-proxy.d.ts.map +1 -0
- package/dist/browser/master/pool-browser.d.ts +93 -0
- package/dist/browser/master/pool-browser.d.ts.map +1 -0
- package/dist/browser/master/pool-browser.mjs +308 -0
- package/dist/browser/master/pool-browser.mjs.map +7 -0
- package/dist/browser/master/pool-node.d.ts +93 -0
- package/dist/browser/master/pool-node.d.ts.map +1 -0
- package/dist/browser/master/pool-types.d.ts +68 -0
- package/dist/browser/master/pool-types.d.ts.map +1 -0
- package/dist/browser/master/register.d.ts +2 -0
- package/dist/browser/master/register.d.ts.map +1 -0
- package/dist/browser/master/spawn.d.ts +22 -0
- package/dist/browser/master/spawn.d.ts.map +1 -0
- package/dist/browser/master/thread.d.ts +14 -0
- package/dist/browser/master/thread.d.ts.map +1 -0
- package/dist/browser/observable-promise.d.ts +41 -0
- package/dist/browser/observable-promise.d.ts.map +1 -0
- package/dist/browser/observable.d.ts +24 -0
- package/dist/browser/observable.d.ts.map +1 -0
- package/dist/browser/promise.d.ts +6 -0
- package/dist/browser/promise.d.ts.map +1 -0
- package/dist/browser/serializers.d.ts +27 -0
- package/dist/browser/serializers.d.ts.map +1 -0
- package/dist/browser/symbols.d.ts +11 -0
- package/dist/browser/symbols.d.ts.map +1 -0
- package/dist/browser/transferable.d.ts +49 -0
- package/dist/browser/transferable.d.ts.map +1 -0
- package/dist/browser/types/master.d.ts +111 -0
- package/dist/browser/types/master.d.ts.map +1 -0
- package/dist/browser/types/messages.d.ts +71 -0
- package/dist/browser/types/messages.d.ts.map +1 -0
- package/dist/browser/types/worker.d.ts +13 -0
- package/dist/browser/types/worker.d.ts.map +1 -0
- package/dist/browser/worker/WorkerGlobalScope.d.ts +7 -0
- package/dist/browser/worker/WorkerGlobalScope.d.ts.map +1 -0
- package/dist/browser/worker/expose.d.ts +10 -0
- package/dist/browser/worker/expose.d.ts.map +1 -0
- package/dist/browser/worker/worker.browser.d.ts +20 -0
- package/dist/browser/worker/worker.browser.d.ts.map +1 -0
- package/dist/browser/worker/worker.browser.mjs +300 -0
- package/dist/browser/worker/worker.browser.mjs.map +7 -0
- package/dist/browser/worker/worker.node.d.ts +34 -0
- package/dist/browser/worker/worker.node.d.ts.map +1 -0
- package/dist/neutral/common.d.ts +22 -0
- package/dist/neutral/common.d.ts.map +1 -0
- package/dist/neutral/index-browser.d.ts +9 -0
- package/dist/neutral/index-browser.d.ts.map +1 -0
- package/dist/neutral/index-node.d.ts +9 -0
- package/dist/neutral/index-node.d.ts.map +1 -0
- package/dist/neutral/isObservable.d.ts +2 -0
- package/dist/neutral/isObservable.d.ts.map +1 -0
- package/dist/neutral/master/get-bundle-url.browser.d.ts +4 -0
- package/dist/neutral/master/get-bundle-url.browser.d.ts.map +1 -0
- package/dist/neutral/master/implementation.browser.d.ts +14 -0
- package/dist/neutral/master/implementation.browser.d.ts.map +1 -0
- package/dist/neutral/master/implementation.node.d.ts +14 -0
- package/dist/neutral/master/implementation.node.d.ts.map +1 -0
- package/dist/neutral/master/index-browser.d.ts +13 -0
- package/dist/neutral/master/index-browser.d.ts.map +1 -0
- package/dist/neutral/master/index-node.d.ts +13 -0
- package/dist/neutral/master/index-node.d.ts.map +1 -0
- package/dist/neutral/master/invocation-proxy.d.ts +16 -0
- package/dist/neutral/master/invocation-proxy.d.ts.map +1 -0
- package/dist/neutral/master/pool-browser.d.ts +93 -0
- package/dist/neutral/master/pool-browser.d.ts.map +1 -0
- package/dist/neutral/master/pool-node.d.ts +93 -0
- package/dist/neutral/master/pool-node.d.ts.map +1 -0
- package/dist/neutral/master/pool-types.d.ts +68 -0
- package/dist/neutral/master/pool-types.d.ts.map +1 -0
- package/dist/neutral/master/register.d.ts +2 -0
- package/dist/neutral/master/register.d.ts.map +1 -0
- package/dist/neutral/master/spawn.d.ts +22 -0
- package/dist/neutral/master/spawn.d.ts.map +1 -0
- package/dist/neutral/master/spawn.mjs +424 -0
- package/dist/neutral/master/spawn.mjs.map +7 -0
- package/dist/neutral/master/thread.d.ts +14 -0
- package/dist/neutral/master/thread.d.ts.map +1 -0
- package/dist/neutral/master/thread.mjs +24 -0
- package/dist/neutral/master/thread.mjs.map +7 -0
- package/dist/neutral/observable-promise.d.ts +41 -0
- package/dist/neutral/observable-promise.d.ts.map +1 -0
- package/dist/neutral/observable-promise.mjs +142 -0
- package/dist/neutral/observable-promise.mjs.map +7 -0
- package/dist/neutral/observable.d.ts +24 -0
- package/dist/neutral/observable.d.ts.map +1 -0
- package/dist/neutral/observable.mjs +32 -0
- package/dist/neutral/observable.mjs.map +7 -0
- package/dist/neutral/promise.d.ts +6 -0
- package/dist/neutral/promise.d.ts.map +1 -0
- package/dist/neutral/serializers.d.ts +27 -0
- package/dist/neutral/serializers.d.ts.map +1 -0
- package/dist/neutral/symbols.d.ts +11 -0
- package/dist/neutral/symbols.d.ts.map +1 -0
- package/dist/neutral/transferable.d.ts +49 -0
- package/dist/neutral/transferable.d.ts.map +1 -0
- package/dist/neutral/types/master.d.ts +111 -0
- package/dist/neutral/types/master.d.ts.map +1 -0
- package/dist/neutral/types/messages.d.ts +71 -0
- package/dist/neutral/types/messages.d.ts.map +1 -0
- package/dist/neutral/types/messages.mjs +19 -0
- package/dist/neutral/types/messages.mjs.map +7 -0
- package/dist/neutral/types/worker.d.ts +13 -0
- package/dist/neutral/types/worker.d.ts.map +1 -0
- package/dist/neutral/worker/WorkerGlobalScope.d.ts +7 -0
- package/dist/neutral/worker/WorkerGlobalScope.d.ts.map +1 -0
- package/dist/neutral/worker/expose.d.ts +10 -0
- package/dist/neutral/worker/expose.d.ts.map +1 -0
- package/dist/neutral/worker/worker.browser.d.ts +20 -0
- package/dist/neutral/worker/worker.browser.d.ts.map +1 -0
- package/dist/neutral/worker/worker.node.d.ts +34 -0
- package/dist/neutral/worker/worker.node.d.ts.map +1 -0
- package/dist/node/common.d.ts +22 -0
- package/dist/node/common.d.ts.map +1 -0
- package/dist/node/index-browser.d.ts +9 -0
- package/dist/node/index-browser.d.ts.map +1 -0
- package/dist/node/index-node.d.ts +9 -0
- package/dist/node/index-node.d.ts.map +1 -0
- package/dist/node/index-node.mjs +839 -0
- package/dist/node/index-node.mjs.map +7 -0
- package/dist/node/isObservable.d.ts +2 -0
- package/dist/node/isObservable.d.ts.map +1 -0
- package/dist/node/master/get-bundle-url.browser.d.ts +4 -0
- package/dist/node/master/get-bundle-url.browser.d.ts.map +1 -0
- package/dist/node/master/implementation.browser.d.ts +14 -0
- package/dist/node/master/implementation.browser.d.ts.map +1 -0
- package/dist/node/master/implementation.node.d.ts +14 -0
- package/dist/node/master/implementation.node.d.ts.map +1 -0
- package/dist/node/master/implementation.node.mjs +82 -0
- package/dist/node/master/implementation.node.mjs.map +7 -0
- package/dist/node/master/index-browser.d.ts +13 -0
- package/dist/node/master/index-browser.d.ts.map +1 -0
- package/dist/node/master/index-node.d.ts +13 -0
- package/dist/node/master/index-node.d.ts.map +1 -0
- package/dist/node/master/index-node.mjs +808 -0
- package/dist/node/master/index-node.mjs.map +7 -0
- package/dist/node/master/invocation-proxy.d.ts +16 -0
- package/dist/node/master/invocation-proxy.d.ts.map +1 -0
- package/dist/node/master/pool-browser.d.ts +93 -0
- package/dist/node/master/pool-browser.d.ts.map +1 -0
- package/dist/node/master/pool-node.d.ts +93 -0
- package/dist/node/master/pool-node.d.ts.map +1 -0
- package/dist/node/master/pool-node.mjs +309 -0
- package/dist/node/master/pool-node.mjs.map +7 -0
- package/dist/node/master/pool-types.d.ts +68 -0
- package/dist/node/master/pool-types.d.ts.map +1 -0
- package/dist/node/master/register.d.ts +2 -0
- package/dist/node/master/register.d.ts.map +1 -0
- package/dist/node/master/register.mjs +87 -0
- package/dist/node/master/register.mjs.map +7 -0
- package/dist/node/master/spawn.d.ts +22 -0
- package/dist/node/master/spawn.d.ts.map +1 -0
- package/dist/node/master/thread.d.ts +14 -0
- package/dist/node/master/thread.d.ts.map +1 -0
- package/dist/node/observable-promise.d.ts +41 -0
- package/dist/node/observable-promise.d.ts.map +1 -0
- package/dist/node/observable.d.ts +24 -0
- package/dist/node/observable.d.ts.map +1 -0
- package/dist/node/promise.d.ts +6 -0
- package/dist/node/promise.d.ts.map +1 -0
- package/dist/node/serializers.d.ts +27 -0
- package/dist/node/serializers.d.ts.map +1 -0
- package/dist/node/symbols.d.ts +11 -0
- package/dist/node/symbols.d.ts.map +1 -0
- package/dist/node/transferable.d.ts +49 -0
- package/dist/node/transferable.d.ts.map +1 -0
- package/dist/node/types/master.d.ts +111 -0
- package/dist/node/types/master.d.ts.map +1 -0
- package/dist/node/types/messages.d.ts +71 -0
- package/dist/node/types/messages.d.ts.map +1 -0
- package/dist/node/types/worker.d.ts +13 -0
- package/dist/node/types/worker.d.ts.map +1 -0
- package/dist/node/worker/WorkerGlobalScope.d.ts +7 -0
- package/dist/node/worker/WorkerGlobalScope.d.ts.map +1 -0
- package/dist/node/worker/expose.d.ts +10 -0
- package/dist/node/worker/expose.d.ts.map +1 -0
- package/dist/node/worker/worker.browser.d.ts +20 -0
- package/dist/node/worker/worker.browser.d.ts.map +1 -0
- package/dist/node/worker/worker.node.d.ts +34 -0
- package/dist/node/worker/worker.node.d.ts.map +1 -0
- package/dist/node/worker/worker.node.mjs +313 -0
- package/dist/node/worker/worker.node.mjs.map +7 -0
- package/package.json +147 -0
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
// src/worker/worker.node.ts
|
|
2
|
+
import { parentPort as optionalParentPort } from "node:worker_threads";
|
|
3
|
+
import { assertEx } from "@ariestools/sdk/assert";
|
|
4
|
+
|
|
5
|
+
// src/serializers.ts
|
|
6
|
+
function extendSerializer(extend, implementation) {
|
|
7
|
+
const fallbackDeserializer = extend.deserialize.bind(extend);
|
|
8
|
+
const fallbackSerializer = extend.serialize.bind(extend);
|
|
9
|
+
return {
|
|
10
|
+
deserialize: (message) => implementation.deserialize(message, fallbackDeserializer),
|
|
11
|
+
serialize: (input) => implementation.serialize(input, fallbackSerializer)
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
var DefaultErrorSerializer = {
|
|
15
|
+
deserialize: (message) => {
|
|
16
|
+
const error = Object.create(Error.prototype);
|
|
17
|
+
error.message = message.message;
|
|
18
|
+
error.name = message.name;
|
|
19
|
+
error.stack = message.stack;
|
|
20
|
+
return error;
|
|
21
|
+
},
|
|
22
|
+
serialize: (error) => ({
|
|
23
|
+
__error_marker: "$$error",
|
|
24
|
+
message: error.message,
|
|
25
|
+
name: error.name,
|
|
26
|
+
stack: error.stack
|
|
27
|
+
})
|
|
28
|
+
};
|
|
29
|
+
var isSerializedError = (thing) => thing != null && typeof thing === "object" && "__error_marker" in thing && thing.__error_marker === "$$error";
|
|
30
|
+
var DefaultSerializer = {
|
|
31
|
+
deserialize: (message) => isSerializedError(message) ? DefaultErrorSerializer.deserialize(message) : message,
|
|
32
|
+
serialize: (input) => input instanceof Error ? DefaultErrorSerializer.serialize(input) : input
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
// src/common.ts
|
|
36
|
+
globalThis.registeredSerializer = globalThis.registeredSerializer ?? DefaultSerializer;
|
|
37
|
+
function registerSerializer(serializer) {
|
|
38
|
+
globalThis.registeredSerializer = extendSerializer(globalThis.registeredSerializer, serializer);
|
|
39
|
+
}
|
|
40
|
+
function deserialize(message) {
|
|
41
|
+
return globalThis.registeredSerializer.deserialize(message);
|
|
42
|
+
}
|
|
43
|
+
function serialize(input) {
|
|
44
|
+
return globalThis.registeredSerializer.serialize(input);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// src/isObservable.ts
|
|
48
|
+
var isSomeObservable = (value) => {
|
|
49
|
+
if (value == null) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
if (typeof Symbol.observable === "symbol" && typeof value[Symbol.observable] === "function") {
|
|
53
|
+
return value === value[Symbol.observable]();
|
|
54
|
+
}
|
|
55
|
+
if (typeof value["@@observable"] === "function") {
|
|
56
|
+
return value === value["@@observable"]();
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// src/symbols.ts
|
|
62
|
+
var $transferable = /* @__PURE__ */ Symbol("thread.transferable");
|
|
63
|
+
|
|
64
|
+
// src/transferable.ts
|
|
65
|
+
function isTransferable(thing) {
|
|
66
|
+
if (thing == null || typeof thing !== "object") return false;
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
function isTransferDescriptor(thing) {
|
|
70
|
+
return thing != null && typeof thing === "object" && Reflect.get(thing, $transferable) === true;
|
|
71
|
+
}
|
|
72
|
+
function Transfer(payload, transferables) {
|
|
73
|
+
console.log("Transfer");
|
|
74
|
+
if (!transferables) {
|
|
75
|
+
if (!isTransferable(payload)) throw new Error("Not transferable");
|
|
76
|
+
transferables = [payload];
|
|
77
|
+
}
|
|
78
|
+
const descriptor = {
|
|
79
|
+
send: payload,
|
|
80
|
+
transferables
|
|
81
|
+
};
|
|
82
|
+
Object.defineProperty(descriptor, $transferable, { value: true });
|
|
83
|
+
return descriptor;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// src/worker/expose.ts
|
|
87
|
+
var isErrorEvent = (value) => value !== void 0 && value.error !== void 0;
|
|
88
|
+
function createExpose(implementation, self) {
|
|
89
|
+
let exposeCalled = false;
|
|
90
|
+
const activeSubscriptions = /* @__PURE__ */ new Map();
|
|
91
|
+
const isMasterJobCancelMessage = (thing) => thing?.type === "cancel" /* cancel */;
|
|
92
|
+
const isMasterJobRunMessage = (thing) => thing?.type === "run" /* run */;
|
|
93
|
+
const isObservable = (thing) => isSomeObservable(thing) || isZenObservable(thing);
|
|
94
|
+
function isZenObservable(thing) {
|
|
95
|
+
return thing != null && typeof thing === "object" && typeof thing.subscribe === "function";
|
|
96
|
+
}
|
|
97
|
+
function deconstructTransfer(thing) {
|
|
98
|
+
return isTransferDescriptor(thing) ? { payload: thing.send, transferables: thing.transferables } : { payload: thing, transferables: void 0 };
|
|
99
|
+
}
|
|
100
|
+
function postFunctionInitMessage() {
|
|
101
|
+
const initMessage = {
|
|
102
|
+
exposed: { type: "function" },
|
|
103
|
+
type: "init" /* init */
|
|
104
|
+
};
|
|
105
|
+
implementation.postMessageToMaster(initMessage);
|
|
106
|
+
}
|
|
107
|
+
function postModuleInitMessage(methodNames) {
|
|
108
|
+
const initMessage = {
|
|
109
|
+
exposed: {
|
|
110
|
+
methods: methodNames,
|
|
111
|
+
type: "module"
|
|
112
|
+
},
|
|
113
|
+
type: "init" /* init */
|
|
114
|
+
};
|
|
115
|
+
implementation.postMessageToMaster(initMessage);
|
|
116
|
+
}
|
|
117
|
+
function postJobErrorMessage(uid, rawError) {
|
|
118
|
+
const { payload: error, transferables } = deconstructTransfer(rawError);
|
|
119
|
+
const errorMessage = {
|
|
120
|
+
error: serialize(error),
|
|
121
|
+
type: "error" /* error */,
|
|
122
|
+
uid
|
|
123
|
+
};
|
|
124
|
+
implementation.postMessageToMaster(errorMessage, transferables);
|
|
125
|
+
}
|
|
126
|
+
function postJobResultMessage(uid, completed, resultValue) {
|
|
127
|
+
const { payload, transferables } = deconstructTransfer(resultValue);
|
|
128
|
+
const resultMessage = {
|
|
129
|
+
complete: completed ? true : void 0,
|
|
130
|
+
payload,
|
|
131
|
+
type: "result" /* result */,
|
|
132
|
+
uid
|
|
133
|
+
};
|
|
134
|
+
implementation.postMessageToMaster(resultMessage, transferables);
|
|
135
|
+
}
|
|
136
|
+
function postJobStartMessage(uid, resultType) {
|
|
137
|
+
const startMessage = {
|
|
138
|
+
resultType,
|
|
139
|
+
type: "running" /* running */,
|
|
140
|
+
uid
|
|
141
|
+
};
|
|
142
|
+
implementation.postMessageToMaster(startMessage);
|
|
143
|
+
}
|
|
144
|
+
function postUncaughtErrorMessage(error) {
|
|
145
|
+
try {
|
|
146
|
+
const errorMessage = {
|
|
147
|
+
error: serialize(error),
|
|
148
|
+
type: "uncaughtError" /* uncaughtError */
|
|
149
|
+
};
|
|
150
|
+
implementation.postMessageToMaster(errorMessage);
|
|
151
|
+
} catch (subError) {
|
|
152
|
+
console.error(
|
|
153
|
+
"Not reporting uncaught error back to master thread as it occured while reporting an uncaught error already.\nLatest error:",
|
|
154
|
+
subError,
|
|
155
|
+
"\nOriginal error:",
|
|
156
|
+
error
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
async function runFunction(jobUID, fn, args) {
|
|
161
|
+
let syncResult;
|
|
162
|
+
try {
|
|
163
|
+
syncResult = fn(...args);
|
|
164
|
+
} catch (ex) {
|
|
165
|
+
const error = ex;
|
|
166
|
+
return postJobErrorMessage(jobUID, error);
|
|
167
|
+
}
|
|
168
|
+
const resultType = isObservable(syncResult) ? "observable" : "promise";
|
|
169
|
+
postJobStartMessage(jobUID, resultType);
|
|
170
|
+
if (isObservable(syncResult)) {
|
|
171
|
+
const subscription = syncResult.subscribe(
|
|
172
|
+
(value) => postJobResultMessage(jobUID, false, serialize(value)),
|
|
173
|
+
(error) => {
|
|
174
|
+
postJobErrorMessage(jobUID, serialize(error));
|
|
175
|
+
activeSubscriptions.delete(jobUID);
|
|
176
|
+
},
|
|
177
|
+
() => {
|
|
178
|
+
postJobResultMessage(jobUID, true);
|
|
179
|
+
activeSubscriptions.delete(jobUID);
|
|
180
|
+
}
|
|
181
|
+
);
|
|
182
|
+
activeSubscriptions.set(jobUID, subscription);
|
|
183
|
+
} else {
|
|
184
|
+
try {
|
|
185
|
+
const result = await syncResult;
|
|
186
|
+
postJobResultMessage(jobUID, true, serialize(result));
|
|
187
|
+
} catch (error) {
|
|
188
|
+
postJobErrorMessage(jobUID, serialize(error));
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
const expose2 = (exposed) => {
|
|
193
|
+
if (!implementation.isWorkerRuntime()) {
|
|
194
|
+
throw new Error("expose() called in the master thread.");
|
|
195
|
+
}
|
|
196
|
+
if (exposeCalled) {
|
|
197
|
+
throw new Error("expose() called more than once. This is not possible. Pass an object to expose() if you want to expose multiple functions.");
|
|
198
|
+
}
|
|
199
|
+
exposeCalled = true;
|
|
200
|
+
if (typeof exposed === "function") {
|
|
201
|
+
implementation.subscribeToMasterMessages((messageData) => {
|
|
202
|
+
if (isMasterJobRunMessage(messageData) && messageData.method === void 0) {
|
|
203
|
+
runFunction(messageData.uid, exposed, messageData.args.map(deserialize));
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
postFunctionInitMessage();
|
|
207
|
+
} else if (typeof exposed === "object" && exposed !== null) {
|
|
208
|
+
implementation.subscribeToMasterMessages((messageData) => {
|
|
209
|
+
if (isMasterJobRunMessage(messageData) && messageData.method !== void 0) {
|
|
210
|
+
runFunction(messageData.uid, exposed[messageData.method], messageData.args.map(deserialize));
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
const methodNames = Object.keys(exposed).filter((key) => typeof exposed[key] === "function");
|
|
214
|
+
postModuleInitMessage(methodNames);
|
|
215
|
+
} else {
|
|
216
|
+
throw new Error(`Invalid argument passed to expose(). Expected a function or an object, got: ${exposed}`);
|
|
217
|
+
}
|
|
218
|
+
implementation.subscribeToMasterMessages((messageData) => {
|
|
219
|
+
if (!isMasterJobCancelMessage(messageData)) {
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
const jobUID = messageData.uid;
|
|
223
|
+
const subscription = activeSubscriptions.get(jobUID);
|
|
224
|
+
if (subscription) {
|
|
225
|
+
subscription.unsubscribe();
|
|
226
|
+
activeSubscriptions.delete(jobUID);
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
};
|
|
230
|
+
const subscribeToBrowserUncaughtErrors = () => {
|
|
231
|
+
if (typeof globalThis === "undefined" || typeof self.addEventListener !== "function" || !implementation.isWorkerRuntime()) {
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
self.addEventListener("error", (event) => {
|
|
235
|
+
setTimeout(() => postUncaughtErrorMessage(isErrorEvent(event) ? event.error : event), 250);
|
|
236
|
+
});
|
|
237
|
+
self.addEventListener("unhandledrejection", (event) => {
|
|
238
|
+
const error = event.reason;
|
|
239
|
+
if (error != null && typeof error === "object" && typeof error.message === "string") {
|
|
240
|
+
setTimeout(() => postUncaughtErrorMessage(error), 250);
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
};
|
|
244
|
+
const subscribeToNodeUncaughtErrors = () => {
|
|
245
|
+
const nodeProcess = globalThis.process;
|
|
246
|
+
if (nodeProcess === void 0 || typeof nodeProcess.on !== "function" || !implementation.isWorkerRuntime()) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
nodeProcess.on("uncaughtException", (error) => {
|
|
250
|
+
setTimeout(() => postUncaughtErrorMessage(error), 250);
|
|
251
|
+
});
|
|
252
|
+
nodeProcess.on("unhandledRejection", (error) => {
|
|
253
|
+
if (error != null && typeof error === "object" && typeof error.message === "string") {
|
|
254
|
+
setTimeout(() => postUncaughtErrorMessage(error), 250);
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
};
|
|
258
|
+
subscribeToBrowserUncaughtErrors();
|
|
259
|
+
subscribeToNodeUncaughtErrors();
|
|
260
|
+
return expose2;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// src/worker/worker.node.ts
|
|
264
|
+
var parentPort = assertEx(optionalParentPort, () => "Invariant violation: MessagePort to parent is not available.");
|
|
265
|
+
function assertMessagePort(port) {
|
|
266
|
+
if (!port) {
|
|
267
|
+
throw new Error("Invariant violation: MessagePort to parent is not available.");
|
|
268
|
+
}
|
|
269
|
+
return port;
|
|
270
|
+
}
|
|
271
|
+
var isWorkerRuntime = function isWorkerRuntime2() {
|
|
272
|
+
return true;
|
|
273
|
+
};
|
|
274
|
+
var postMessageToMaster = function postMessageToMaster2(data, transferList) {
|
|
275
|
+
assertMessagePort(parentPort).postMessage(data, transferList);
|
|
276
|
+
};
|
|
277
|
+
var subscribeToMasterMessages = function subscribeToMasterMessages2(onMessage) {
|
|
278
|
+
if (parentPort === null || parentPort === void 0) {
|
|
279
|
+
throw new Error("Invariant violation: MessagePort to parent is not available.");
|
|
280
|
+
}
|
|
281
|
+
const messageHandler = (message) => {
|
|
282
|
+
onMessage(message);
|
|
283
|
+
};
|
|
284
|
+
const unsubscribe = () => {
|
|
285
|
+
assertMessagePort(parentPort).off("message", messageHandler);
|
|
286
|
+
};
|
|
287
|
+
assertMessagePort(parentPort).on("message", messageHandler);
|
|
288
|
+
return unsubscribe;
|
|
289
|
+
};
|
|
290
|
+
var addEventListener = parentPort?.on.bind(parentPort);
|
|
291
|
+
var postMessage = parentPort?.postMessage.bind(parentPort);
|
|
292
|
+
var removeEventListener = parentPort?.off.bind(parentPort);
|
|
293
|
+
var expose = createExpose({
|
|
294
|
+
isWorkerRuntime,
|
|
295
|
+
postMessageToMaster,
|
|
296
|
+
subscribeToMasterMessages
|
|
297
|
+
}, {
|
|
298
|
+
addEventListener,
|
|
299
|
+
postMessage,
|
|
300
|
+
removeEventListener
|
|
301
|
+
});
|
|
302
|
+
export {
|
|
303
|
+
Transfer,
|
|
304
|
+
addEventListener,
|
|
305
|
+
expose,
|
|
306
|
+
isWorkerRuntime,
|
|
307
|
+
postMessage,
|
|
308
|
+
postMessageToMaster,
|
|
309
|
+
registerSerializer,
|
|
310
|
+
removeEventListener,
|
|
311
|
+
subscribeToMasterMessages
|
|
312
|
+
};
|
|
313
|
+
//# sourceMappingURL=worker.node.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/worker/worker.node.ts", "../../../src/serializers.ts", "../../../src/common.ts", "../../../src/isObservable.ts", "../../../src/symbols.ts", "../../../src/transferable.ts", "../../../src/worker/expose.ts"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\n/// <reference types=\"node\" />\n\nimport type { MessagePort, Transferable as NodeTransferable } from 'node:worker_threads'\nimport { parentPort as optionalParentPort } from 'node:worker_threads'\n\nimport { assertEx } from '@ariestools/sdk/assert'\n\nimport type { AbstractedWorkerAPI } from '../types/worker.ts'\nimport { createExpose } from './expose.ts'\n\nconst parentPort = assertEx(optionalParentPort, () => 'Invariant violation: MessagePort to parent is not available.')\n\nfunction assertMessagePort(port: MessagePort | null | undefined): MessagePort {\n if (!port) {\n throw new Error('Invariant violation: MessagePort to parent is not available.')\n }\n return port\n}\n\n/** Check if the current code is running inside a Node.js worker thread. */\nconst isWorkerRuntime: AbstractedWorkerAPI['isWorkerRuntime'] = function isWorkerRuntime() {\n return true // isMainThread\n}\n\n/** Post a message from this worker to the master thread via the parent port. */\nconst postMessageToMaster: AbstractedWorkerAPI['postMessageToMaster'] = function postMessageToMaster(data, transferList) {\n assertMessagePort(parentPort).postMessage(data, transferList as NodeTransferable[])\n}\n\n/** Subscribe to messages from the master thread on the parent port. */\nconst subscribeToMasterMessages: AbstractedWorkerAPI['subscribeToMasterMessages'] = function subscribeToMasterMessages(onMessage) {\n if (parentPort === null || parentPort === undefined) {\n throw new Error('Invariant violation: MessagePort to parent is not available.')\n }\n const messageHandler = (message: any) => {\n onMessage(message)\n }\n const unsubscribe = () => {\n assertMessagePort(parentPort).off('message', messageHandler)\n }\n assertMessagePort(parentPort).on('message', messageHandler)\n return unsubscribe\n}\n\n/** Bound `on` method from the parent port for adding event listeners. */\nconst addEventListener = parentPort?.on.bind(parentPort)\n/** Bound `postMessage` method from the parent port. */\nconst postMessage = parentPort?.postMessage.bind(parentPort)\n/** Bound `off` method from the parent port for removing event listeners. */\nconst removeEventListener = parentPort?.off.bind(parentPort)\n\nexport {\n addEventListener,\n postMessage,\n removeEventListener,\n}\n\nconst expose = createExpose({\n isWorkerRuntime, postMessageToMaster, subscribeToMasterMessages,\n}, {\n addEventListener, postMessage, removeEventListener,\n})\n\nexport {\n isWorkerRuntime,\n postMessageToMaster,\n subscribeToMasterMessages,\n}\n\nexport { registerSerializer } from '../common.ts'\nexport { Transfer } from '../transferable.ts'\nexport { expose }\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { SerializedError } from './types/messages.ts'\n\n/** A serializer that can convert between a message format and an input type. */\nexport interface Serializer<Msg = JsonSerializable, Input = any> {\n deserialize(message: Msg): Input\n serialize(input: Input): Msg\n}\n\n/** A serializer implementation that receives a fallback (default) serializer for chaining. */\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\n/**\n * Extend a base serializer with an additional serializer implementation, creating a chain.\n * @param extend - The base serializer to extend.\n * @param implementation - The new serializer implementation that wraps the base.\n * @returns A new serializer combining both behaviors.\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 => implementation.deserialize(message, fallbackDeserializer),\n\n serialize: (input: InputType): MessageType => implementation.serialize(input, fallbackSerializer),\n }\n}\n\ntype JsonSerializablePrimitive = string | number | boolean | null\n\ntype JsonSerializableObject = {\n [key: string]: JsonSerializablePrimitive | JsonSerializablePrimitive[] | JsonSerializableObject | JsonSerializableObject[] | undefined\n}\n\n/** A JSON-compatible value that can be serialized for worker message passing. */\nexport type JsonSerializable = JsonSerializablePrimitive | JsonSerializablePrimitive[] | JsonSerializableObject | JsonSerializableObject[]\n\nconst DefaultErrorSerializer: Serializer<SerializedError, Error> = {\n deserialize: (message: SerializedError): Error => {\n const error = Object.create(Error.prototype) as Error\n error.message = message.message\n error.name = message.name\n error.stack = message.stack\n return error\n },\n serialize: (error: Error): SerializedError => ({\n __error_marker: '$$error',\n message: error.message,\n name: error.name,\n stack: error.stack,\n }),\n}\n\nconst isSerializedError = (thing: any): thing is SerializedError =>\n thing != null && typeof thing === 'object' && '__error_marker' in thing && thing.__error_marker === '$$error'\n\n/** Default serializer that handles Error instances and passes other values through. */\nexport const DefaultSerializer: Serializer<JsonSerializable> = {\n deserialize: (message: JsonSerializable): any => isSerializedError(message) ? DefaultErrorSerializer.deserialize(message) : message,\n serialize: (input: any): JsonSerializable => input instanceof Error ? (DefaultErrorSerializer.serialize(input) as any as JsonSerializable) : input,\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\n/**\n * Register a custom serializer to extend the default serialization behavior for worker messages.\n * @param serializer - The serializer implementation to register.\n */\nexport function registerSerializer(serializer: SerializerImplementation<JsonSerializable>) {\n globalThis.registeredSerializer = extendSerializer(globalThis.registeredSerializer, serializer)\n}\n\n/**\n * Deserialize a message using the registered serializer.\n * @param message - The serialized message to deserialize.\n * @returns The deserialized value.\n */\nexport function deserialize(message: JsonSerializable): any {\n return globalThis.registeredSerializer.deserialize(message)\n}\n\n/**\n * Serialize an input value using the registered serializer.\n * @param input - The value to serialize.\n * @returns The serialized message.\n */\nexport function serialize(input: any): JsonSerializable {\n return globalThis.registeredSerializer.serialize(input)\n}\n", "// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const isSomeObservable = (value: any): boolean => {\n if (value == null) {\n return false\n }\n\n if (typeof Symbol.observable === 'symbol' && typeof value[Symbol.observable] === 'function') {\n return value === value[Symbol.observable]()\n }\n\n if (typeof value['@@observable'] === 'function') {\n return value === value['@@observable']()\n }\n\n return false\n}\n", "/** Symbol key for accessing a thread's error observable. */\nexport const $errors = Symbol('thread.errors')\n/** Symbol key for accessing a thread's event observable. */\nexport const $events = Symbol('thread.events')\n/** Symbol key for accessing a thread's terminate function. */\nexport const $terminate = Symbol('thread.terminate')\n/** Symbol key for marking an object as a transferable descriptor. */\nexport const $transferable = Symbol('thread.transferable')\n/** Symbol key for accessing the underlying worker instance of a thread. */\nexport const $worker = Symbol('thread.worker')\n", "/// <reference lib=\"webworker\" />\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { $transferable } from './symbols.ts'\n\n/** Descriptor wrapping a value with its associated transferable objects for zero-copy messaging. */\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 == null || 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\n/**\n * Check whether a value is a `TransferDescriptor` created by `Transfer()`.\n * @param thing - The value to check.\n * @returns True if the value is a transfer descriptor.\n */\nexport function isTransferDescriptor(thing: any): thing is TransferDescriptor {\n return thing != null && typeof thing === 'object' && Reflect.get(thing, $transferable) === true\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 const descriptor = {\n send: payload,\n transferables,\n } as TransferDescriptor\n\n Object.defineProperty(descriptor, $transferable, { value: true })\n return descriptor\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-floating-promises */\n\nimport type { Observable, Subscription } from 'observable-fns'\n\nimport { deserialize, serialize } from '../common.ts'\nimport { isSomeObservable } from '../isObservable.ts'\nimport type { TransferDescriptor } from '../transferable.ts'\nimport { isTransferDescriptor } from '../transferable.ts'\nimport type {\n MasterJobCancelMessage,\n MasterJobRunMessage,\n SerializedError,\n WorkerInitMessage,\n WorkerJobErrorMessage,\n WorkerJobResultMessage,\n WorkerJobStartMessage,\n WorkerUncaughtErrorMessage,\n} from '../types/messages.ts'\nimport {\n MasterMessageType,\n WorkerMessageType,\n} from '../types/messages.ts'\nimport type {\n AbstractedWorkerAPI, WorkerFunction, WorkerModule,\n} from '../types/worker.ts'\nimport type { WorkerGlobalScope } from './WorkerGlobalScope.ts'\n\nconst isErrorEvent = (value: Event): value is ErrorEvent => value !== undefined && (value as ErrorEvent).error !== undefined\n\ninterface ProcessGlobal {\n process?: ProcessLike\n}\n\ninterface ProcessLike {\n on(eventName: 'uncaughtException', listener: (error: Error) => void): unknown\n on(eventName: 'unhandledRejection', listener: (error: unknown) => void): unknown\n}\n\n/**\n * Create an `expose()` function bound to a specific worker API implementation and global scope.\n * @param implementation - The abstracted worker API for communicating with the master thread.\n * @param self - The worker's global scope for subscribing to error events.\n * @returns The `expose()` function that workers call to register their API.\n */\nexport function createExpose(implementation: AbstractedWorkerAPI, self: WorkerGlobalScope) {\n let exposeCalled = false\n\n const activeSubscriptions = new Map<number, Subscription<any>>()\n\n const isMasterJobCancelMessage = (thing: any): thing is MasterJobCancelMessage => thing?.type === MasterMessageType.cancel\n const isMasterJobRunMessage = (thing: any): thing is MasterJobRunMessage => thing?.type === MasterMessageType.run\n\n /**\n * There are issues with `is-observable` not recognizing zen-observable's instances.\n * We are using `observable-fns`, but it's based on zen-observable, too.\n */\n const isObservable = (thing: any): thing is Observable<any> => isSomeObservable(thing) || isZenObservable(thing)\n\n function isZenObservable(thing: any): thing is Observable<any> {\n return thing != null && typeof thing === 'object' && typeof thing.subscribe === 'function'\n }\n\n function deconstructTransfer(thing: any) {\n return isTransferDescriptor(thing) ? { payload: thing.send, transferables: thing.transferables } : { payload: thing, transferables: undefined }\n }\n\n function postFunctionInitMessage() {\n const initMessage: WorkerInitMessage = {\n exposed: { type: 'function' },\n type: WorkerMessageType.init,\n }\n implementation.postMessageToMaster(initMessage)\n }\n\n function postModuleInitMessage(methodNames: string[]) {\n const initMessage: WorkerInitMessage = {\n exposed: {\n methods: methodNames,\n type: 'module',\n },\n type: WorkerMessageType.init,\n }\n implementation.postMessageToMaster(initMessage)\n }\n\n function postJobErrorMessage(uid: number, rawError: Error | TransferDescriptor<Error>) {\n const { payload: error, transferables } = deconstructTransfer(rawError)\n const errorMessage: WorkerJobErrorMessage = {\n error: serialize(error) as any as SerializedError,\n type: WorkerMessageType.error,\n uid,\n }\n implementation.postMessageToMaster(errorMessage, transferables)\n }\n\n function postJobResultMessage(uid: number, completed: boolean, resultValue?: any) {\n const { payload, transferables } = deconstructTransfer(resultValue)\n const resultMessage: WorkerJobResultMessage = {\n complete: completed ? true : undefined,\n payload,\n type: WorkerMessageType.result,\n uid,\n }\n implementation.postMessageToMaster(resultMessage, transferables)\n }\n\n function postJobStartMessage(uid: number, resultType: WorkerJobStartMessage['resultType']) {\n const startMessage: WorkerJobStartMessage = {\n resultType,\n type: WorkerMessageType.running,\n uid,\n }\n implementation.postMessageToMaster(startMessage)\n }\n\n function postUncaughtErrorMessage(error: Error) {\n try {\n const errorMessage: WorkerUncaughtErrorMessage = {\n error: serialize(error) as any as SerializedError,\n type: WorkerMessageType.uncaughtError,\n }\n implementation.postMessageToMaster(errorMessage)\n } catch (subError) {\n console.error(\n 'Not reporting uncaught error back to master thread as it occured while reporting an uncaught error already.\\nLatest error:',\n subError,\n '\\nOriginal error:',\n error,\n )\n }\n }\n\n async function runFunction(jobUID: number, fn: WorkerFunction, args: any[]) {\n let syncResult: any\n\n try {\n syncResult = fn(...args)\n } catch (ex) {\n const error = ex as Error\n return postJobErrorMessage(jobUID, error)\n }\n\n const resultType = isObservable(syncResult) ? 'observable' : 'promise'\n postJobStartMessage(jobUID, resultType)\n\n if (isObservable(syncResult)) {\n const subscription = syncResult.subscribe(\n value => postJobResultMessage(jobUID, false, serialize(value)),\n (error) => {\n postJobErrorMessage(jobUID, serialize(error) as any)\n activeSubscriptions.delete(jobUID)\n },\n () => {\n postJobResultMessage(jobUID, true)\n activeSubscriptions.delete(jobUID)\n },\n )\n activeSubscriptions.set(jobUID, subscription)\n } else {\n try {\n const result = await syncResult\n postJobResultMessage(jobUID, true, serialize(result))\n } catch (error) {\n postJobErrorMessage(jobUID, serialize(error) as any)\n }\n }\n }\n\n /**\n * Expose a function or a module (an object whose values are functions)\n * to the main thread. Must be called exactly once in every worker thread\n * to signal its API to the main thread.\n *\n * @param exposed Function or object whose values are functions\n */\n const expose = (exposed: WorkerFunction | WorkerModule<any>) => {\n if (!implementation.isWorkerRuntime()) {\n throw new Error('expose() called in the master thread.')\n }\n if (exposeCalled) {\n throw new Error('expose() called more than once. This is not possible. Pass an object to expose() if you want to expose multiple functions.')\n }\n exposeCalled = true\n\n if (typeof exposed === 'function') {\n implementation.subscribeToMasterMessages((messageData: unknown) => {\n if (isMasterJobRunMessage(messageData) && messageData.method === undefined) {\n runFunction(messageData.uid, exposed, messageData.args.map(deserialize))\n }\n })\n postFunctionInitMessage()\n } else if (typeof exposed === 'object' && exposed !== null) {\n implementation.subscribeToMasterMessages((messageData: unknown) => {\n if (isMasterJobRunMessage(messageData) && messageData.method !== undefined) {\n runFunction(messageData.uid, exposed[messageData.method], messageData.args.map(deserialize))\n }\n })\n\n const methodNames = Object.keys(exposed).filter(key => typeof exposed[key] === 'function')\n postModuleInitMessage(methodNames)\n } else {\n throw new Error(`Invalid argument passed to expose(). Expected a function or an object, got: ${exposed}`)\n }\n\n implementation.subscribeToMasterMessages((messageData: unknown) => {\n if (!isMasterJobCancelMessage(messageData)) {\n return\n }\n\n const jobUID = messageData.uid\n const subscription = activeSubscriptions.get(jobUID)\n\n if (subscription) {\n subscription.unsubscribe()\n activeSubscriptions.delete(jobUID)\n }\n })\n }\n\n const subscribeToBrowserUncaughtErrors = () => {\n if (typeof globalThis === 'undefined' || typeof self.addEventListener !== 'function' || !implementation.isWorkerRuntime()) {\n return\n }\n\n self.addEventListener('error', (event) => {\n // Post with some delay, so the master had some time to subscribe to messages\n setTimeout(() => postUncaughtErrorMessage(isErrorEvent(event) ? event.error : event), 250)\n })\n self.addEventListener('unhandledrejection', (event) => {\n const error = (event as any).reason\n if (error != null && typeof error === 'object' && typeof (error as Error).message === 'string') {\n // Post with some delay, so the master had some time to subscribe to messages\n setTimeout(() => postUncaughtErrorMessage(error), 250)\n }\n })\n }\n\n const subscribeToNodeUncaughtErrors = () => {\n const nodeProcess = (globalThis as ProcessGlobal).process\n if (nodeProcess === undefined || typeof nodeProcess.on !== 'function' || !implementation.isWorkerRuntime()) {\n return\n }\n\n nodeProcess.on('uncaughtException', (error) => {\n // Post with some delay, so the master had some time to subscribe to messages\n setTimeout(() => postUncaughtErrorMessage(error), 250)\n })\n nodeProcess.on('unhandledRejection', (error) => {\n if (error != null && typeof error === 'object' && typeof (error as Error).message === 'string') {\n // Post with some delay, so the master had some time to subscribe to messages\n setTimeout(() => postUncaughtErrorMessage(error as Error), 250)\n }\n })\n }\n\n subscribeToBrowserUncaughtErrors()\n subscribeToNodeUncaughtErrors()\n\n return expose\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["expose", "isWorkerRuntime", "postMessageToMaster", "subscribeToMasterMessages"]
|
|
7
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ariestools/threads",
|
|
3
|
+
"version": "8.0.0",
|
|
4
|
+
"description": "Web workers & worker threads as simple as a function call",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"ariestools",
|
|
7
|
+
"thread",
|
|
8
|
+
"worker",
|
|
9
|
+
"pool",
|
|
10
|
+
"spawn",
|
|
11
|
+
"isomorphic",
|
|
12
|
+
"parallel",
|
|
13
|
+
"observable",
|
|
14
|
+
"worker_threads"
|
|
15
|
+
],
|
|
16
|
+
"homepage": "https://threads.js.org",
|
|
17
|
+
"bugs": {
|
|
18
|
+
"url": "git+https://github.com/andywer/threads.js/issues"
|
|
19
|
+
},
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "git+https://github.com/andywer/threads.js.git"
|
|
23
|
+
},
|
|
24
|
+
"funding": "https://github.com/andywer/threads.js?sponsor=1",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"author": "Andy Wermke (https://github.com/andywer)",
|
|
27
|
+
"sideEffects": false,
|
|
28
|
+
"type": "module",
|
|
29
|
+
"exports": {
|
|
30
|
+
".": {
|
|
31
|
+
"browser": {
|
|
32
|
+
"types": "./dist/browser/index-browser.d.ts",
|
|
33
|
+
"default": "./dist/browser/index-browser.mjs"
|
|
34
|
+
},
|
|
35
|
+
"node": {
|
|
36
|
+
"types": "./dist/node/index-node.d.ts",
|
|
37
|
+
"default": "./dist/node/index-node.mjs"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"./implementation": {
|
|
41
|
+
"browser": {
|
|
42
|
+
"types": "./dist/browser/master/implementation.browser.d.ts",
|
|
43
|
+
"default": "./dist/browser/master/implementation.browser.mjs"
|
|
44
|
+
},
|
|
45
|
+
"node": {
|
|
46
|
+
"types": "./dist/node/master/implementation.node.d.ts",
|
|
47
|
+
"default": "./dist/node/master/implementation.node.mjs"
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"./master": {
|
|
51
|
+
"browser": {
|
|
52
|
+
"types": "./dist/browser/master/index-browser.d.ts",
|
|
53
|
+
"default": "./dist/browser/master/index-browser.mjs"
|
|
54
|
+
},
|
|
55
|
+
"node": {
|
|
56
|
+
"types": "./dist/node/master/index-node.d.ts",
|
|
57
|
+
"default": "./dist/node/master/index-node.mjs"
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
"./spawn": {
|
|
61
|
+
"types": "./dist/neutral/master/spawn.d.ts",
|
|
62
|
+
"default": "./dist/neutral/master/spawn.mjs"
|
|
63
|
+
},
|
|
64
|
+
"./thread": {
|
|
65
|
+
"types": "./dist/neutral/master/thread.d.ts",
|
|
66
|
+
"default": "./dist/neutral/master/thread.mjs"
|
|
67
|
+
},
|
|
68
|
+
"./messenger": {
|
|
69
|
+
"types": "./dist/neutral/types/messages.d.ts"
|
|
70
|
+
},
|
|
71
|
+
"./observable": {
|
|
72
|
+
"types": "./dist/neutral/observable.d.ts",
|
|
73
|
+
"default": "./dist/neutral/observable.mjs"
|
|
74
|
+
},
|
|
75
|
+
"./pool": {
|
|
76
|
+
"browser": {
|
|
77
|
+
"types": "./dist/browser/master/pool-browser.d.ts",
|
|
78
|
+
"default": "./dist/browser/master/pool-browser.mjs"
|
|
79
|
+
},
|
|
80
|
+
"node": {
|
|
81
|
+
"types": "./dist/node/master/pool-node.d.ts",
|
|
82
|
+
"default": "./dist/node/master/pool-node.mjs"
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"./observable-promise": {
|
|
86
|
+
"types": "./dist/neutral/observable-promise.d.ts",
|
|
87
|
+
"default": "./dist/neutral/observable-promise.mjs"
|
|
88
|
+
},
|
|
89
|
+
"./register": {
|
|
90
|
+
"node": {
|
|
91
|
+
"types": "./dist/node/master/register.d.ts",
|
|
92
|
+
"default": "./dist/node/master/register.mjs"
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
"./worker": {
|
|
96
|
+
"browser": {
|
|
97
|
+
"types": "./dist/browser/worker/worker.browser.d.ts",
|
|
98
|
+
"default": "./dist/browser/worker/worker.browser.mjs"
|
|
99
|
+
},
|
|
100
|
+
"node": {
|
|
101
|
+
"types": "./dist/node/worker/worker.node.d.ts",
|
|
102
|
+
"default": "./dist/node/worker/worker.node.mjs"
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
"files": [
|
|
107
|
+
"dist",
|
|
108
|
+
"README.md",
|
|
109
|
+
"LICENSE"
|
|
110
|
+
],
|
|
111
|
+
"dependencies": {
|
|
112
|
+
"@ariestools/sdk": "~8.0.0"
|
|
113
|
+
},
|
|
114
|
+
"devDependencies": {
|
|
115
|
+
"@opentelemetry/api": "~1.9.1",
|
|
116
|
+
"@opentelemetry/sdk-trace-base": "~2.9.0",
|
|
117
|
+
"@types/debug": "~4.1.13",
|
|
118
|
+
"@types/node": "~26.1.0",
|
|
119
|
+
"@xylabs/eslint-config-flat": "~8.6.2",
|
|
120
|
+
"@xylabs/toolchain": "~8.6.2",
|
|
121
|
+
"@xylabs/tsconfig": "~8.6.2",
|
|
122
|
+
"async-mutex": "~0.5.0",
|
|
123
|
+
"browserslist": "~4.28.4",
|
|
124
|
+
"debug": "~4.4.3",
|
|
125
|
+
"eslint": "~10.6.0",
|
|
126
|
+
"eslint-import-resolver-typescript": "~4.4.5",
|
|
127
|
+
"observable-fns": "~0.6.1",
|
|
128
|
+
"typescript": "~6.0.3",
|
|
129
|
+
"vite": "~8.1.3",
|
|
130
|
+
"vitest": "~4.1.9",
|
|
131
|
+
"zod": "~4.4.3"
|
|
132
|
+
},
|
|
133
|
+
"peerDependencies": {
|
|
134
|
+
"@opentelemetry/api": "^1.9.1",
|
|
135
|
+
"@opentelemetry/sdk-trace-base": "^2.9.0",
|
|
136
|
+
"async-mutex": "^0.5.0",
|
|
137
|
+
"debug": "^4.4.3",
|
|
138
|
+
"observable-fns": "^0.6.1",
|
|
139
|
+
"zod": "^4.4.3"
|
|
140
|
+
},
|
|
141
|
+
"engines": {
|
|
142
|
+
"node": ">=18"
|
|
143
|
+
},
|
|
144
|
+
"publishConfig": {
|
|
145
|
+
"access": "public"
|
|
146
|
+
}
|
|
147
|
+
}
|