@xylabs/threads 4.7.0 → 4.7.1
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/{types/common.d.ts → common.d.ts} +1 -5
- package/dist/common.js +16 -0
- package/dist/esm/common.js +16 -0
- package/dist/esm/index.js +26 -0
- package/dist/esm/master/get-bundle-url.browser.js +25 -0
- package/dist/esm/master/implementation.browser.js +65 -0
- package/dist/esm/master/implementation.js +43 -0
- package/dist/esm/master/implementation.node.js +205 -0
- package/dist/esm/master/index.js +14 -0
- package/dist/esm/master/invocation-proxy.js +121 -0
- package/dist/esm/master/pool-types.js +14 -0
- package/dist/esm/master/pool.js +262 -0
- package/dist/esm/master/register.js +11 -0
- package/dist/esm/master/spawn.js +114 -0
- package/dist/esm/master/thread.js +18 -0
- package/dist/esm/observable-promise.js +132 -0
- package/dist/esm/observable.js +33 -0
- package/dist/esm/ponyfills.js +20 -0
- package/dist/esm/promise.js +23 -0
- package/dist/esm/serializers.js +41 -0
- package/dist/esm/symbols.js +8 -0
- package/dist/esm/transferable.js +25 -0
- package/dist/esm/types/master.js +9 -0
- package/dist/esm/types/messages.js +16 -0
- package/dist/esm/types/worker.js +2 -0
- package/dist/esm/worker/bundle-entry.js +26 -0
- package/dist/esm/worker/implementation.browser.js +24 -0
- package/dist/esm/worker/implementation.js +19 -0
- package/dist/esm/worker/implementation.tiny-worker.js +37 -0
- package/dist/esm/worker/implementation.worker_threads.js +41 -0
- package/dist/esm/worker/index.js +174 -0
- package/dist/esm/worker_threads.js +13 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +26 -0
- package/dist/{types/master → master}/get-bundle-url.browser.d.ts +0 -1
- package/dist/master/get-bundle-url.browser.js +25 -0
- package/dist/{types/master → master}/implementation.browser.d.ts +1 -2
- package/dist/master/implementation.browser.js +65 -0
- package/dist/{types/master → master}/implementation.d.ts +1 -4
- package/dist/master/implementation.js +43 -0
- package/dist/{types/master → master}/implementation.node.d.ts +1 -2
- package/dist/master/implementation.node.js +205 -0
- package/dist/master/index.d.ts +10 -0
- package/dist/master/index.js +14 -0
- package/dist/{types/master → master}/invocation-proxy.d.ts +1 -2
- package/dist/master/invocation-proxy.js +121 -0
- package/dist/{types/master → master}/pool-types.d.ts +1 -16
- package/dist/master/pool-types.js +14 -0
- package/dist/master/pool.d.ts +50 -0
- package/dist/master/pool.js +262 -0
- package/dist/master/register.d.ts +1 -0
- package/dist/master/register.js +11 -0
- package/dist/{types/master → master}/spawn.d.ts +2 -12
- package/dist/master/spawn.js +114 -0
- package/dist/master/thread.d.ts +8 -0
- package/dist/master/thread.js +18 -0
- package/dist/{types/observable-promise.d.ts → observable-promise.d.ts} +0 -14
- package/dist/observable-promise.js +132 -0
- package/dist/observable.d.ts +11 -0
- package/dist/observable.js +33 -0
- package/dist/{types/ponyfills.d.ts → ponyfills.d.ts} +0 -1
- package/dist/ponyfills.js +20 -0
- package/dist/promise.d.ts +1 -0
- package/dist/promise.js +23 -0
- package/dist/{types/serializers.d.ts → serializers.d.ts} +0 -1
- package/dist/serializers.js +41 -0
- package/dist/{types/symbols.d.ts → symbols.d.ts} +0 -1
- package/dist/symbols.js +8 -0
- package/dist/transferable.d.ts +9 -0
- package/dist/transferable.js +25 -0
- package/dist/types/{types/master.d.ts → master.d.ts} +3 -17
- package/dist/types/master.js +9 -0
- package/dist/types/{types/messages.d.ts → messages.d.ts} +0 -1
- package/dist/types/messages.js +16 -0
- package/dist/types/{types/worker.d.ts → worker.d.ts} +0 -1
- package/dist/types/worker.js +2 -0
- package/dist/worker/bundle-entry.d.ts +1 -0
- package/dist/worker/bundle-entry.js +26 -0
- package/dist/worker/implementation.browser.d.ts +6 -0
- package/dist/worker/implementation.browser.js +24 -0
- package/dist/worker/implementation.d.ts +3 -0
- package/dist/worker/implementation.js +19 -0
- package/dist/worker/implementation.tiny-worker.d.ts +6 -0
- package/dist/worker/implementation.tiny-worker.js +37 -0
- package/dist/worker/implementation.worker_threads.d.ts +8 -0
- package/dist/worker/implementation.worker_threads.js +41 -0
- package/dist/worker/index.d.ts +5 -0
- package/dist/worker/index.js +174 -0
- package/dist/worker_threads.d.ts +8 -0
- package/dist/worker_threads.js +13 -0
- package/observable.d.ts +2 -0
- package/observable.js +2 -0
- package/observable.mjs +4 -0
- package/package.json +77 -66
- package/register.d.ts +2 -0
- package/register.js +2 -0
- package/register.mjs +1 -0
- package/rollup.config.js +16 -0
- package/src/common.ts +6 -10
- package/src/index.ts +9 -10
- package/src/master/get-bundle-url.browser.ts +1 -2
- package/src/master/implementation.browser.ts +2 -2
- package/src/master/implementation.node.ts +96 -19
- package/src/master/implementation.ts +2 -2
- package/src/master/index.ts +7 -7
- package/src/master/invocation-proxy.ts +6 -6
- package/src/master/pool-types.ts +1 -1
- package/src/master/pool.ts +13 -14
- package/src/master/register.ts +1 -2
- package/src/master/spawn.ts +8 -8
- package/src/master/thread.ts +2 -2
- package/src/observable-promise.ts +2 -3
- package/src/serializers.ts +1 -1
- package/src/transferable.ts +1 -2
- package/src/types/master.ts +3 -3
- package/src/worker/bundle-entry.ts +10 -0
- package/src/worker/{worker.browser.ts → implementation.browser.ts} +10 -26
- package/src/worker/implementation.tiny-worker.ts +55 -0
- package/src/worker/implementation.ts +23 -0
- package/src/worker/{worker.node.ts → implementation.worker_threads.ts} +12 -30
- package/src/worker/index.ts +230 -0
- package/src/worker_threads.ts +27 -0
- package/test/lib/index.ts +1 -0
- package/test/lib/serialization.ts +38 -0
- package/test/observable-promise.test.ts +205 -0
- package/test/observable.test.ts +87 -0
- package/test/pool.test.ts +183 -0
- package/test/serialization.test.ts +23 -0
- package/test/spawn.chromium.mocha.ts +53 -0
- package/test/spawn.test.ts +87 -0
- package/test/streaming.test.ts +29 -0
- package/test/transferables.test.ts +71 -0
- package/test/workers/arraybuffer-xor.ts +10 -0
- package/test/workers/count-to-five.ts +12 -0
- package/test/workers/counter.ts +19 -0
- package/test/workers/faulty-function.ts +5 -0
- package/test/workers/hello-world.ts +5 -0
- package/test/workers/increment.ts +8 -0
- package/test/workers/minmax.ts +25 -0
- package/test/workers/serialization.ts +13 -0
- package/test/workers/top-level-throw.ts +1 -0
- package/test-tooling/rollup/app.js +21 -0
- package/test-tooling/rollup/rollup.config.ts +14 -0
- package/test-tooling/rollup/worker.js +7 -0
- package/test-tooling/tsconfig/minimal.ts +12 -0
- package/test-tooling/webpack/addition-worker.ts +9 -0
- package/test-tooling/webpack/app-with-inlined-worker.ts +28 -0
- package/test-tooling/webpack/app.ts +61 -0
- package/test-tooling/webpack/pool-worker.ts +5 -0
- package/test-tooling/webpack/raw-loader.d.ts +4 -0
- package/test-tooling/webpack/webpack.chromium.mocha.ts +21 -0
- package/test-tooling/webpack/webpack.node.config.js +29 -0
- package/test-tooling/webpack/webpack.web.config.js +28 -0
- package/types/is-observable.d.ts +1 -1
- package/types/webworker.d.ts +9 -0
- package/worker.d.ts +2 -0
- package/worker.js +2 -0
- package/worker.mjs +6 -0
- package/dist/browser/master/implementation.browser.mjs +0 -89
- package/dist/browser/master/implementation.browser.mjs.map +0 -1
- package/dist/browser/worker/worker.browser.mjs +0 -291
- package/dist/browser/worker/worker.browser.mjs.map +0 -1
- package/dist/neutral/index.mjs +0 -1022
- package/dist/neutral/index.mjs.map +0 -1
- package/dist/neutral/master/implementation.mjs +0 -264
- package/dist/neutral/master/implementation.mjs.map +0 -1
- package/dist/neutral/master/index.mjs +0 -988
- package/dist/neutral/master/index.mjs.map +0 -1
- package/dist/neutral/master/pool.mjs +0 -579
- package/dist/neutral/master/pool.mjs.map +0 -1
- package/dist/neutral/master/register.mjs +0 -272
- package/dist/neutral/master/register.mjs.map +0 -1
- package/dist/neutral/master/spawn.mjs +0 -412
- package/dist/neutral/master/spawn.mjs.map +0 -1
- package/dist/neutral/master/thread.mjs +0 -29
- package/dist/neutral/master/thread.mjs.map +0 -1
- package/dist/neutral/observable-promise.mjs +0 -132
- package/dist/neutral/observable-promise.mjs.map +0 -1
- package/dist/neutral/observable.mjs +0 -31
- package/dist/neutral/observable.mjs.map +0 -1
- package/dist/node/master/implementation.node.mjs +0 -154
- package/dist/node/master/implementation.node.mjs.map +0 -1
- package/dist/node/worker/worker.node.mjs +0 -304
- package/dist/node/worker/worker.node.mjs.map +0 -1
- package/dist/types/common.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -9
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/master/get-bundle-url.browser.d.ts.map +0 -1
- package/dist/types/master/implementation.browser.d.ts.map +0 -1
- package/dist/types/master/implementation.d.ts.map +0 -1
- package/dist/types/master/implementation.node.d.ts.map +0 -1
- package/dist/types/master/index.d.ts +0 -13
- package/dist/types/master/index.d.ts.map +0 -1
- package/dist/types/master/invocation-proxy.d.ts.map +0 -1
- package/dist/types/master/pool-types.d.ts.map +0 -1
- package/dist/types/master/pool.d.ts +0 -93
- package/dist/types/master/pool.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.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/ponyfills.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.map +0 -1
- 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.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 +0 -14
- package/dist/types/worker/worker.browser.d.ts.map +0 -1
- package/dist/types/worker/worker.node.d.ts +0 -25
- package/dist/types/worker/worker.node.d.ts.map +0 -1
- package/src/worker/WorkerGlobalScope.ts +0 -5
- package/src/worker/expose.ts +0 -234
- package/src/worker/is-observable.d.ts +0 -7
- package/xy.config.ts +0 -24
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isTransferDescriptor = isTransferDescriptor;
|
|
4
|
+
exports.Transfer = Transfer;
|
|
5
|
+
const symbols_1 = require("./symbols");
|
|
6
|
+
function isTransferable(thing) {
|
|
7
|
+
if (!thing || typeof thing !== 'object')
|
|
8
|
+
return false;
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
function isTransferDescriptor(thing) {
|
|
12
|
+
return thing && typeof thing === 'object' && thing[symbols_1.$transferable];
|
|
13
|
+
}
|
|
14
|
+
function Transfer(payload, transferables) {
|
|
15
|
+
if (!transferables) {
|
|
16
|
+
if (!isTransferable(payload))
|
|
17
|
+
throw new Error('Not transferable');
|
|
18
|
+
transferables = [payload];
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
[symbols_1.$transferable]: true,
|
|
22
|
+
send: payload,
|
|
23
|
+
transferables,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WorkerEventType = void 0;
|
|
4
|
+
var WorkerEventType;
|
|
5
|
+
(function (WorkerEventType) {
|
|
6
|
+
WorkerEventType["internalError"] = "internalError";
|
|
7
|
+
WorkerEventType["message"] = "message";
|
|
8
|
+
WorkerEventType["termination"] = "termination";
|
|
9
|
+
})(WorkerEventType || (exports.WorkerEventType = WorkerEventType = {}));
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WorkerMessageType = exports.MasterMessageType = void 0;
|
|
4
|
+
var MasterMessageType;
|
|
5
|
+
(function (MasterMessageType) {
|
|
6
|
+
MasterMessageType["cancel"] = "cancel";
|
|
7
|
+
MasterMessageType["run"] = "run";
|
|
8
|
+
})(MasterMessageType || (exports.MasterMessageType = MasterMessageType = {}));
|
|
9
|
+
var WorkerMessageType;
|
|
10
|
+
(function (WorkerMessageType) {
|
|
11
|
+
WorkerMessageType["error"] = "error";
|
|
12
|
+
WorkerMessageType["init"] = "init";
|
|
13
|
+
WorkerMessageType["result"] = "result";
|
|
14
|
+
WorkerMessageType["running"] = "running";
|
|
15
|
+
WorkerMessageType["uncaughtError"] = "uncaughtError";
|
|
16
|
+
})(WorkerMessageType || (exports.WorkerMessageType = WorkerMessageType = {}));
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
const index_1 = require("./index");
|
|
18
|
+
__exportStar(require("./index"), exports);
|
|
19
|
+
if (typeof globalThis !== 'undefined') {
|
|
20
|
+
;
|
|
21
|
+
globalThis.expose = index_1.expose;
|
|
22
|
+
}
|
|
23
|
+
if (typeof globalThis !== 'undefined') {
|
|
24
|
+
;
|
|
25
|
+
globalThis.expose = index_1.expose;
|
|
26
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const isWorkerRuntime = function isWorkerRuntime() {
|
|
4
|
+
const isWindowContext = self !== undefined && typeof Window !== 'undefined' && self instanceof Window;
|
|
5
|
+
return self !== undefined && self['postMessage'] && !isWindowContext ? true : false;
|
|
6
|
+
};
|
|
7
|
+
const postMessageToMaster = function postMessageToMaster(data, transferList) {
|
|
8
|
+
self.postMessage(data, transferList);
|
|
9
|
+
};
|
|
10
|
+
const subscribeToMasterMessages = function subscribeToMasterMessages(onMessage) {
|
|
11
|
+
const messageHandler = (messageEvent) => {
|
|
12
|
+
onMessage(messageEvent.data);
|
|
13
|
+
};
|
|
14
|
+
const unsubscribe = () => {
|
|
15
|
+
self.removeEventListener('message', messageHandler);
|
|
16
|
+
};
|
|
17
|
+
self.addEventListener('message', messageHandler);
|
|
18
|
+
return unsubscribe;
|
|
19
|
+
};
|
|
20
|
+
exports.default = {
|
|
21
|
+
isWorkerRuntime,
|
|
22
|
+
postMessageToMaster,
|
|
23
|
+
subscribeToMasterMessages,
|
|
24
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const implementation_browser_1 = __importDefault(require("./implementation.browser"));
|
|
7
|
+
const implementation_tiny_worker_1 = __importDefault(require("./implementation.tiny-worker"));
|
|
8
|
+
const implementation_worker_threads_1 = __importDefault(require("./implementation.worker_threads"));
|
|
9
|
+
const runningInNode = typeof process !== 'undefined' && process.arch !== 'browser' && 'pid' in process;
|
|
10
|
+
function selectNodeImplementation() {
|
|
11
|
+
try {
|
|
12
|
+
implementation_worker_threads_1.default.testImplementation();
|
|
13
|
+
return implementation_worker_threads_1.default;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return implementation_tiny_worker_1.default;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.default = runningInNode ? selectNodeImplementation() : implementation_browser_1.default;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
try {
|
|
4
|
+
if (self === undefined) {
|
|
5
|
+
;
|
|
6
|
+
globalThis.self = globalThis;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
;
|
|
11
|
+
globalThis.self = globalThis;
|
|
12
|
+
}
|
|
13
|
+
const isWorkerRuntime = function isWorkerRuntime() {
|
|
14
|
+
return self !== undefined && self['postMessage'] ? true : false;
|
|
15
|
+
};
|
|
16
|
+
const postMessageToMaster = function postMessageToMaster(data) {
|
|
17
|
+
self.postMessage(data);
|
|
18
|
+
};
|
|
19
|
+
let muxingHandlerSetUp = false;
|
|
20
|
+
const messageHandlers = new Set();
|
|
21
|
+
const subscribeToMasterMessages = function subscribeToMasterMessages(onMessage) {
|
|
22
|
+
if (!muxingHandlerSetUp) {
|
|
23
|
+
self.addEventListener('message', ((event) => {
|
|
24
|
+
for (const handler of messageHandlers)
|
|
25
|
+
handler(event.data);
|
|
26
|
+
}));
|
|
27
|
+
muxingHandlerSetUp = true;
|
|
28
|
+
}
|
|
29
|
+
messageHandlers.add(onMessage);
|
|
30
|
+
const unsubscribe = () => messageHandlers.delete(onMessage);
|
|
31
|
+
return unsubscribe;
|
|
32
|
+
};
|
|
33
|
+
exports.default = {
|
|
34
|
+
isWorkerRuntime,
|
|
35
|
+
postMessageToMaster,
|
|
36
|
+
subscribeToMasterMessages,
|
|
37
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const worker_threads_1 = __importDefault(require("../worker_threads"));
|
|
7
|
+
function assertMessagePort(port) {
|
|
8
|
+
if (!port) {
|
|
9
|
+
throw new Error('Invariant violation: MessagePort to parent is not available.');
|
|
10
|
+
}
|
|
11
|
+
return port;
|
|
12
|
+
}
|
|
13
|
+
const isWorkerRuntime = function isWorkerRuntime() {
|
|
14
|
+
return !(0, worker_threads_1.default)().isMainThread;
|
|
15
|
+
};
|
|
16
|
+
const postMessageToMaster = function postMessageToMaster(data, transferList) {
|
|
17
|
+
assertMessagePort((0, worker_threads_1.default)().parentPort).postMessage(data, transferList);
|
|
18
|
+
};
|
|
19
|
+
const subscribeToMasterMessages = function subscribeToMasterMessages(onMessage) {
|
|
20
|
+
const parentPort = (0, worker_threads_1.default)().parentPort;
|
|
21
|
+
if (!parentPort) {
|
|
22
|
+
throw new Error('Invariant violation: MessagePort to parent is not available.');
|
|
23
|
+
}
|
|
24
|
+
const messageHandler = (message) => {
|
|
25
|
+
onMessage(message);
|
|
26
|
+
};
|
|
27
|
+
const unsubscribe = () => {
|
|
28
|
+
assertMessagePort(parentPort).off('message', messageHandler);
|
|
29
|
+
};
|
|
30
|
+
assertMessagePort(parentPort).on('message', messageHandler);
|
|
31
|
+
return unsubscribe;
|
|
32
|
+
};
|
|
33
|
+
function testImplementation() {
|
|
34
|
+
(0, worker_threads_1.default)();
|
|
35
|
+
}
|
|
36
|
+
exports.default = {
|
|
37
|
+
isWorkerRuntime,
|
|
38
|
+
postMessageToMaster,
|
|
39
|
+
subscribeToMasterMessages,
|
|
40
|
+
testImplementation,
|
|
41
|
+
};
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.isWorkerRuntime = exports.Transfer = exports.registerSerializer = void 0;
|
|
7
|
+
exports.expose = expose;
|
|
8
|
+
const is_observable_2_1_0_1 = __importDefault(require("is-observable-2-1-0"));
|
|
9
|
+
const common_1 = require("../common");
|
|
10
|
+
const transferable_1 = require("../transferable");
|
|
11
|
+
const messages_1 = require("../types/messages");
|
|
12
|
+
const implementation_1 = __importDefault(require("./implementation"));
|
|
13
|
+
var common_2 = require("../common");
|
|
14
|
+
Object.defineProperty(exports, "registerSerializer", { enumerable: true, get: function () { return common_2.registerSerializer; } });
|
|
15
|
+
var transferable_2 = require("../transferable");
|
|
16
|
+
Object.defineProperty(exports, "Transfer", { enumerable: true, get: function () { return transferable_2.Transfer; } });
|
|
17
|
+
exports.isWorkerRuntime = implementation_1.default.isWorkerRuntime;
|
|
18
|
+
let exposeCalled = false;
|
|
19
|
+
const activeSubscriptions = new Map();
|
|
20
|
+
const isMasterJobCancelMessage = (thing) => thing && thing.type === messages_1.MasterMessageType.cancel;
|
|
21
|
+
const isMasterJobRunMessage = (thing) => thing && thing.type === messages_1.MasterMessageType.run;
|
|
22
|
+
const isObservable = (thing) => (0, is_observable_2_1_0_1.default)(thing) || isZenObservable(thing);
|
|
23
|
+
function isZenObservable(thing) {
|
|
24
|
+
return thing && typeof thing === 'object' && typeof thing.subscribe === 'function';
|
|
25
|
+
}
|
|
26
|
+
function deconstructTransfer(thing) {
|
|
27
|
+
return (0, transferable_1.isTransferDescriptor)(thing) ? { payload: thing.send, transferables: thing.transferables } : { payload: thing, transferables: undefined };
|
|
28
|
+
}
|
|
29
|
+
function postFunctionInitMessage() {
|
|
30
|
+
const initMessage = {
|
|
31
|
+
exposed: { type: 'function' },
|
|
32
|
+
type: messages_1.WorkerMessageType.init,
|
|
33
|
+
};
|
|
34
|
+
implementation_1.default.postMessageToMaster(initMessage);
|
|
35
|
+
}
|
|
36
|
+
function postModuleInitMessage(methodNames) {
|
|
37
|
+
const initMessage = {
|
|
38
|
+
exposed: {
|
|
39
|
+
methods: methodNames,
|
|
40
|
+
type: 'module',
|
|
41
|
+
},
|
|
42
|
+
type: messages_1.WorkerMessageType.init,
|
|
43
|
+
};
|
|
44
|
+
implementation_1.default.postMessageToMaster(initMessage);
|
|
45
|
+
}
|
|
46
|
+
function postJobErrorMessage(uid, rawError) {
|
|
47
|
+
const { payload: error, transferables } = deconstructTransfer(rawError);
|
|
48
|
+
const errorMessage = {
|
|
49
|
+
error: (0, common_1.serialize)(error),
|
|
50
|
+
type: messages_1.WorkerMessageType.error,
|
|
51
|
+
uid,
|
|
52
|
+
};
|
|
53
|
+
implementation_1.default.postMessageToMaster(errorMessage, transferables);
|
|
54
|
+
}
|
|
55
|
+
function postJobResultMessage(uid, completed, resultValue) {
|
|
56
|
+
const { payload, transferables } = deconstructTransfer(resultValue);
|
|
57
|
+
const resultMessage = {
|
|
58
|
+
complete: completed ? true : undefined,
|
|
59
|
+
payload,
|
|
60
|
+
type: messages_1.WorkerMessageType.result,
|
|
61
|
+
uid,
|
|
62
|
+
};
|
|
63
|
+
implementation_1.default.postMessageToMaster(resultMessage, transferables);
|
|
64
|
+
}
|
|
65
|
+
function postJobStartMessage(uid, resultType) {
|
|
66
|
+
const startMessage = {
|
|
67
|
+
resultType,
|
|
68
|
+
type: messages_1.WorkerMessageType.running,
|
|
69
|
+
uid,
|
|
70
|
+
};
|
|
71
|
+
implementation_1.default.postMessageToMaster(startMessage);
|
|
72
|
+
}
|
|
73
|
+
function postUncaughtErrorMessage(error) {
|
|
74
|
+
try {
|
|
75
|
+
const errorMessage = {
|
|
76
|
+
error: (0, common_1.serialize)(error),
|
|
77
|
+
type: messages_1.WorkerMessageType.uncaughtError,
|
|
78
|
+
};
|
|
79
|
+
implementation_1.default.postMessageToMaster(errorMessage);
|
|
80
|
+
}
|
|
81
|
+
catch (subError) {
|
|
82
|
+
console.error('Not reporting uncaught error back to master thread as it ' + 'occured while reporting an uncaught error already.' + '\nLatest error:', subError, '\nOriginal error:', error);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async function runFunction(jobUID, fn, args) {
|
|
86
|
+
let syncResult;
|
|
87
|
+
try {
|
|
88
|
+
syncResult = fn(...args);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
return postJobErrorMessage(jobUID, error);
|
|
92
|
+
}
|
|
93
|
+
const resultType = isObservable(syncResult) ? 'observable' : 'promise';
|
|
94
|
+
postJobStartMessage(jobUID, resultType);
|
|
95
|
+
if (isObservable(syncResult)) {
|
|
96
|
+
const subscription = syncResult.subscribe(value => postJobResultMessage(jobUID, false, (0, common_1.serialize)(value)), (error) => {
|
|
97
|
+
postJobErrorMessage(jobUID, (0, common_1.serialize)(error));
|
|
98
|
+
activeSubscriptions.delete(jobUID);
|
|
99
|
+
}, () => {
|
|
100
|
+
postJobResultMessage(jobUID, true);
|
|
101
|
+
activeSubscriptions.delete(jobUID);
|
|
102
|
+
});
|
|
103
|
+
activeSubscriptions.set(jobUID, subscription);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
try {
|
|
107
|
+
const result = await syncResult;
|
|
108
|
+
postJobResultMessage(jobUID, true, (0, common_1.serialize)(result));
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
postJobErrorMessage(jobUID, (0, common_1.serialize)(error));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function expose(exposed) {
|
|
116
|
+
if (!implementation_1.default.isWorkerRuntime()) {
|
|
117
|
+
throw new Error('expose() called in the master thread.');
|
|
118
|
+
}
|
|
119
|
+
if (exposeCalled) {
|
|
120
|
+
throw new Error('expose() called more than once. This is not possible. Pass an object to expose() if you want to expose multiple functions.');
|
|
121
|
+
}
|
|
122
|
+
exposeCalled = true;
|
|
123
|
+
if (typeof exposed === 'function') {
|
|
124
|
+
implementation_1.default.subscribeToMasterMessages((messageData) => {
|
|
125
|
+
if (isMasterJobRunMessage(messageData) && !messageData.method) {
|
|
126
|
+
runFunction(messageData.uid, exposed, messageData.args.map(common_1.deserialize));
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
postFunctionInitMessage();
|
|
130
|
+
}
|
|
131
|
+
else if (typeof exposed === 'object' && exposed) {
|
|
132
|
+
implementation_1.default.subscribeToMasterMessages((messageData) => {
|
|
133
|
+
if (isMasterJobRunMessage(messageData) && messageData.method) {
|
|
134
|
+
runFunction(messageData.uid, exposed[messageData.method], messageData.args.map(common_1.deserialize));
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
const methodNames = Object.keys(exposed).filter(key => typeof exposed[key] === 'function');
|
|
138
|
+
postModuleInitMessage(methodNames);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
throw new Error(`Invalid argument passed to expose(). Expected a function or an object, got: ${exposed}`);
|
|
142
|
+
}
|
|
143
|
+
implementation_1.default.subscribeToMasterMessages((messageData) => {
|
|
144
|
+
if (isMasterJobCancelMessage(messageData)) {
|
|
145
|
+
const jobUID = messageData.uid;
|
|
146
|
+
const subscription = activeSubscriptions.get(jobUID);
|
|
147
|
+
if (subscription) {
|
|
148
|
+
subscription.unsubscribe();
|
|
149
|
+
activeSubscriptions.delete(jobUID);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
if (typeof globalThis !== 'undefined' && typeof self.addEventListener === 'function' && implementation_1.default.isWorkerRuntime()) {
|
|
155
|
+
self.addEventListener('error', (event) => {
|
|
156
|
+
setTimeout(() => postUncaughtErrorMessage(event.error || event), 250);
|
|
157
|
+
});
|
|
158
|
+
self.addEventListener('unhandledrejection', (event) => {
|
|
159
|
+
const error = event.reason;
|
|
160
|
+
if (error && typeof error.message === 'string') {
|
|
161
|
+
setTimeout(() => postUncaughtErrorMessage(error), 250);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
if (typeof process !== 'undefined' && typeof process.on === 'function' && implementation_1.default.isWorkerRuntime()) {
|
|
166
|
+
process.on('uncaughtException', (error) => {
|
|
167
|
+
setTimeout(() => postUncaughtErrorMessage(error), 250);
|
|
168
|
+
});
|
|
169
|
+
process.on('unhandledRejection', (error) => {
|
|
170
|
+
if (error && typeof error.message === 'string') {
|
|
171
|
+
setTimeout(() => postUncaughtErrorMessage(error), 250);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = getImplementation;
|
|
4
|
+
let implementation;
|
|
5
|
+
function selectImplementation() {
|
|
6
|
+
return typeof __non_webpack_require__ === 'function' ? __non_webpack_require__('worker_threads') : eval('require')('worker_threads');
|
|
7
|
+
}
|
|
8
|
+
function getImplementation() {
|
|
9
|
+
if (!implementation) {
|
|
10
|
+
implementation = selectImplementation();
|
|
11
|
+
}
|
|
12
|
+
return implementation;
|
|
13
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { registerSerializer } from './common';
|
|
2
|
+
export * from './master/index';
|
|
3
|
+
export { QueuedTask } from './master/pool';
|
|
4
|
+
export { ExposedToThreadType as ExposedAs } from './master/spawn';
|
|
5
|
+
export { DefaultSerializer, JsonSerializable, Serializer, SerializerImplementation, } from './serializers';
|
|
6
|
+
export { Transfer, TransferDescriptor } from './transferable';
|
|
7
|
+
export { expose } from './worker/index';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.expose = exports.Transfer = exports.DefaultSerializer = exports.registerSerializer = void 0;
|
|
18
|
+
var common_1 = require("./common");
|
|
19
|
+
Object.defineProperty(exports, "registerSerializer", { enumerable: true, get: function () { return common_1.registerSerializer; } });
|
|
20
|
+
__exportStar(require("./master/index"), exports);
|
|
21
|
+
var serializers_1 = require("./serializers");
|
|
22
|
+
Object.defineProperty(exports, "DefaultSerializer", { enumerable: true, get: function () { return serializers_1.DefaultSerializer; } });
|
|
23
|
+
var transferable_1 = require("./transferable");
|
|
24
|
+
Object.defineProperty(exports, "Transfer", { enumerable: true, get: function () { return transferable_1.Transfer; } });
|
|
25
|
+
var index_1 = require("./worker/index");
|
|
26
|
+
Object.defineProperty(exports, "expose", { enumerable: true, get: function () { return index_1.expose; } });
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getBundleURL = getBundleURLCached;
|
|
4
|
+
let bundleURL;
|
|
5
|
+
function getBundleURLCached() {
|
|
6
|
+
if (!bundleURL) {
|
|
7
|
+
bundleURL = getBundleURL();
|
|
8
|
+
}
|
|
9
|
+
return bundleURL;
|
|
10
|
+
}
|
|
11
|
+
function getBundleURL() {
|
|
12
|
+
try {
|
|
13
|
+
throw new Error('getBundleURL failed');
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
const matches = ('' + err.stack).match(/(https?|file|ftp|chrome-extension|moz-extension):\/\/[^\n)]+/g);
|
|
17
|
+
if (matches) {
|
|
18
|
+
return getBaseURL(matches[0]);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return '/';
|
|
22
|
+
}
|
|
23
|
+
function getBaseURL(url) {
|
|
24
|
+
return ('' + url).replace(/^((?:https?|file|ftp|chrome-extension|moz-extension):\/\/.+)?\/[^/]+(?:\?.*)?$/, '$1') + '/';
|
|
25
|
+
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type { ImplementationExport } from '../types/master
|
|
1
|
+
import type { ImplementationExport } from '../types/master';
|
|
2
2
|
export declare const defaultPoolSize: number;
|
|
3
3
|
export declare function getWorkerImplementation(): ImplementationExport;
|
|
4
4
|
export declare function isWorkerRuntime(): boolean;
|
|
5
|
-
//# sourceMappingURL=implementation.browser.d.ts.map
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.defaultPoolSize = void 0;
|
|
4
|
+
exports.getWorkerImplementation = getWorkerImplementation;
|
|
5
|
+
exports.isWorkerRuntime = isWorkerRuntime;
|
|
6
|
+
const get_bundle_url_browser_1 = require("./get-bundle-url.browser");
|
|
7
|
+
exports.defaultPoolSize = typeof navigator !== 'undefined' && navigator.hardwareConcurrency ? navigator.hardwareConcurrency : 4;
|
|
8
|
+
const isAbsoluteURL = (value) => /^[A-Za-z][\d+.A-Za-z\-]*:/.test(value);
|
|
9
|
+
function createSourceBlobURL(code) {
|
|
10
|
+
const blob = new Blob([code], { type: 'application/javascript' });
|
|
11
|
+
return URL.createObjectURL(blob);
|
|
12
|
+
}
|
|
13
|
+
function selectWorkerImplementation() {
|
|
14
|
+
if (typeof Worker === 'undefined') {
|
|
15
|
+
return class NoWebWorker {
|
|
16
|
+
constructor() {
|
|
17
|
+
throw new Error("No web worker implementation available. You might have tried to spawn a worker within a worker in a browser that doesn't support workers in workers.");
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
class WebWorker extends Worker {
|
|
22
|
+
constructor(url, options) {
|
|
23
|
+
if (typeof url === 'string' && options && options._baseURL) {
|
|
24
|
+
url = new URL(url, options._baseURL);
|
|
25
|
+
}
|
|
26
|
+
else if (typeof url === 'string' && !isAbsoluteURL(url) && /^file:\/\//i.test((0, get_bundle_url_browser_1.getBundleURL)())) {
|
|
27
|
+
url = new URL(url, (0, get_bundle_url_browser_1.getBundleURL)().replace(/\/[^/]+$/, '/'));
|
|
28
|
+
if (options?.CORSWorkaround ?? true) {
|
|
29
|
+
url = createSourceBlobURL(`importScripts(${JSON.stringify(url)});`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (typeof url === 'string'
|
|
33
|
+
&& isAbsoluteURL(url)
|
|
34
|
+
&& (options?.CORSWorkaround ?? true)) {
|
|
35
|
+
url = createSourceBlobURL(`importScripts(${JSON.stringify(url)});`);
|
|
36
|
+
}
|
|
37
|
+
super(url, options);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
class BlobWorker extends WebWorker {
|
|
41
|
+
constructor(blob, options) {
|
|
42
|
+
const url = globalThis.URL.createObjectURL(blob);
|
|
43
|
+
super(url, options);
|
|
44
|
+
}
|
|
45
|
+
static fromText(source, options) {
|
|
46
|
+
const blob = new globalThis.Blob([source], { type: 'text/javascript' });
|
|
47
|
+
return new BlobWorker(blob, options);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
blob: BlobWorker,
|
|
52
|
+
default: WebWorker,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
let implementation;
|
|
56
|
+
function getWorkerImplementation() {
|
|
57
|
+
if (!implementation) {
|
|
58
|
+
implementation = selectWorkerImplementation();
|
|
59
|
+
}
|
|
60
|
+
return implementation;
|
|
61
|
+
}
|
|
62
|
+
function isWorkerRuntime() {
|
|
63
|
+
const isWindowContext = typeof globalThis !== 'undefined' && typeof Window !== 'undefined' && globalThis instanceof Window;
|
|
64
|
+
return typeof globalThis !== 'undefined' && self['postMessage'] && !isWindowContext ? true : false;
|
|
65
|
+
}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import * as BrowserImplementation from './implementation.browser
|
|
2
|
-
/** Default size of pools. Depending on the platform the value might vary from device to device. */
|
|
1
|
+
import * as BrowserImplementation from './implementation.browser';
|
|
3
2
|
export declare const defaultPoolSize: number;
|
|
4
3
|
export declare const getWorkerImplementation: typeof BrowserImplementation.getWorkerImplementation;
|
|
5
|
-
/** Returns `true` if this code is currently running in a worker. */
|
|
6
4
|
export declare const isWorkerRuntime: typeof BrowserImplementation.isWorkerRuntime;
|
|
7
|
-
//# sourceMappingURL=implementation.d.ts.map
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.isWorkerRuntime = exports.getWorkerImplementation = exports.defaultPoolSize = void 0;
|
|
37
|
+
const BrowserImplementation = __importStar(require("./implementation.browser"));
|
|
38
|
+
const NodeImplementation = __importStar(require("./implementation.node"));
|
|
39
|
+
const runningInNode = typeof process !== 'undefined' && process.arch !== 'browser' && 'pid' in process;
|
|
40
|
+
const implementation = runningInNode ? NodeImplementation : BrowserImplementation;
|
|
41
|
+
exports.defaultPoolSize = implementation.defaultPoolSize;
|
|
42
|
+
exports.getWorkerImplementation = implementation.getWorkerImplementation;
|
|
43
|
+
exports.isWorkerRuntime = implementation.isWorkerRuntime;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type { ImplementationExport } from '../types/master
|
|
1
|
+
import type { ImplementationExport } from '../types/master';
|
|
2
2
|
export declare const defaultPoolSize: number;
|
|
3
3
|
export declare function getWorkerImplementation(): ImplementationExport;
|
|
4
4
|
export declare function isWorkerRuntime(): boolean;
|
|
5
|
-
//# sourceMappingURL=implementation.node.d.ts.map
|