@xylabs/threads 3.5.5 → 3.5.7
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/esm/common.js +11 -6
- package/dist/esm/index.js +26 -5
- package/dist/esm/master/get-bundle-url.browser.js +4 -1
- package/dist/esm/master/implementation.browser.js +11 -6
- package/dist/esm/master/implementation.js +31 -5
- package/dist/esm/master/implementation.node.js +21 -13
- package/dist/esm/master/index.js +14 -7
- package/dist/esm/master/invocation-proxy.js +30 -23
- package/dist/esm/master/pool-types.js +5 -2
- package/dist/esm/master/pool.js +41 -33
- package/dist/esm/master/register.js +5 -3
- package/dist/esm/master/spawn.js +30 -24
- package/dist/esm/master/thread.js +8 -5
- package/dist/esm/observable-promise.js +6 -2
- package/dist/esm/observable.js +8 -3
- package/dist/esm/ponyfills.js +4 -1
- package/dist/esm/promise.js +4 -1
- package/dist/esm/serializers.js +6 -2
- package/dist/esm/symbols.js +8 -5
- package/dist/esm/transferable.js +9 -5
- package/dist/esm/types/master.js +6 -3
- package/dist/esm/types/messages.js +7 -4
- package/dist/esm/types/worker.js +2 -1
- package/dist/esm/worker/bundle-entry.js +20 -4
- package/dist/esm/worker/implementation.browser.js +3 -1
- package/dist/esm/worker/implementation.js +12 -7
- package/dist/esm/worker/implementation.tiny-worker.js +3 -1
- package/dist/esm/worker/implementation.worker_threads.js +11 -6
- package/dist/esm/worker/index.js +48 -39
- package/dist/esm/worker_threads.js +4 -1
- package/package.json +5 -1
package/dist/esm/master/spawn.js
CHANGED
|
@@ -1,13 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
const
|
|
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.spawn = spawn;
|
|
7
|
+
const debug_1 = __importDefault(require("debug"));
|
|
8
|
+
const observable_fns_1 = require("observable-fns");
|
|
9
|
+
const common_1 = require("../common");
|
|
10
|
+
const promise_1 = require("../promise");
|
|
11
|
+
const symbols_1 = require("../symbols");
|
|
12
|
+
const master_1 = require("../types/master");
|
|
13
|
+
const invocation_proxy_1 = require("./invocation-proxy");
|
|
14
|
+
const debugMessages = (0, debug_1.default)('threads:master:messages');
|
|
15
|
+
const debugSpawn = (0, debug_1.default)('threads:master:spawn');
|
|
16
|
+
const debugThreadUtils = (0, debug_1.default)('threads:master:thread-utils');
|
|
11
17
|
const isInitMessage = (data) => data && data.type === 'init';
|
|
12
18
|
const isUncaughtErrorMessage = (data) => data && data.type === 'uncaughtError';
|
|
13
19
|
const initMessageTimeout = typeof process !== 'undefined' && process.env !== undefined && process.env.THREADS_WORKER_INIT_TIMEOUT ?
|
|
@@ -32,18 +38,18 @@ function receiveInitMessage(worker) {
|
|
|
32
38
|
}
|
|
33
39
|
else if (isUncaughtErrorMessage(event.data)) {
|
|
34
40
|
worker.removeEventListener('message', messageHandler);
|
|
35
|
-
reject(deserialize(event.data.error));
|
|
41
|
+
reject((0, common_1.deserialize)(event.data.error));
|
|
36
42
|
}
|
|
37
43
|
});
|
|
38
44
|
worker.addEventListener('message', messageHandler);
|
|
39
45
|
});
|
|
40
46
|
}
|
|
41
47
|
function createEventObservable(worker, workerTermination) {
|
|
42
|
-
return new Observable((observer) => {
|
|
48
|
+
return new observable_fns_1.Observable((observer) => {
|
|
43
49
|
const messageHandler = ((messageEvent) => {
|
|
44
50
|
const workerEvent = {
|
|
45
51
|
data: messageEvent.data,
|
|
46
|
-
type: WorkerEventType.message,
|
|
52
|
+
type: master_1.WorkerEventType.message,
|
|
47
53
|
};
|
|
48
54
|
observer.next(workerEvent);
|
|
49
55
|
});
|
|
@@ -51,7 +57,7 @@ function createEventObservable(worker, workerTermination) {
|
|
|
51
57
|
debugThreadUtils('Unhandled promise rejection event in thread:', errorEvent);
|
|
52
58
|
const workerEvent = {
|
|
53
59
|
error: new Error(errorEvent.reason),
|
|
54
|
-
type: WorkerEventType.internalError,
|
|
60
|
+
type: master_1.WorkerEventType.internalError,
|
|
55
61
|
};
|
|
56
62
|
observer.next(workerEvent);
|
|
57
63
|
});
|
|
@@ -59,7 +65,7 @@ function createEventObservable(worker, workerTermination) {
|
|
|
59
65
|
worker.addEventListener('unhandledrejection', rejectionHandler);
|
|
60
66
|
workerTermination.then(() => {
|
|
61
67
|
const terminationEvent = {
|
|
62
|
-
type: WorkerEventType.termination,
|
|
68
|
+
type: master_1.WorkerEventType.termination,
|
|
63
69
|
};
|
|
64
70
|
worker.removeEventListener('message', messageHandler);
|
|
65
71
|
worker.removeEventListener('unhandledrejection', rejectionHandler);
|
|
@@ -69,7 +75,7 @@ function createEventObservable(worker, workerTermination) {
|
|
|
69
75
|
});
|
|
70
76
|
}
|
|
71
77
|
function createTerminator(worker) {
|
|
72
|
-
const [termination, resolver] = createPromiseWithResolver();
|
|
78
|
+
const [termination, resolver] = (0, promise_1.createPromiseWithResolver)();
|
|
73
79
|
const terminate = async () => {
|
|
74
80
|
debugThreadUtils('Terminating worker');
|
|
75
81
|
await worker.terminate();
|
|
@@ -79,16 +85,16 @@ function createTerminator(worker) {
|
|
|
79
85
|
}
|
|
80
86
|
function setPrivateThreadProps(raw, worker, workerEvents, terminate) {
|
|
81
87
|
const workerErrors = workerEvents
|
|
82
|
-
.filter((event) => event.type === WorkerEventType.internalError)
|
|
88
|
+
.filter((event) => event.type === master_1.WorkerEventType.internalError)
|
|
83
89
|
.map((errorEvent) => errorEvent.error);
|
|
84
90
|
return Object.assign(raw, {
|
|
85
|
-
[
|
|
86
|
-
[
|
|
87
|
-
[
|
|
88
|
-
[
|
|
91
|
+
[symbols_1.$errors]: workerErrors,
|
|
92
|
+
[symbols_1.$events]: workerEvents,
|
|
93
|
+
[symbols_1.$terminate]: terminate,
|
|
94
|
+
[symbols_1.$worker]: worker,
|
|
89
95
|
});
|
|
90
96
|
}
|
|
91
|
-
|
|
97
|
+
async function spawn(worker, options) {
|
|
92
98
|
debugSpawn('Initializing new thread');
|
|
93
99
|
const timeout = options && options.timeout ? options.timeout : initMessageTimeout;
|
|
94
100
|
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().`);
|
|
@@ -96,11 +102,11 @@ export async function spawn(worker, options) {
|
|
|
96
102
|
const { termination, terminate } = createTerminator(worker);
|
|
97
103
|
const events = createEventObservable(worker, termination);
|
|
98
104
|
if (exposed.type === 'function') {
|
|
99
|
-
const proxy = createProxyFunction(worker);
|
|
105
|
+
const proxy = (0, invocation_proxy_1.createProxyFunction)(worker);
|
|
100
106
|
return setPrivateThreadProps(proxy, worker, events, terminate);
|
|
101
107
|
}
|
|
102
108
|
else if (exposed.type === 'module') {
|
|
103
|
-
const proxy = createProxyModule(worker, exposed.methods);
|
|
109
|
+
const proxy = (0, invocation_proxy_1.createProxyModule)(worker, exposed.methods);
|
|
104
110
|
return setPrivateThreadProps(proxy, worker, events, terminate);
|
|
105
111
|
}
|
|
106
112
|
else {
|
|
@@ -1,15 +1,18 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Thread = void 0;
|
|
4
|
+
const symbols_1 = require("../symbols");
|
|
2
5
|
function fail(message) {
|
|
3
6
|
throw new Error(message);
|
|
4
7
|
}
|
|
5
|
-
|
|
8
|
+
exports.Thread = {
|
|
6
9
|
errors(thread) {
|
|
7
|
-
return thread[
|
|
10
|
+
return thread[symbols_1.$errors] || fail('Error observable not found. Make sure to pass a thread instance as returned by the spawn() promise.');
|
|
8
11
|
},
|
|
9
12
|
events(thread) {
|
|
10
|
-
return thread[
|
|
13
|
+
return thread[symbols_1.$events] || fail('Events observable not found. Make sure to pass a thread instance as returned by the spawn() promise.');
|
|
11
14
|
},
|
|
12
15
|
terminate(thread) {
|
|
13
|
-
return thread[
|
|
16
|
+
return thread[symbols_1.$terminate]();
|
|
14
17
|
},
|
|
15
18
|
};
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ObservablePromise = void 0;
|
|
4
|
+
const observable_fns_1 = require("observable-fns");
|
|
2
5
|
const doNothing = () => { };
|
|
3
6
|
const returnInput = (input) => input;
|
|
4
7
|
const runDeferred = (fn) => Promise.resolve().then(fn);
|
|
@@ -8,7 +11,7 @@ function fail(error) {
|
|
|
8
11
|
function isThenable(thing) {
|
|
9
12
|
return thing && typeof thing.then === 'function';
|
|
10
13
|
}
|
|
11
|
-
|
|
14
|
+
class ObservablePromise extends observable_fns_1.Observable {
|
|
12
15
|
[Symbol.toStringTag] = '[object ObservablePromise]';
|
|
13
16
|
initHasRun = false;
|
|
14
17
|
fulfillmentCallbacks = [];
|
|
@@ -126,3 +129,4 @@ export class ObservablePromise extends Observable {
|
|
|
126
129
|
: super.from(thing);
|
|
127
130
|
}
|
|
128
131
|
}
|
|
132
|
+
exports.ObservablePromise = ObservablePromise;
|
package/dist/esm/observable.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Observable = exports.Subject = void 0;
|
|
4
|
+
const observable_fns_1 = require("observable-fns");
|
|
2
5
|
const $observers = Symbol('observers');
|
|
3
|
-
|
|
6
|
+
class Subject extends observable_fns_1.Observable {
|
|
4
7
|
[$observers];
|
|
5
8
|
constructor() {
|
|
6
9
|
super((observer) => {
|
|
@@ -25,4 +28,6 @@ export class Subject extends Observable {
|
|
|
25
28
|
observer.next(value);
|
|
26
29
|
}
|
|
27
30
|
}
|
|
28
|
-
|
|
31
|
+
exports.Subject = Subject;
|
|
32
|
+
var observable_fns_2 = require("observable-fns");
|
|
33
|
+
Object.defineProperty(exports, "Observable", { enumerable: true, get: function () { return observable_fns_2.Observable; } });
|
package/dist/esm/ponyfills.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.allSettled = allSettled;
|
|
4
|
+
function allSettled(values) {
|
|
2
5
|
return Promise.all(values.map((item) => {
|
|
3
6
|
const onFulfill = (value) => {
|
|
4
7
|
return { status: 'fulfilled', value };
|
package/dist/esm/promise.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createPromiseWithResolver = createPromiseWithResolver;
|
|
1
4
|
const doNothing = () => undefined;
|
|
2
|
-
|
|
5
|
+
function createPromiseWithResolver() {
|
|
3
6
|
let alreadyResolved = false;
|
|
4
7
|
let resolvedTo;
|
|
5
8
|
let resolver = doNothing;
|
package/dist/esm/serializers.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DefaultSerializer = void 0;
|
|
4
|
+
exports.extendSerializer = extendSerializer;
|
|
5
|
+
function extendSerializer(extend, implementation) {
|
|
2
6
|
const fallbackDeserializer = extend.deserialize.bind(extend);
|
|
3
7
|
const fallbackSerializer = extend.serialize.bind(extend);
|
|
4
8
|
return {
|
|
@@ -27,7 +31,7 @@ const DefaultErrorSerializer = {
|
|
|
27
31
|
},
|
|
28
32
|
};
|
|
29
33
|
const isSerializedError = (thing) => thing && typeof thing === 'object' && '__error_marker' in thing && thing.__error_marker === '$$error';
|
|
30
|
-
|
|
34
|
+
exports.DefaultSerializer = {
|
|
31
35
|
deserialize(message) {
|
|
32
36
|
return isSerializedError(message) ? DefaultErrorSerializer.deserialize(message) : message;
|
|
33
37
|
},
|
package/dist/esm/symbols.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.$worker = exports.$transferable = exports.$terminate = exports.$events = exports.$errors = void 0;
|
|
4
|
+
exports.$errors = Symbol('thread.errors');
|
|
5
|
+
exports.$events = Symbol('thread.events');
|
|
6
|
+
exports.$terminate = Symbol('thread.terminate');
|
|
7
|
+
exports.$transferable = Symbol('thread.transferable');
|
|
8
|
+
exports.$worker = Symbol('thread.worker');
|
package/dist/esm/transferable.js
CHANGED
|
@@ -1,20 +1,24 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isTransferDescriptor = isTransferDescriptor;
|
|
4
|
+
exports.Transfer = Transfer;
|
|
5
|
+
const symbols_1 = require("./symbols");
|
|
2
6
|
function isTransferable(thing) {
|
|
3
7
|
if (!thing || typeof thing !== 'object')
|
|
4
8
|
return false;
|
|
5
9
|
return true;
|
|
6
10
|
}
|
|
7
|
-
|
|
8
|
-
return thing && typeof thing === 'object' && thing[
|
|
11
|
+
function isTransferDescriptor(thing) {
|
|
12
|
+
return thing && typeof thing === 'object' && thing[symbols_1.$transferable];
|
|
9
13
|
}
|
|
10
|
-
|
|
14
|
+
function Transfer(payload, transferables) {
|
|
11
15
|
if (!transferables) {
|
|
12
16
|
if (!isTransferable(payload))
|
|
13
17
|
throw new Error('Not transferable');
|
|
14
18
|
transferables = [payload];
|
|
15
19
|
}
|
|
16
20
|
return {
|
|
17
|
-
[
|
|
21
|
+
[symbols_1.$transferable]: true,
|
|
18
22
|
send: payload,
|
|
19
23
|
transferables,
|
|
20
24
|
};
|
package/dist/esm/types/master.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WorkerEventType = void 0;
|
|
4
|
+
const symbols_1 = require("../symbols");
|
|
5
|
+
var WorkerEventType;
|
|
3
6
|
(function (WorkerEventType) {
|
|
4
7
|
WorkerEventType["internalError"] = "internalError";
|
|
5
8
|
WorkerEventType["message"] = "message";
|
|
6
9
|
WorkerEventType["termination"] = "termination";
|
|
7
|
-
})(WorkerEventType || (WorkerEventType = {}));
|
|
10
|
+
})(WorkerEventType || (exports.WorkerEventType = WorkerEventType = {}));
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WorkerMessageType = exports.MasterMessageType = void 0;
|
|
4
|
+
var MasterMessageType;
|
|
2
5
|
(function (MasterMessageType) {
|
|
3
6
|
MasterMessageType["cancel"] = "cancel";
|
|
4
7
|
MasterMessageType["run"] = "run";
|
|
5
|
-
})(MasterMessageType || (MasterMessageType = {}));
|
|
6
|
-
|
|
8
|
+
})(MasterMessageType || (exports.MasterMessageType = MasterMessageType = {}));
|
|
9
|
+
var WorkerMessageType;
|
|
7
10
|
(function (WorkerMessageType) {
|
|
8
11
|
WorkerMessageType["error"] = "error";
|
|
9
12
|
WorkerMessageType["init"] = "init";
|
|
10
13
|
WorkerMessageType["result"] = "result";
|
|
11
14
|
WorkerMessageType["running"] = "running";
|
|
12
15
|
WorkerMessageType["uncaughtError"] = "uncaughtError";
|
|
13
|
-
})(WorkerMessageType || (WorkerMessageType = {}));
|
|
16
|
+
})(WorkerMessageType || (exports.WorkerMessageType = WorkerMessageType = {}));
|
package/dist/esm/types/worker.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -1,10 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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);
|
|
3
19
|
if (typeof global !== 'undefined') {
|
|
4
20
|
;
|
|
5
|
-
global.expose = expose;
|
|
21
|
+
global.expose = index_1.expose;
|
|
6
22
|
}
|
|
7
23
|
if (typeof self !== 'undefined') {
|
|
8
24
|
;
|
|
9
|
-
self.expose = expose;
|
|
25
|
+
self.expose = index_1.expose;
|
|
10
26
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1
3
|
const isWorkerRuntime = function isWorkerRuntime() {
|
|
2
4
|
const isWindowContext = self !== undefined && typeof Window !== 'undefined' && self instanceof Window;
|
|
3
5
|
return self !== undefined && self['postMessage'] && !isWindowContext ? true : false;
|
|
@@ -15,7 +17,7 @@ const subscribeToMasterMessages = function subscribeToMasterMessages(onMessage)
|
|
|
15
17
|
self.addEventListener('message', messageHandler);
|
|
16
18
|
return unsubscribe;
|
|
17
19
|
};
|
|
18
|
-
|
|
20
|
+
exports.default = {
|
|
19
21
|
isWorkerRuntime,
|
|
20
22
|
postMessageToMaster,
|
|
21
23
|
subscribeToMasterMessages,
|
|
@@ -1,14 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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"));
|
|
4
9
|
const runningInNode = typeof process !== 'undefined' && process.arch !== 'browser' && 'pid' in process;
|
|
5
10
|
function selectNodeImplementation() {
|
|
6
11
|
try {
|
|
7
|
-
|
|
8
|
-
return
|
|
12
|
+
implementation_worker_threads_1.default.testImplementation();
|
|
13
|
+
return implementation_worker_threads_1.default;
|
|
9
14
|
}
|
|
10
15
|
catch {
|
|
11
|
-
return
|
|
16
|
+
return implementation_tiny_worker_1.default;
|
|
12
17
|
}
|
|
13
18
|
}
|
|
14
|
-
|
|
19
|
+
exports.default = runningInNode ? selectNodeImplementation() : implementation_browser_1.default;
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1
3
|
try {
|
|
2
4
|
if (self === undefined) {
|
|
3
5
|
;
|
|
@@ -28,7 +30,7 @@ const subscribeToMasterMessages = function subscribeToMasterMessages(onMessage)
|
|
|
28
30
|
const unsubscribe = () => messageHandlers.delete(onMessage);
|
|
29
31
|
return unsubscribe;
|
|
30
32
|
};
|
|
31
|
-
|
|
33
|
+
exports.default = {
|
|
32
34
|
isWorkerRuntime,
|
|
33
35
|
postMessageToMaster,
|
|
34
36
|
subscribeToMasterMessages,
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
|
|
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"));
|
|
2
7
|
function assertMessagePort(port) {
|
|
3
8
|
if (!port) {
|
|
4
9
|
throw new Error('Invariant violation: MessagePort to parent is not available.');
|
|
@@ -6,13 +11,13 @@ function assertMessagePort(port) {
|
|
|
6
11
|
return port;
|
|
7
12
|
}
|
|
8
13
|
const isWorkerRuntime = function isWorkerRuntime() {
|
|
9
|
-
return !
|
|
14
|
+
return !(0, worker_threads_1.default)().isMainThread;
|
|
10
15
|
};
|
|
11
16
|
const postMessageToMaster = function postMessageToMaster(data, transferList) {
|
|
12
|
-
assertMessagePort(
|
|
17
|
+
assertMessagePort((0, worker_threads_1.default)().parentPort).postMessage(data, transferList);
|
|
13
18
|
};
|
|
14
19
|
const subscribeToMasterMessages = function subscribeToMasterMessages(onMessage) {
|
|
15
|
-
const parentPort =
|
|
20
|
+
const parentPort = (0, worker_threads_1.default)().parentPort;
|
|
16
21
|
if (!parentPort) {
|
|
17
22
|
throw new Error('Invariant violation: MessagePort to parent is not available.');
|
|
18
23
|
}
|
|
@@ -26,9 +31,9 @@ const subscribeToMasterMessages = function subscribeToMasterMessages(onMessage)
|
|
|
26
31
|
return unsubscribe;
|
|
27
32
|
};
|
|
28
33
|
function testImplementation() {
|
|
29
|
-
|
|
34
|
+
(0, worker_threads_1.default)();
|
|
30
35
|
}
|
|
31
|
-
|
|
36
|
+
exports.default = {
|
|
32
37
|
isWorkerRuntime,
|
|
33
38
|
postMessageToMaster,
|
|
34
39
|
subscribeToMasterMessages,
|
package/dist/esm/worker/index.js
CHANGED
|
@@ -1,30 +1,39 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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;
|
|
9
18
|
let exposeCalled = false;
|
|
10
19
|
const activeSubscriptions = new Map();
|
|
11
|
-
const isMasterJobCancelMessage = (thing) => thing && thing.type === MasterMessageType.cancel;
|
|
12
|
-
const isMasterJobRunMessage = (thing) => thing && thing.type === MasterMessageType.run;
|
|
13
|
-
const isObservable = (thing) =>
|
|
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);
|
|
14
23
|
function isZenObservable(thing) {
|
|
15
24
|
return thing && typeof thing === 'object' && typeof thing.subscribe === 'function';
|
|
16
25
|
}
|
|
17
26
|
function deconstructTransfer(thing) {
|
|
18
|
-
return isTransferDescriptor(thing) ? { payload: thing.send, transferables: thing.transferables } : { payload: thing, transferables: undefined };
|
|
27
|
+
return (0, transferable_1.isTransferDescriptor)(thing) ? { payload: thing.send, transferables: thing.transferables } : { payload: thing, transferables: undefined };
|
|
19
28
|
}
|
|
20
29
|
function postFunctionInitMessage() {
|
|
21
30
|
const initMessage = {
|
|
22
31
|
exposed: {
|
|
23
32
|
type: 'function',
|
|
24
33
|
},
|
|
25
|
-
type: WorkerMessageType.init,
|
|
34
|
+
type: messages_1.WorkerMessageType.init,
|
|
26
35
|
};
|
|
27
|
-
|
|
36
|
+
implementation_1.default.postMessageToMaster(initMessage);
|
|
28
37
|
}
|
|
29
38
|
function postModuleInitMessage(methodNames) {
|
|
30
39
|
const initMessage = {
|
|
@@ -32,44 +41,44 @@ function postModuleInitMessage(methodNames) {
|
|
|
32
41
|
methods: methodNames,
|
|
33
42
|
type: 'module',
|
|
34
43
|
},
|
|
35
|
-
type: WorkerMessageType.init,
|
|
44
|
+
type: messages_1.WorkerMessageType.init,
|
|
36
45
|
};
|
|
37
|
-
|
|
46
|
+
implementation_1.default.postMessageToMaster(initMessage);
|
|
38
47
|
}
|
|
39
48
|
function postJobErrorMessage(uid, rawError) {
|
|
40
49
|
const { payload: error, transferables } = deconstructTransfer(rawError);
|
|
41
50
|
const errorMessage = {
|
|
42
|
-
error: serialize(error),
|
|
43
|
-
type: WorkerMessageType.error,
|
|
51
|
+
error: (0, common_1.serialize)(error),
|
|
52
|
+
type: messages_1.WorkerMessageType.error,
|
|
44
53
|
uid,
|
|
45
54
|
};
|
|
46
|
-
|
|
55
|
+
implementation_1.default.postMessageToMaster(errorMessage, transferables);
|
|
47
56
|
}
|
|
48
57
|
function postJobResultMessage(uid, completed, resultValue) {
|
|
49
58
|
const { payload, transferables } = deconstructTransfer(resultValue);
|
|
50
59
|
const resultMessage = {
|
|
51
60
|
complete: completed ? true : undefined,
|
|
52
61
|
payload,
|
|
53
|
-
type: WorkerMessageType.result,
|
|
62
|
+
type: messages_1.WorkerMessageType.result,
|
|
54
63
|
uid,
|
|
55
64
|
};
|
|
56
|
-
|
|
65
|
+
implementation_1.default.postMessageToMaster(resultMessage, transferables);
|
|
57
66
|
}
|
|
58
67
|
function postJobStartMessage(uid, resultType) {
|
|
59
68
|
const startMessage = {
|
|
60
69
|
resultType,
|
|
61
|
-
type: WorkerMessageType.running,
|
|
70
|
+
type: messages_1.WorkerMessageType.running,
|
|
62
71
|
uid,
|
|
63
72
|
};
|
|
64
|
-
|
|
73
|
+
implementation_1.default.postMessageToMaster(startMessage);
|
|
65
74
|
}
|
|
66
75
|
function postUncaughtErrorMessage(error) {
|
|
67
76
|
try {
|
|
68
77
|
const errorMessage = {
|
|
69
|
-
error: serialize(error),
|
|
70
|
-
type: WorkerMessageType.uncaughtError,
|
|
78
|
+
error: (0, common_1.serialize)(error),
|
|
79
|
+
type: messages_1.WorkerMessageType.uncaughtError,
|
|
71
80
|
};
|
|
72
|
-
|
|
81
|
+
implementation_1.default.postMessageToMaster(errorMessage);
|
|
73
82
|
}
|
|
74
83
|
catch (subError) {
|
|
75
84
|
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);
|
|
@@ -86,8 +95,8 @@ async function runFunction(jobUID, fn, args) {
|
|
|
86
95
|
const resultType = isObservable(syncResult) ? 'observable' : 'promise';
|
|
87
96
|
postJobStartMessage(jobUID, resultType);
|
|
88
97
|
if (isObservable(syncResult)) {
|
|
89
|
-
const subscription = syncResult.subscribe((value) => postJobResultMessage(jobUID, false, serialize(value)), (error) => {
|
|
90
|
-
postJobErrorMessage(jobUID, serialize(error));
|
|
98
|
+
const subscription = syncResult.subscribe((value) => postJobResultMessage(jobUID, false, (0, common_1.serialize)(value)), (error) => {
|
|
99
|
+
postJobErrorMessage(jobUID, (0, common_1.serialize)(error));
|
|
91
100
|
activeSubscriptions.delete(jobUID);
|
|
92
101
|
}, () => {
|
|
93
102
|
postJobResultMessage(jobUID, true);
|
|
@@ -98,15 +107,15 @@ async function runFunction(jobUID, fn, args) {
|
|
|
98
107
|
else {
|
|
99
108
|
try {
|
|
100
109
|
const result = await syncResult;
|
|
101
|
-
postJobResultMessage(jobUID, true, serialize(result));
|
|
110
|
+
postJobResultMessage(jobUID, true, (0, common_1.serialize)(result));
|
|
102
111
|
}
|
|
103
112
|
catch (error) {
|
|
104
|
-
postJobErrorMessage(jobUID, serialize(error));
|
|
113
|
+
postJobErrorMessage(jobUID, (0, common_1.serialize)(error));
|
|
105
114
|
}
|
|
106
115
|
}
|
|
107
116
|
}
|
|
108
|
-
|
|
109
|
-
if (!
|
|
117
|
+
function expose(exposed) {
|
|
118
|
+
if (!implementation_1.default.isWorkerRuntime()) {
|
|
110
119
|
throw new Error('expose() called in the master thread.');
|
|
111
120
|
}
|
|
112
121
|
if (exposeCalled) {
|
|
@@ -114,17 +123,17 @@ export function expose(exposed) {
|
|
|
114
123
|
}
|
|
115
124
|
exposeCalled = true;
|
|
116
125
|
if (typeof exposed === 'function') {
|
|
117
|
-
|
|
126
|
+
implementation_1.default.subscribeToMasterMessages((messageData) => {
|
|
118
127
|
if (isMasterJobRunMessage(messageData) && !messageData.method) {
|
|
119
|
-
runFunction(messageData.uid, exposed, messageData.args.map(deserialize));
|
|
128
|
+
runFunction(messageData.uid, exposed, messageData.args.map(common_1.deserialize));
|
|
120
129
|
}
|
|
121
130
|
});
|
|
122
131
|
postFunctionInitMessage();
|
|
123
132
|
}
|
|
124
133
|
else if (typeof exposed === 'object' && exposed) {
|
|
125
|
-
|
|
134
|
+
implementation_1.default.subscribeToMasterMessages((messageData) => {
|
|
126
135
|
if (isMasterJobRunMessage(messageData) && messageData.method) {
|
|
127
|
-
runFunction(messageData.uid, exposed[messageData.method], messageData.args.map(deserialize));
|
|
136
|
+
runFunction(messageData.uid, exposed[messageData.method], messageData.args.map(common_1.deserialize));
|
|
128
137
|
}
|
|
129
138
|
});
|
|
130
139
|
const methodNames = Object.keys(exposed).filter((key) => typeof exposed[key] === 'function');
|
|
@@ -133,7 +142,7 @@ export function expose(exposed) {
|
|
|
133
142
|
else {
|
|
134
143
|
throw new Error(`Invalid argument passed to expose(). Expected a function or an object, got: ${exposed}`);
|
|
135
144
|
}
|
|
136
|
-
|
|
145
|
+
implementation_1.default.subscribeToMasterMessages((messageData) => {
|
|
137
146
|
if (isMasterJobCancelMessage(messageData)) {
|
|
138
147
|
const jobUID = messageData.uid;
|
|
139
148
|
const subscription = activeSubscriptions.get(jobUID);
|
|
@@ -144,7 +153,7 @@ export function expose(exposed) {
|
|
|
144
153
|
}
|
|
145
154
|
});
|
|
146
155
|
}
|
|
147
|
-
if (typeof self !== 'undefined' && typeof self.addEventListener === 'function' &&
|
|
156
|
+
if (typeof self !== 'undefined' && typeof self.addEventListener === 'function' && implementation_1.default.isWorkerRuntime()) {
|
|
148
157
|
self.addEventListener('error', (event) => {
|
|
149
158
|
setTimeout(() => postUncaughtErrorMessage(event.error || event), 250);
|
|
150
159
|
});
|
|
@@ -155,7 +164,7 @@ if (typeof self !== 'undefined' && typeof self.addEventListener === 'function' &
|
|
|
155
164
|
}
|
|
156
165
|
});
|
|
157
166
|
}
|
|
158
|
-
if (typeof process !== 'undefined' && typeof process.on === 'function' &&
|
|
167
|
+
if (typeof process !== 'undefined' && typeof process.on === 'function' && implementation_1.default.isWorkerRuntime()) {
|
|
159
168
|
process.on('uncaughtException', (error) => {
|
|
160
169
|
setTimeout(() => postUncaughtErrorMessage(error), 250);
|
|
161
170
|
});
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = getImplementation;
|
|
1
4
|
let implementation;
|
|
2
5
|
function selectImplementation() {
|
|
3
6
|
return typeof __non_webpack_require__ === 'function' ? __non_webpack_require__('worker_threads') : eval('require')('worker_threads');
|
|
4
7
|
}
|
|
5
|
-
|
|
8
|
+
function getImplementation() {
|
|
6
9
|
if (!implementation) {
|
|
7
10
|
implementation = selectImplementation();
|
|
8
11
|
}
|