@xylabs/threads 3.5.4 → 3.5.6
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 +1 -1
package/dist/esm/common.js
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerSerializer = registerSerializer;
|
|
4
|
+
exports.deserialize = deserialize;
|
|
5
|
+
exports.serialize = serialize;
|
|
6
|
+
const serializers_1 = require("./serializers");
|
|
7
|
+
let registeredSerializer = serializers_1.DefaultSerializer;
|
|
8
|
+
function registerSerializer(serializer) {
|
|
9
|
+
registeredSerializer = (0, serializers_1.extendSerializer)(registeredSerializer, serializer);
|
|
5
10
|
}
|
|
6
|
-
|
|
11
|
+
function deserialize(message) {
|
|
7
12
|
return registeredSerializer.deserialize(message);
|
|
8
13
|
}
|
|
9
|
-
|
|
14
|
+
function serialize(input) {
|
|
10
15
|
return registeredSerializer.serialize(input);
|
|
11
16
|
}
|
package/dist/esm/index.js
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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; } });
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getBaseURL = getBaseURL;
|
|
4
|
+
exports.getBundleURL = getBundleURLCached;
|
|
1
5
|
let bundleURL;
|
|
2
6
|
function getBundleURLCached() {
|
|
3
7
|
if (!bundleURL) {
|
|
@@ -20,4 +24,3 @@ function getBundleURL() {
|
|
|
20
24
|
function getBaseURL(url) {
|
|
21
25
|
return ('' + url).replace(/^((?:https?|file|ftp|chrome-extension|moz-extension):\/\/.+)?\/[^/]+(?:\?.*)?$/, '$1') + '/';
|
|
22
26
|
}
|
|
23
|
-
export { getBaseURL, getBundleURLCached as getBundleURL };
|
|
@@ -1,5 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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;
|
|
3
8
|
const isAbsoluteURL = (value) => /^[A-Za-z][\d+.A-Za-z\-]*:/.test(value);
|
|
4
9
|
function createSourceBlobURL(code) {
|
|
5
10
|
const blob = new Blob([code], { type: 'application/javascript' });
|
|
@@ -18,8 +23,8 @@ function selectWorkerImplementation() {
|
|
|
18
23
|
if (typeof url === 'string' && options && options._baseURL) {
|
|
19
24
|
url = new URL(url, options._baseURL);
|
|
20
25
|
}
|
|
21
|
-
else if (typeof url === 'string' && !isAbsoluteURL(url) && /^file:\/\//i.test(getBundleURL())) {
|
|
22
|
-
url = new URL(url, getBundleURL().replace(/\/[^/]+$/, '/'));
|
|
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(/\/[^/]+$/, '/'));
|
|
23
28
|
if (options?.CORSWorkaround ?? true) {
|
|
24
29
|
url = createSourceBlobURL(`importScripts(${JSON.stringify(url)});`);
|
|
25
30
|
}
|
|
@@ -48,13 +53,13 @@ function selectWorkerImplementation() {
|
|
|
48
53
|
};
|
|
49
54
|
}
|
|
50
55
|
let implementation;
|
|
51
|
-
|
|
56
|
+
function getWorkerImplementation() {
|
|
52
57
|
if (!implementation) {
|
|
53
58
|
implementation = selectWorkerImplementation();
|
|
54
59
|
}
|
|
55
60
|
return implementation;
|
|
56
61
|
}
|
|
57
|
-
|
|
62
|
+
function isWorkerRuntime() {
|
|
58
63
|
const isWindowContext = typeof self !== 'undefined' && typeof Window !== 'undefined' && self instanceof Window;
|
|
59
64
|
return typeof self !== 'undefined' && self['postMessage'] && !isWindowContext ? true : false;
|
|
60
65
|
}
|
|
@@ -1,7 +1,33 @@
|
|
|
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 __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 (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.isWorkerRuntime = exports.getWorkerImplementation = exports.defaultPoolSize = void 0;
|
|
27
|
+
const BrowserImplementation = __importStar(require("./implementation.browser"));
|
|
28
|
+
const NodeImplementation = __importStar(require("./implementation.node"));
|
|
3
29
|
const runningInNode = typeof process !== 'undefined' && process.arch !== 'browser' && 'pid' in process;
|
|
4
30
|
const implementation = runningInNode ? NodeImplementation : BrowserImplementation;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
31
|
+
exports.defaultPoolSize = implementation.defaultPoolSize;
|
|
32
|
+
exports.getWorkerImplementation = implementation.getWorkerImplementation;
|
|
33
|
+
exports.isWorkerRuntime = implementation.isWorkerRuntime;
|
|
@@ -1,10 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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.defaultPoolSize = void 0;
|
|
7
|
+
exports.getWorkerImplementation = getWorkerImplementation;
|
|
8
|
+
exports.isWorkerRuntime = isWorkerRuntime;
|
|
9
|
+
const node_events_1 = require("node:events");
|
|
10
|
+
const node_os_1 = require("node:os");
|
|
11
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
12
|
+
const node_url_1 = require("node:url");
|
|
13
|
+
const callsites_3_1_0_1 = __importDefault(require("callsites-3-1-0"));
|
|
6
14
|
let tsNodeAvailable;
|
|
7
|
-
|
|
15
|
+
exports.defaultPoolSize = (0, node_os_1.cpus)().length;
|
|
8
16
|
function detectTsNode() {
|
|
9
17
|
if (typeof __non_webpack_require__ === 'function') {
|
|
10
18
|
return false;
|
|
@@ -34,21 +42,21 @@ function createTsNodeModule(scriptPath) {
|
|
|
34
42
|
return content;
|
|
35
43
|
}
|
|
36
44
|
function rebaseScriptPath(scriptPath, ignoreRegex) {
|
|
37
|
-
const parentCallSite =
|
|
45
|
+
const parentCallSite = (0, callsites_3_1_0_1.default)().find((callsite) => {
|
|
38
46
|
const filename = callsite.getFileName();
|
|
39
47
|
return Boolean(filename && !filename.match(ignoreRegex) && !/[/\\]master[/\\]implementation/.test(filename) && !/^internal\/process/.test(filename));
|
|
40
48
|
});
|
|
41
49
|
const rawCallerPath = parentCallSite ? parentCallSite.getFileName() : null;
|
|
42
50
|
let callerPath = rawCallerPath ? rawCallerPath : null;
|
|
43
51
|
if (callerPath && callerPath.startsWith('file:')) {
|
|
44
|
-
callerPath = fileURLToPath(callerPath);
|
|
52
|
+
callerPath = (0, node_url_1.fileURLToPath)(callerPath);
|
|
45
53
|
}
|
|
46
|
-
const rebasedScriptPath = callerPath ?
|
|
54
|
+
const rebasedScriptPath = callerPath ? node_path_1.default.join(node_path_1.default.dirname(callerPath), scriptPath) : scriptPath;
|
|
47
55
|
return rebasedScriptPath;
|
|
48
56
|
}
|
|
49
57
|
function resolveScriptPath(scriptPath, baseURL) {
|
|
50
58
|
const makeRelative = (filePath) => {
|
|
51
|
-
return
|
|
59
|
+
return node_path_1.default.isAbsolute(filePath) ? filePath : node_path_1.default.join(baseURL || eval('__dirname'), filePath);
|
|
52
60
|
};
|
|
53
61
|
const workerFilePath = typeof __non_webpack_require__ === 'function' ?
|
|
54
62
|
__non_webpack_require__.resolve(makeRelative(scriptPath))
|
|
@@ -132,7 +140,7 @@ function initTinyWorker() {
|
|
|
132
140
|
super(resolvedScriptPath, [], { esm: true });
|
|
133
141
|
}
|
|
134
142
|
allWorkers.push(this);
|
|
135
|
-
this.emitter = new EventEmitter();
|
|
143
|
+
this.emitter = new node_events_1.EventEmitter();
|
|
136
144
|
this.onerror = (error) => this.emitter.emit('error', error);
|
|
137
145
|
this.onmessage = (message) => this.emitter.emit('message', message);
|
|
138
146
|
}
|
|
@@ -179,13 +187,13 @@ function selectWorkerImplementation() {
|
|
|
179
187
|
return initTinyWorker();
|
|
180
188
|
}
|
|
181
189
|
}
|
|
182
|
-
|
|
190
|
+
function getWorkerImplementation() {
|
|
183
191
|
if (!implementation) {
|
|
184
192
|
implementation = selectWorkerImplementation();
|
|
185
193
|
}
|
|
186
194
|
return implementation;
|
|
187
195
|
}
|
|
188
|
-
|
|
196
|
+
function isWorkerRuntime() {
|
|
189
197
|
if (isTinyWorker) {
|
|
190
198
|
return self !== undefined && self['postMessage'] ? true : false;
|
|
191
199
|
}
|
package/dist/esm/master/index.js
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isWorkerRuntime = exports.Worker = exports.BlobWorker = exports.Thread = exports.spawn = exports.Pool = void 0;
|
|
4
|
+
const implementation_1 = require("./implementation");
|
|
5
|
+
var pool_1 = require("./pool");
|
|
6
|
+
Object.defineProperty(exports, "Pool", { enumerable: true, get: function () { return pool_1.Pool; } });
|
|
7
|
+
var spawn_1 = require("./spawn");
|
|
8
|
+
Object.defineProperty(exports, "spawn", { enumerable: true, get: function () { return spawn_1.spawn; } });
|
|
9
|
+
var thread_1 = require("./thread");
|
|
10
|
+
Object.defineProperty(exports, "Thread", { enumerable: true, get: function () { return thread_1.Thread; } });
|
|
11
|
+
exports.BlobWorker = (0, implementation_1.getWorkerImplementation)().blob;
|
|
12
|
+
exports.Worker = (0, implementation_1.getWorkerImplementation)().default;
|
|
13
|
+
var implementation_2 = require("./implementation");
|
|
14
|
+
Object.defineProperty(exports, "isWorkerRuntime", { enumerable: true, get: function () { return implementation_2.isWorkerRuntime; } });
|
|
@@ -1,17 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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.createProxyFunction = createProxyFunction;
|
|
7
|
+
exports.createProxyModule = createProxyModule;
|
|
8
|
+
const debug_1 = __importDefault(require("debug"));
|
|
9
|
+
const observable_fns_1 = require("observable-fns");
|
|
10
|
+
const common_1 = require("../common");
|
|
11
|
+
const observable_promise_1 = require("../observable-promise");
|
|
12
|
+
const transferable_1 = require("../transferable");
|
|
13
|
+
const messages_1 = require("../types/messages");
|
|
14
|
+
const debugMessages = (0, debug_1.default)('threads:master:messages');
|
|
8
15
|
let nextJobUID = 1;
|
|
9
16
|
const dedupe = (array) => [...new Set(array)];
|
|
10
|
-
const isJobErrorMessage = (data) => data && data.type === WorkerMessageType.error;
|
|
11
|
-
const isJobResultMessage = (data) => data && data.type === WorkerMessageType.result;
|
|
12
|
-
const isJobStartMessage = (data) => data && data.type === WorkerMessageType.running;
|
|
17
|
+
const isJobErrorMessage = (data) => data && data.type === messages_1.WorkerMessageType.error;
|
|
18
|
+
const isJobResultMessage = (data) => data && data.type === messages_1.WorkerMessageType.result;
|
|
19
|
+
const isJobStartMessage = (data) => data && data.type === messages_1.WorkerMessageType.running;
|
|
13
20
|
function createObservableForJob(worker, jobUID) {
|
|
14
|
-
return new Observable((observer) => {
|
|
21
|
+
return new observable_fns_1.Observable((observer) => {
|
|
15
22
|
let asyncType;
|
|
16
23
|
const messageHandler = ((event) => {
|
|
17
24
|
debugMessages('Message from worker:', event.data);
|
|
@@ -23,14 +30,14 @@ function createObservableForJob(worker, jobUID) {
|
|
|
23
30
|
else if (isJobResultMessage(event.data)) {
|
|
24
31
|
if (asyncType === 'promise') {
|
|
25
32
|
if (event.data.payload !== undefined) {
|
|
26
|
-
observer.next(deserialize(event.data.payload));
|
|
33
|
+
observer.next((0, common_1.deserialize)(event.data.payload));
|
|
27
34
|
}
|
|
28
35
|
observer.complete();
|
|
29
36
|
worker.removeEventListener('message', messageHandler);
|
|
30
37
|
}
|
|
31
38
|
else {
|
|
32
39
|
if (event.data.payload) {
|
|
33
|
-
observer.next(deserialize(event.data.payload));
|
|
40
|
+
observer.next((0, common_1.deserialize)(event.data.payload));
|
|
34
41
|
}
|
|
35
42
|
if (event.data.complete) {
|
|
36
43
|
observer.complete();
|
|
@@ -39,7 +46,7 @@ function createObservableForJob(worker, jobUID) {
|
|
|
39
46
|
}
|
|
40
47
|
}
|
|
41
48
|
else if (isJobErrorMessage(event.data)) {
|
|
42
|
-
const error = deserialize(event.data.error);
|
|
49
|
+
const error = (0, common_1.deserialize)(event.data.error);
|
|
43
50
|
if (asyncType === 'promise' || !asyncType) {
|
|
44
51
|
observer.error(error);
|
|
45
52
|
}
|
|
@@ -53,7 +60,7 @@ function createObservableForJob(worker, jobUID) {
|
|
|
53
60
|
return () => {
|
|
54
61
|
if (asyncType === 'observable' || !asyncType) {
|
|
55
62
|
const cancelMessage = {
|
|
56
|
-
type: MasterMessageType.cancel,
|
|
63
|
+
type: messages_1.MasterMessageType.cancel,
|
|
57
64
|
uid: jobUID,
|
|
58
65
|
};
|
|
59
66
|
worker.postMessage(cancelMessage);
|
|
@@ -72,12 +79,12 @@ function prepareArguments(rawArgs) {
|
|
|
72
79
|
const args = [];
|
|
73
80
|
const transferables = [];
|
|
74
81
|
for (const arg of rawArgs) {
|
|
75
|
-
if (isTransferDescriptor(arg)) {
|
|
76
|
-
args.push(serialize(arg.send));
|
|
82
|
+
if ((0, transferable_1.isTransferDescriptor)(arg)) {
|
|
83
|
+
args.push((0, common_1.serialize)(arg.send));
|
|
77
84
|
transferables.push(...arg.transferables);
|
|
78
85
|
}
|
|
79
86
|
else {
|
|
80
|
-
args.push(serialize(arg));
|
|
87
|
+
args.push((0, common_1.serialize)(arg));
|
|
81
88
|
}
|
|
82
89
|
}
|
|
83
90
|
return {
|
|
@@ -85,14 +92,14 @@ function prepareArguments(rawArgs) {
|
|
|
85
92
|
transferables: transferables.length === 0 ? transferables : dedupe(transferables),
|
|
86
93
|
};
|
|
87
94
|
}
|
|
88
|
-
|
|
95
|
+
function createProxyFunction(worker, method) {
|
|
89
96
|
return ((...rawArgs) => {
|
|
90
97
|
const uid = nextJobUID++;
|
|
91
98
|
const { args, transferables } = prepareArguments(rawArgs);
|
|
92
99
|
const runMessage = {
|
|
93
100
|
args,
|
|
94
101
|
method,
|
|
95
|
-
type: MasterMessageType.run,
|
|
102
|
+
type: messages_1.MasterMessageType.run,
|
|
96
103
|
uid,
|
|
97
104
|
};
|
|
98
105
|
debugMessages('Sending command to run function to worker:', runMessage);
|
|
@@ -100,12 +107,12 @@ export function createProxyFunction(worker, method) {
|
|
|
100
107
|
worker.postMessage(runMessage, transferables);
|
|
101
108
|
}
|
|
102
109
|
catch (error) {
|
|
103
|
-
return ObservablePromise.from(Promise.reject(error));
|
|
110
|
+
return observable_promise_1.ObservablePromise.from(Promise.reject(error));
|
|
104
111
|
}
|
|
105
|
-
return ObservablePromise.from(multicast(createObservableForJob(worker, uid)));
|
|
112
|
+
return observable_promise_1.ObservablePromise.from((0, observable_fns_1.multicast)(createObservableForJob(worker, uid)));
|
|
106
113
|
});
|
|
107
114
|
}
|
|
108
|
-
|
|
115
|
+
function createProxyModule(worker, methodNames) {
|
|
109
116
|
const proxy = {};
|
|
110
117
|
for (const methodName of methodNames) {
|
|
111
118
|
proxy[methodName] = createProxyFunction(worker, methodName);
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PoolEventType = void 0;
|
|
4
|
+
var PoolEventType;
|
|
2
5
|
(function (PoolEventType) {
|
|
3
6
|
PoolEventType["initialized"] = "initialized";
|
|
4
7
|
PoolEventType["taskCanceled"] = "taskCanceled";
|
|
@@ -8,4 +11,4 @@ export var PoolEventType;
|
|
|
8
11
|
PoolEventType["taskQueueDrained"] = "taskQueueDrained";
|
|
9
12
|
PoolEventType["taskStart"] = "taskStart";
|
|
10
13
|
PoolEventType["terminated"] = "terminated";
|
|
11
|
-
})(PoolEventType || (PoolEventType = {}));
|
|
14
|
+
})(PoolEventType || (exports.PoolEventType = PoolEventType = {}));
|
package/dist/esm/master/pool.js
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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.Thread = exports.PoolEventType = exports.Pool = void 0;
|
|
7
|
+
const debug_1 = __importDefault(require("debug"));
|
|
8
|
+
const observable_fns_1 = require("observable-fns");
|
|
9
|
+
const ponyfills_1 = require("../ponyfills");
|
|
10
|
+
const implementation_1 = require("./implementation");
|
|
11
|
+
const pool_types_1 = require("./pool-types");
|
|
12
|
+
const thread_1 = require("./thread");
|
|
7
13
|
let nextPoolID = 1;
|
|
8
14
|
function createArray(size) {
|
|
9
15
|
const array = [];
|
|
@@ -28,26 +34,26 @@ function spawnWorkers(spawnWorker, count) {
|
|
|
28
34
|
}));
|
|
29
35
|
}
|
|
30
36
|
class WorkerPool {
|
|
31
|
-
static EventType = PoolEventType;
|
|
37
|
+
static EventType = pool_types_1.PoolEventType;
|
|
32
38
|
debug;
|
|
33
39
|
eventObservable;
|
|
34
40
|
options;
|
|
35
41
|
workers;
|
|
36
|
-
eventSubject = new Subject();
|
|
42
|
+
eventSubject = new observable_fns_1.Subject();
|
|
37
43
|
initErrors = [];
|
|
38
44
|
isClosing = false;
|
|
39
45
|
nextTaskID = 1;
|
|
40
46
|
taskQueue = [];
|
|
41
47
|
constructor(spawnWorker, optionsOrSize) {
|
|
42
48
|
const options = typeof optionsOrSize === 'number' ? { size: optionsOrSize } : optionsOrSize || {};
|
|
43
|
-
const { size = defaultPoolSize } = options;
|
|
44
|
-
this.debug =
|
|
49
|
+
const { size = implementation_1.defaultPoolSize } = options;
|
|
50
|
+
this.debug = (0, debug_1.default)(`threads:pool:${slugify(options.name || String(nextPoolID++))}`);
|
|
45
51
|
this.options = options;
|
|
46
52
|
this.workers = spawnWorkers(spawnWorker, size);
|
|
47
|
-
this.eventObservable = multicast(Observable.from(this.eventSubject));
|
|
53
|
+
this.eventObservable = (0, observable_fns_1.multicast)(observable_fns_1.Observable.from(this.eventSubject));
|
|
48
54
|
Promise.all(this.workers.map((worker) => worker.init)).then(() => this.eventSubject.next({
|
|
49
55
|
size: this.workers.length,
|
|
50
|
-
type: PoolEventType.initialized,
|
|
56
|
+
type: pool_types_1.PoolEventType.initialized,
|
|
51
57
|
}), (error) => {
|
|
52
58
|
this.debug('Error while initializing pool worker:', error);
|
|
53
59
|
this.eventSubject.error(error);
|
|
@@ -63,7 +69,7 @@ class WorkerPool {
|
|
|
63
69
|
this.debug(`Running task #${task.id} on worker #${workerID}...`);
|
|
64
70
|
this.eventSubject.next({
|
|
65
71
|
taskID: task.id,
|
|
66
|
-
type: PoolEventType.taskStart,
|
|
72
|
+
type: pool_types_1.PoolEventType.taskStart,
|
|
67
73
|
workerID,
|
|
68
74
|
});
|
|
69
75
|
try {
|
|
@@ -72,7 +78,7 @@ class WorkerPool {
|
|
|
72
78
|
this.eventSubject.next({
|
|
73
79
|
returnValue,
|
|
74
80
|
taskID: task.id,
|
|
75
|
-
type: PoolEventType.taskCompleted,
|
|
81
|
+
type: pool_types_1.PoolEventType.taskCompleted,
|
|
76
82
|
workerID,
|
|
77
83
|
});
|
|
78
84
|
}
|
|
@@ -81,7 +87,7 @@ class WorkerPool {
|
|
|
81
87
|
this.eventSubject.next({
|
|
82
88
|
error,
|
|
83
89
|
taskID: task.id,
|
|
84
|
-
type: PoolEventType.taskFailed,
|
|
90
|
+
type: pool_types_1.PoolEventType.taskFailed,
|
|
85
91
|
workerID,
|
|
86
92
|
});
|
|
87
93
|
}
|
|
@@ -112,7 +118,7 @@ class WorkerPool {
|
|
|
112
118
|
const nextTask = this.taskQueue.shift();
|
|
113
119
|
if (!nextTask) {
|
|
114
120
|
this.debug('Task queue is empty');
|
|
115
|
-
this.eventSubject.next({ type: PoolEventType.taskQueueDrained });
|
|
121
|
+
this.eventSubject.next({ type: pool_types_1.PoolEventType.taskQueueDrained });
|
|
116
122
|
return;
|
|
117
123
|
}
|
|
118
124
|
this.run(availableWorker, nextTask);
|
|
@@ -120,15 +126,15 @@ class WorkerPool {
|
|
|
120
126
|
taskCompletion(taskID) {
|
|
121
127
|
return new Promise((resolve, reject) => {
|
|
122
128
|
const eventSubscription = this.events().subscribe((event) => {
|
|
123
|
-
if (event.type === PoolEventType.taskCompleted && event.taskID === taskID) {
|
|
129
|
+
if (event.type === pool_types_1.PoolEventType.taskCompleted && event.taskID === taskID) {
|
|
124
130
|
eventSubscription.unsubscribe();
|
|
125
131
|
resolve(event.returnValue);
|
|
126
132
|
}
|
|
127
|
-
else if (event.type === PoolEventType.taskFailed && event.taskID === taskID) {
|
|
133
|
+
else if (event.type === pool_types_1.PoolEventType.taskFailed && event.taskID === taskID) {
|
|
128
134
|
eventSubscription.unsubscribe();
|
|
129
135
|
reject(event.error);
|
|
130
136
|
}
|
|
131
|
-
else if (event.type === PoolEventType.terminated) {
|
|
137
|
+
else if (event.type === pool_types_1.PoolEventType.terminated) {
|
|
132
138
|
eventSubscription.unsubscribe();
|
|
133
139
|
reject(new Error('Pool has been terminated before task was run.'));
|
|
134
140
|
}
|
|
@@ -139,7 +145,7 @@ class WorkerPool {
|
|
|
139
145
|
const getCurrentlyRunningTasks = () => flatMap(this.workers, (worker) => worker.runningTasks);
|
|
140
146
|
const taskFailures = [];
|
|
141
147
|
const failureSubscription = this.eventObservable.subscribe((event) => {
|
|
142
|
-
if (event.type === PoolEventType.taskFailed) {
|
|
148
|
+
if (event.type === pool_types_1.PoolEventType.taskFailed) {
|
|
143
149
|
taskFailures.push(event.error);
|
|
144
150
|
}
|
|
145
151
|
});
|
|
@@ -147,21 +153,21 @@ class WorkerPool {
|
|
|
147
153
|
throw this.initErrors[0];
|
|
148
154
|
}
|
|
149
155
|
if (allowResolvingImmediately && this.taskQueue.length === 0) {
|
|
150
|
-
await allSettled(getCurrentlyRunningTasks());
|
|
156
|
+
await (0, ponyfills_1.allSettled)(getCurrentlyRunningTasks());
|
|
151
157
|
return taskFailures;
|
|
152
158
|
}
|
|
153
159
|
await new Promise((resolve, reject) => {
|
|
154
160
|
const subscription = this.eventObservable.subscribe({
|
|
155
161
|
error: reject,
|
|
156
162
|
next(event) {
|
|
157
|
-
if (event.type === PoolEventType.taskQueueDrained) {
|
|
163
|
+
if (event.type === pool_types_1.PoolEventType.taskQueueDrained) {
|
|
158
164
|
subscription.unsubscribe();
|
|
159
165
|
resolve(void 0);
|
|
160
166
|
}
|
|
161
167
|
},
|
|
162
168
|
});
|
|
163
169
|
});
|
|
164
|
-
await allSettled(getCurrentlyRunningTasks());
|
|
170
|
+
await (0, ponyfills_1.allSettled)(getCurrentlyRunningTasks());
|
|
165
171
|
failureSubscription.unsubscribe();
|
|
166
172
|
return taskFailures;
|
|
167
173
|
}
|
|
@@ -171,11 +177,11 @@ class WorkerPool {
|
|
|
171
177
|
const subscription = this.eventObservable.subscribe({
|
|
172
178
|
error: reject,
|
|
173
179
|
next(event) {
|
|
174
|
-
if (event.type === PoolEventType.taskQueueDrained) {
|
|
180
|
+
if (event.type === pool_types_1.PoolEventType.taskQueueDrained) {
|
|
175
181
|
subscription.unsubscribe();
|
|
176
182
|
resolve(settlementPromise);
|
|
177
183
|
}
|
|
178
|
-
else if (event.type === PoolEventType.taskFailed) {
|
|
184
|
+
else if (event.type === pool_types_1.PoolEventType.taskFailed) {
|
|
179
185
|
subscription.unsubscribe();
|
|
180
186
|
reject(event.error);
|
|
181
187
|
}
|
|
@@ -210,7 +216,7 @@ class WorkerPool {
|
|
|
210
216
|
this.taskQueue = this.taskQueue.filter((someTask) => someTask !== task);
|
|
211
217
|
this.eventSubject.next({
|
|
212
218
|
taskID: task.id,
|
|
213
|
-
type: PoolEventType.taskCanceled,
|
|
219
|
+
type: pool_types_1.PoolEventType.taskCanceled,
|
|
214
220
|
});
|
|
215
221
|
},
|
|
216
222
|
id: taskID,
|
|
@@ -226,7 +232,7 @@ class WorkerPool {
|
|
|
226
232
|
this.taskQueue.push(task);
|
|
227
233
|
this.eventSubject.next({
|
|
228
234
|
taskID: task.id,
|
|
229
|
-
type: PoolEventType.taskQueued,
|
|
235
|
+
type: pool_types_1.PoolEventType.taskQueued,
|
|
230
236
|
});
|
|
231
237
|
this.scheduleWork();
|
|
232
238
|
return task;
|
|
@@ -238,17 +244,19 @@ class WorkerPool {
|
|
|
238
244
|
}
|
|
239
245
|
this.eventSubject.next({
|
|
240
246
|
remainingQueue: [...this.taskQueue],
|
|
241
|
-
type: PoolEventType.terminated,
|
|
247
|
+
type: pool_types_1.PoolEventType.terminated,
|
|
242
248
|
});
|
|
243
249
|
this.eventSubject.complete();
|
|
244
|
-
await Promise.all(this.workers.map(async (worker) => Thread.terminate(await worker.init)));
|
|
250
|
+
await Promise.all(this.workers.map(async (worker) => thread_1.Thread.terminate(await worker.init)));
|
|
245
251
|
}
|
|
246
252
|
}
|
|
247
253
|
function PoolConstructor(spawnWorker, optionsOrSize) {
|
|
248
254
|
return new WorkerPool(spawnWorker, optionsOrSize);
|
|
249
255
|
}
|
|
250
256
|
;
|
|
251
|
-
PoolConstructor.EventType = PoolEventType;
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
257
|
+
PoolConstructor.EventType = pool_types_1.PoolEventType;
|
|
258
|
+
exports.Pool = PoolConstructor;
|
|
259
|
+
var pool_types_2 = require("./pool-types");
|
|
260
|
+
Object.defineProperty(exports, "PoolEventType", { enumerable: true, get: function () { return pool_types_2.PoolEventType; } });
|
|
261
|
+
var thread_2 = require("./thread");
|
|
262
|
+
Object.defineProperty(exports, "Thread", { enumerable: true, get: function () { return thread_2.Thread; } });
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const index_1 = require("./index");
|
|
2
4
|
if (typeof global !== 'undefined') {
|
|
3
5
|
;
|
|
4
|
-
global.Worker =
|
|
6
|
+
global.Worker = index_1.Worker;
|
|
5
7
|
}
|
|
6
8
|
else if (window !== undefined) {
|
|
7
9
|
;
|
|
8
|
-
window.Worker =
|
|
10
|
+
window.Worker = index_1.Worker;
|
|
9
11
|
}
|