@xylabs/threads 3.0.4
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/CHANGELOG.md +11 -0
- package/LICENSE +21 -0
- package/README.md +227 -0
- package/dist/common.d.ts +4 -0
- package/dist/common.js +18 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +27 -0
- package/dist/master/get-bundle-url.browser.d.ts +3 -0
- package/dist/master/get-bundle-url.browser.js +29 -0
- package/dist/master/implementation.browser.d.ts +4 -0
- package/dist/master/implementation.browser.js +69 -0
- package/dist/master/implementation.d.ts +6 -0
- package/dist/master/implementation.js +41 -0
- package/dist/master/implementation.node.d.ts +5 -0
- package/dist/master/implementation.node.js +255 -0
- package/dist/master/index.d.ts +13 -0
- package/dist/master/index.js +16 -0
- package/dist/master/invocation-proxy.d.ts +3 -0
- package/dist/master/invocation-proxy.js +130 -0
- package/dist/master/pool-types.d.ts +65 -0
- package/dist/master/pool-types.js +15 -0
- package/dist/master/pool.d.ts +90 -0
- package/dist/master/pool.js +281 -0
- package/dist/master/register.d.ts +1 -0
- package/dist/master/register.js +12 -0
- package/dist/master/spawn.d.ts +20 -0
- package/dist/master/spawn.js +130 -0
- package/dist/master/thread.d.ts +12 -0
- package/dist/master/thread.js +22 -0
- package/dist/observable-promise.d.ts +38 -0
- package/dist/observable-promise.js +156 -0
- package/dist/observable.d.ts +19 -0
- package/dist/observable.js +43 -0
- package/dist/ponyfills.d.ts +8 -0
- package/dist/ponyfills.js +22 -0
- package/dist/promise.d.ts +5 -0
- package/dist/promise.js +29 -0
- package/dist/serializers.d.ts +16 -0
- package/dist/serializers.js +41 -0
- package/dist/symbols.d.ts +5 -0
- package/dist/symbols.js +8 -0
- package/dist/transferable.d.ts +42 -0
- package/dist/transferable.js +28 -0
- package/dist/types/master.d.ts +99 -0
- package/dist/types/master.js +14 -0
- package/dist/types/messages.d.ts +62 -0
- package/dist/types/messages.js +20 -0
- package/dist/types/worker.d.ts +11 -0
- package/dist/types/worker.js +2 -0
- package/dist/worker/bundle-entry.d.ts +1 -0
- package/dist/worker/bundle-entry.js +27 -0
- package/dist/worker/implementation.browser.d.ts +7 -0
- package/dist/worker/implementation.browser.js +28 -0
- package/dist/worker/implementation.d.ts +3 -0
- package/dist/worker/implementation.js +24 -0
- package/dist/worker/implementation.tiny-worker.d.ts +7 -0
- package/dist/worker/implementation.tiny-worker.js +38 -0
- package/dist/worker/implementation.worker_threads.d.ts +8 -0
- package/dist/worker/implementation.worker_threads.js +42 -0
- package/dist/worker/index.d.ts +13 -0
- package/dist/worker/index.js +195 -0
- package/dist/worker_threads.d.ts +8 -0
- package/dist/worker_threads.js +17 -0
- package/dist-esm/common.js +12 -0
- package/dist-esm/index.js +6 -0
- package/dist-esm/master/get-bundle-url.browser.js +25 -0
- package/dist-esm/master/implementation.browser.js +64 -0
- package/dist-esm/master/implementation.js +15 -0
- package/dist-esm/master/implementation.node.js +224 -0
- package/dist-esm/master/index.js +9 -0
- package/dist-esm/master/invocation-proxy.js +122 -0
- package/dist-esm/master/pool-types.js +12 -0
- package/dist-esm/master/pool.js +273 -0
- package/dist-esm/master/register.js +10 -0
- package/dist-esm/master/spawn.js +123 -0
- package/dist-esm/master/thread.js +19 -0
- package/dist-esm/observable-promise.js +152 -0
- package/dist-esm/observable.js +38 -0
- package/dist-esm/ponyfills.js +18 -0
- package/dist-esm/promise.js +25 -0
- package/dist-esm/serializers.js +37 -0
- package/dist-esm/symbols.js +5 -0
- package/dist-esm/transferable.js +23 -0
- package/dist-esm/types/master.js +11 -0
- package/dist-esm/types/messages.js +17 -0
- package/dist-esm/types/worker.js +1 -0
- package/dist-esm/worker/bundle-entry.js +11 -0
- package/dist-esm/worker/implementation.browser.js +26 -0
- package/dist-esm/worker/implementation.js +19 -0
- package/dist-esm/worker/implementation.tiny-worker.js +36 -0
- package/dist-esm/worker/implementation.worker_threads.js +37 -0
- package/dist-esm/worker/index.js +186 -0
- package/dist-esm/worker_threads.js +14 -0
- package/index.mjs +11 -0
- package/observable.d.ts +2 -0
- package/observable.js +3 -0
- package/observable.mjs +5 -0
- package/package.json +141 -0
- package/register.d.ts +3 -0
- package/register.js +3 -0
- package/register.mjs +2 -0
- package/rollup.config.js +16 -0
- package/src/common.ts +16 -0
- package/src/index.ts +8 -0
- package/src/master/get-bundle-url.browser.ts +31 -0
- package/src/master/implementation.browser.ts +80 -0
- package/src/master/implementation.node.ts +284 -0
- package/src/master/implementation.ts +21 -0
- package/src/master/index.ts +20 -0
- package/src/master/invocation-proxy.ts +146 -0
- package/src/master/pool-types.ts +83 -0
- package/src/master/pool.ts +391 -0
- package/src/master/register.ts +10 -0
- package/src/master/spawn.ts +172 -0
- package/src/master/thread.ts +26 -0
- package/src/observable-promise.ts +181 -0
- package/src/observable.ts +43 -0
- package/src/ponyfills.ts +31 -0
- package/src/promise.ts +26 -0
- package/src/serializers.ts +67 -0
- package/src/symbols.ts +5 -0
- package/src/transferable.ts +68 -0
- package/src/types/master.ts +130 -0
- package/src/types/messages.ts +81 -0
- package/src/types/worker.ts +14 -0
- package/src/worker/bundle-entry.ts +10 -0
- package/src/worker/implementation.browser.ts +40 -0
- package/src/worker/implementation.tiny-worker.ts +52 -0
- package/src/worker/implementation.ts +23 -0
- package/src/worker/implementation.worker_threads.ts +50 -0
- package/src/worker/index.ts +228 -0
- package/src/worker_threads.ts +28 -0
- package/test/lib/serialization.ts +38 -0
- package/test/observable-promise.test.ts +189 -0
- package/test/observable.test.ts +86 -0
- package/test/pool.test.ts +173 -0
- package/test/serialization.test.ts +21 -0
- package/test/spawn.chromium.mocha.ts +49 -0
- package/test/spawn.test.ts +71 -0
- package/test/streaming.test.ts +27 -0
- package/test/transferables.test.ts +69 -0
- package/test/workers/arraybuffer-xor.ts +11 -0
- package/test/workers/count-to-five.ts +13 -0
- package/test/workers/counter.ts +20 -0
- package/test/workers/faulty-function.ts +6 -0
- package/test/workers/hello-world.ts +6 -0
- package/test/workers/increment.ts +9 -0
- package/test/workers/minmax.ts +25 -0
- package/test/workers/serialization.ts +12 -0
- package/test/workers/top-level-throw.ts +1 -0
- package/test-tooling/rollup/app.js +20 -0
- package/test-tooling/rollup/rollup.config.ts +15 -0
- package/test-tooling/rollup/rollup.test.ts +44 -0
- package/test-tooling/rollup/worker.js +7 -0
- package/test-tooling/tsconfig/minimal-tsconfig.test.ts +7 -0
- package/test-tooling/tsconfig/minimal.ts +10 -0
- package/test-tooling/webpack/addition-worker.ts +10 -0
- package/test-tooling/webpack/app-with-inlined-worker.ts +29 -0
- package/test-tooling/webpack/app.ts +58 -0
- package/test-tooling/webpack/pool-worker.ts +6 -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 +38 -0
- package/test-tooling/webpack/webpack.test.ts +90 -0
- package/test-tooling/webpack/webpack.web.config.js +35 -0
- package/types/is-observable.d.ts +7 -0
- package/types/tiny-worker.d.ts +4 -0
- package/types/webworker.d.ts +9 -0
- package/worker.d.ts +2 -0
- package/worker.js +3 -0
- package/worker.mjs +7 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Observable, ObservableLike } from 'observable-fns';
|
|
2
|
+
declare const $observers: unique symbol;
|
|
3
|
+
/**
|
|
4
|
+
* Observable subject. Implements the Observable interface, but also exposes
|
|
5
|
+
* the `next()`, `error()`, `complete()` methods to initiate observable
|
|
6
|
+
* updates "from the outside".
|
|
7
|
+
*
|
|
8
|
+
* Use `Observable.from(subject)` to derive an observable that proxies all
|
|
9
|
+
* values, errors and the completion raised on this subject, but does not
|
|
10
|
+
* expose the `next()`, `error()`, `complete()` methods.
|
|
11
|
+
*/
|
|
12
|
+
export declare class Subject<T> extends Observable<T> implements ObservableLike<T> {
|
|
13
|
+
private [$observers];
|
|
14
|
+
constructor();
|
|
15
|
+
complete(): void;
|
|
16
|
+
error(error: any): void;
|
|
17
|
+
next(value: T): void;
|
|
18
|
+
}
|
|
19
|
+
export { Observable } from 'observable-fns';
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Observable = exports.Subject = void 0;
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
5
|
+
const observable_fns_1 = require("observable-fns");
|
|
6
|
+
const $observers = Symbol('observers');
|
|
7
|
+
/**
|
|
8
|
+
* Observable subject. Implements the Observable interface, but also exposes
|
|
9
|
+
* the `next()`, `error()`, `complete()` methods to initiate observable
|
|
10
|
+
* updates "from the outside".
|
|
11
|
+
*
|
|
12
|
+
* Use `Observable.from(subject)` to derive an observable that proxies all
|
|
13
|
+
* values, errors and the completion raised on this subject, but does not
|
|
14
|
+
* expose the `next()`, `error()`, `complete()` methods.
|
|
15
|
+
*/
|
|
16
|
+
class Subject extends observable_fns_1.Observable {
|
|
17
|
+
[$observers];
|
|
18
|
+
constructor() {
|
|
19
|
+
super((observer) => {
|
|
20
|
+
this[$observers] = [...(this[$observers] || []), observer];
|
|
21
|
+
const unsubscribe = () => {
|
|
22
|
+
this[$observers] = this[$observers].filter((someObserver) => someObserver !== observer);
|
|
23
|
+
};
|
|
24
|
+
return unsubscribe;
|
|
25
|
+
});
|
|
26
|
+
this[$observers] = [];
|
|
27
|
+
}
|
|
28
|
+
complete() {
|
|
29
|
+
for (const observer of this[$observers])
|
|
30
|
+
observer.complete();
|
|
31
|
+
}
|
|
32
|
+
error(error) {
|
|
33
|
+
for (const observer of this[$observers])
|
|
34
|
+
observer.error(error);
|
|
35
|
+
}
|
|
36
|
+
next(value) {
|
|
37
|
+
for (const observer of this[$observers])
|
|
38
|
+
observer.next(value);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.Subject = Subject;
|
|
42
|
+
var observable_fns_2 = require("observable-fns");
|
|
43
|
+
Object.defineProperty(exports, "Observable", { enumerable: true, get: function () { return observable_fns_2.Observable; } });
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.allSettled = void 0;
|
|
4
|
+
// Based on <https://github.com/es-shims/Promise.allSettled/blob/master/implementation.js>
|
|
5
|
+
function allSettled(values) {
|
|
6
|
+
return Promise.all(values.map((item) => {
|
|
7
|
+
const onFulfill = (value) => {
|
|
8
|
+
return { status: 'fulfilled', value };
|
|
9
|
+
};
|
|
10
|
+
const onReject = (reason) => {
|
|
11
|
+
return { reason, status: 'rejected' };
|
|
12
|
+
};
|
|
13
|
+
const itemPromise = Promise.resolve(item);
|
|
14
|
+
try {
|
|
15
|
+
return itemPromise.then(onFulfill, onReject);
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
return Promise.reject(error);
|
|
19
|
+
}
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
exports.allSettled = allSettled;
|
package/dist/promise.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createPromiseWithResolver = void 0;
|
|
4
|
+
// eslint-disable-next-line unicorn/no-useless-undefined
|
|
5
|
+
const doNothing = () => undefined;
|
|
6
|
+
/**
|
|
7
|
+
* Creates a new promise and exposes its resolver function.
|
|
8
|
+
* Use with care!
|
|
9
|
+
*/
|
|
10
|
+
function createPromiseWithResolver() {
|
|
11
|
+
let alreadyResolved = false;
|
|
12
|
+
let resolvedTo;
|
|
13
|
+
let resolver = doNothing;
|
|
14
|
+
const promise = new Promise((resolve) => {
|
|
15
|
+
if (alreadyResolved) {
|
|
16
|
+
resolve(resolvedTo);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
resolver = resolve;
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
const exposedResolver = (value) => {
|
|
23
|
+
alreadyResolved = true;
|
|
24
|
+
resolvedTo = value;
|
|
25
|
+
resolver(resolvedTo);
|
|
26
|
+
};
|
|
27
|
+
return [promise, exposedResolver];
|
|
28
|
+
}
|
|
29
|
+
exports.createPromiseWithResolver = createPromiseWithResolver;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface Serializer<Msg = JsonSerializable, Input = any> {
|
|
2
|
+
deserialize(message: Msg): Input;
|
|
3
|
+
serialize(input: Input): Msg;
|
|
4
|
+
}
|
|
5
|
+
export interface SerializerImplementation<Msg = JsonSerializable, Input = any> {
|
|
6
|
+
deserialize(message: Msg, defaultDeserialize: (msg: Msg) => Input): Input;
|
|
7
|
+
serialize(input: Input, defaultSerialize: (inp: Input) => Msg): Msg;
|
|
8
|
+
}
|
|
9
|
+
export declare function extendSerializer<MessageType, InputType = any>(extend: Serializer<MessageType, InputType>, implementation: SerializerImplementation<MessageType, InputType>): Serializer<MessageType, InputType>;
|
|
10
|
+
type JsonSerializablePrimitive = string | number | boolean | null;
|
|
11
|
+
type JsonSerializableObject = {
|
|
12
|
+
[key: string]: JsonSerializablePrimitive | JsonSerializablePrimitive[] | JsonSerializableObject | JsonSerializableObject[] | undefined;
|
|
13
|
+
};
|
|
14
|
+
export type JsonSerializable = JsonSerializablePrimitive | JsonSerializablePrimitive[] | JsonSerializableObject | JsonSerializableObject[];
|
|
15
|
+
export declare const DefaultSerializer: Serializer<JsonSerializable>;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DefaultSerializer = exports.extendSerializer = void 0;
|
|
4
|
+
function extendSerializer(extend, implementation) {
|
|
5
|
+
const fallbackDeserializer = extend.deserialize.bind(extend);
|
|
6
|
+
const fallbackSerializer = extend.serialize.bind(extend);
|
|
7
|
+
return {
|
|
8
|
+
deserialize(message) {
|
|
9
|
+
return implementation.deserialize(message, fallbackDeserializer);
|
|
10
|
+
},
|
|
11
|
+
serialize(input) {
|
|
12
|
+
return implementation.serialize(input, fallbackSerializer);
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
exports.extendSerializer = extendSerializer;
|
|
17
|
+
const DefaultErrorSerializer = {
|
|
18
|
+
deserialize(message) {
|
|
19
|
+
return Object.assign(Error(message.message), {
|
|
20
|
+
name: message.name,
|
|
21
|
+
stack: message.stack,
|
|
22
|
+
});
|
|
23
|
+
},
|
|
24
|
+
serialize(error) {
|
|
25
|
+
return {
|
|
26
|
+
__error_marker: '$$error',
|
|
27
|
+
message: error.message,
|
|
28
|
+
name: error.name,
|
|
29
|
+
stack: error.stack,
|
|
30
|
+
};
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
const isSerializedError = (thing) => thing && typeof thing === 'object' && '__error_marker' in thing && thing.__error_marker === '$$error';
|
|
34
|
+
exports.DefaultSerializer = {
|
|
35
|
+
deserialize(message) {
|
|
36
|
+
return isSerializedError(message) ? DefaultErrorSerializer.deserialize(message) : message;
|
|
37
|
+
},
|
|
38
|
+
serialize(input) {
|
|
39
|
+
return input instanceof Error ? DefaultErrorSerializer.serialize(input) : input;
|
|
40
|
+
},
|
|
41
|
+
};
|
package/dist/symbols.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
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');
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { $transferable } from './symbols';
|
|
2
|
+
export interface TransferDescriptor<T = any> {
|
|
3
|
+
[$transferable]: true;
|
|
4
|
+
send: T;
|
|
5
|
+
transferables: Transferable[];
|
|
6
|
+
}
|
|
7
|
+
export declare function isTransferDescriptor(thing: any): thing is TransferDescriptor;
|
|
8
|
+
/**
|
|
9
|
+
* Mark a transferable object as such, so it will no be serialized and
|
|
10
|
+
* deserialized on messaging with the main thread, but to transfer
|
|
11
|
+
* ownership of it to the receiving thread.
|
|
12
|
+
*
|
|
13
|
+
* Only works with array buffers, message ports and few more special
|
|
14
|
+
* types of objects, but it's much faster than serializing and
|
|
15
|
+
* deserializing them.
|
|
16
|
+
*
|
|
17
|
+
* Note:
|
|
18
|
+
* The transferable object cannot be accessed by this thread again
|
|
19
|
+
* unless the receiving thread transfers it back again!
|
|
20
|
+
*
|
|
21
|
+
* @param transferable Array buffer, message port or similar.
|
|
22
|
+
* @see <https://developers.google.com/web/updates/2011/12/Transferable-Objects-Lightning-Fast>
|
|
23
|
+
*/
|
|
24
|
+
export declare function Transfer(transferable: Transferable): TransferDescriptor;
|
|
25
|
+
/**
|
|
26
|
+
* Mark transferable objects within an arbitrary object or array as
|
|
27
|
+
* being a transferable object. They will then not be serialized
|
|
28
|
+
* and deserialized on messaging with the main thread, but ownership
|
|
29
|
+
* of them will be tranferred to the receiving thread.
|
|
30
|
+
*
|
|
31
|
+
* Only array buffers, message ports and few more special types of
|
|
32
|
+
* objects can be transferred, but it's much faster than serializing and
|
|
33
|
+
* deserializing them.
|
|
34
|
+
*
|
|
35
|
+
* Note:
|
|
36
|
+
* The transferable object cannot be accessed by this thread again
|
|
37
|
+
* unless the receiving thread transfers it back again!
|
|
38
|
+
*
|
|
39
|
+
* @param transferable Array buffer, message port or similar.
|
|
40
|
+
* @see <https://developers.google.com/web/updates/2011/12/Transferable-Objects-Lightning-Fast>
|
|
41
|
+
*/
|
|
42
|
+
export declare function Transfer<T>(payload: T, transferables: Transferable[]): TransferDescriptor;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Transfer = exports.isTransferDescriptor = void 0;
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
5
|
+
const symbols_1 = require("./symbols");
|
|
6
|
+
function isTransferable(thing) {
|
|
7
|
+
if (!thing || typeof thing !== 'object')
|
|
8
|
+
return false;
|
|
9
|
+
// Don't check too thoroughly, since the list of transferable things in JS might grow over time
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
function isTransferDescriptor(thing) {
|
|
13
|
+
return thing && typeof thing === 'object' && thing[symbols_1.$transferable];
|
|
14
|
+
}
|
|
15
|
+
exports.isTransferDescriptor = isTransferDescriptor;
|
|
16
|
+
function Transfer(payload, transferables) {
|
|
17
|
+
if (!transferables) {
|
|
18
|
+
if (!isTransferable(payload))
|
|
19
|
+
throw new Error('Not transferable');
|
|
20
|
+
transferables = [payload];
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
[symbols_1.$transferable]: true,
|
|
24
|
+
send: payload,
|
|
25
|
+
transferables,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
exports.Transfer = Transfer;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
import { Observable } from 'observable-fns';
|
|
3
|
+
import { ObservablePromise } from '../observable-promise';
|
|
4
|
+
import { $errors, $events, $terminate, $worker } from '../symbols';
|
|
5
|
+
import { TransferDescriptor } from '../transferable';
|
|
6
|
+
interface ObservableLikeSubscription {
|
|
7
|
+
unsubscribe(): any;
|
|
8
|
+
}
|
|
9
|
+
interface ObservableLike<T> {
|
|
10
|
+
subscribe(onNext: (value: T) => any, onError?: (error: any) => any, onComplete?: () => any): ObservableLikeSubscription;
|
|
11
|
+
subscribe(listeners: {
|
|
12
|
+
complete?(): any;
|
|
13
|
+
error?(error: any): any;
|
|
14
|
+
next?(value: T): any;
|
|
15
|
+
}): ObservableLikeSubscription;
|
|
16
|
+
}
|
|
17
|
+
export type StripAsync<Type> = Type extends Promise<infer PromiseBaseType> ? PromiseBaseType : Type extends ObservableLike<infer ObservableBaseType> ? ObservableBaseType : Type;
|
|
18
|
+
export type StripTransfer<Type> = Type extends TransferDescriptor<infer BaseType> ? BaseType : Type;
|
|
19
|
+
export type ModuleMethods = {
|
|
20
|
+
[methodName: string]: (...args: any) => any;
|
|
21
|
+
};
|
|
22
|
+
export type ProxyableArgs<Args extends any[]> = Args extends [arg0: infer Arg0, ...rest: infer RestArgs] ? [Arg0 extends Transferable ? Arg0 | TransferDescriptor<Arg0> : Arg0, ...RestArgs] : Args;
|
|
23
|
+
export type ProxyableFunction<Args extends any[], ReturnType> = Args extends [] ? () => ObservablePromise<StripTransfer<StripAsync<ReturnType>>> : (...args: ProxyableArgs<Args>) => ObservablePromise<StripTransfer<StripAsync<ReturnType>>>;
|
|
24
|
+
export type ModuleProxy<Methods extends ModuleMethods> = {
|
|
25
|
+
[method in keyof Methods]: ProxyableFunction<Parameters<Methods[method]>, ReturnType<Methods[method]>>;
|
|
26
|
+
};
|
|
27
|
+
export interface PrivateThreadProps {
|
|
28
|
+
[$errors]: Observable<Error>;
|
|
29
|
+
[$events]: Observable<WorkerEvent>;
|
|
30
|
+
[$terminate]: () => Promise<void>;
|
|
31
|
+
[$worker]: Worker;
|
|
32
|
+
}
|
|
33
|
+
export type FunctionThread<Args extends any[] = any[], ReturnType = any> = ProxyableFunction<Args, ReturnType> & PrivateThreadProps;
|
|
34
|
+
export type ModuleThread<Methods extends ModuleMethods = any> = ModuleProxy<Methods> & PrivateThreadProps;
|
|
35
|
+
interface AnyFunctionThread extends PrivateThreadProps {
|
|
36
|
+
(...args: any[]): ObservablePromise<any>;
|
|
37
|
+
}
|
|
38
|
+
interface AnyModuleThread extends PrivateThreadProps {
|
|
39
|
+
}
|
|
40
|
+
/** Worker thread. Either a `FunctionThread` or a `ModuleThread`. */
|
|
41
|
+
export type Thread = AnyFunctionThread | AnyModuleThread;
|
|
42
|
+
export type TransferList = Transferable[];
|
|
43
|
+
/** Worker instance. Either a web worker or a node.js Worker provided by `worker_threads` or `tiny-worker`. */
|
|
44
|
+
export interface Worker extends EventTarget {
|
|
45
|
+
postMessage(value: any, transferList?: TransferList): void;
|
|
46
|
+
/** In nodejs 10+ return type is Promise while with tiny-worker and in browser return type is void */
|
|
47
|
+
terminate(callback?: (error?: Error, exitCode?: number) => void): void | Promise<number>;
|
|
48
|
+
}
|
|
49
|
+
export interface ThreadsWorkerOptions extends WorkerOptions {
|
|
50
|
+
/** Whether to apply CORS protection workaround. Defaults to true. */
|
|
51
|
+
CORSWorkaround?: boolean;
|
|
52
|
+
/** Prefix for the path passed to the Worker constructor. Web worker only. */
|
|
53
|
+
_baseURL?: string;
|
|
54
|
+
/** Resource limits passed on to Node worker_threads */
|
|
55
|
+
resourceLimits?: {
|
|
56
|
+
/** The size of a pre-allocated memory range used for generated code. */
|
|
57
|
+
codeRangeSizeMb?: number;
|
|
58
|
+
/** The maximum size of the main heap in MB. */
|
|
59
|
+
maxOldGenerationSizeMb?: number;
|
|
60
|
+
/** The maximum size of a heap space for recently created objects. */
|
|
61
|
+
maxYoungGenerationSizeMb?: number;
|
|
62
|
+
};
|
|
63
|
+
/** Data passed on to node.js worker_threads. */
|
|
64
|
+
workerData?: any;
|
|
65
|
+
}
|
|
66
|
+
/** Worker implementation. Either web worker or a node.js Worker class. */
|
|
67
|
+
export declare class WorkerImplementation extends EventTarget implements Worker {
|
|
68
|
+
constructor(path: string, options?: ThreadsWorkerOptions);
|
|
69
|
+
postMessage(value: any, transferList?: TransferList): void;
|
|
70
|
+
terminate(): void | Promise<number>;
|
|
71
|
+
}
|
|
72
|
+
/** Class to spawn workers from a blob or source string. */
|
|
73
|
+
export declare class BlobWorker extends WorkerImplementation {
|
|
74
|
+
constructor(blob: Blob, options?: ThreadsWorkerOptions);
|
|
75
|
+
static fromText(source: string, options?: ThreadsWorkerOptions): WorkerImplementation;
|
|
76
|
+
}
|
|
77
|
+
export interface ImplementationExport {
|
|
78
|
+
blob: typeof BlobWorker;
|
|
79
|
+
default: typeof WorkerImplementation;
|
|
80
|
+
}
|
|
81
|
+
/** Event as emitted by worker thread. Subscribe to using `Thread.events(thread)`. */
|
|
82
|
+
export declare enum WorkerEventType {
|
|
83
|
+
internalError = "internalError",
|
|
84
|
+
message = "message",
|
|
85
|
+
termination = "termination"
|
|
86
|
+
}
|
|
87
|
+
export interface WorkerInternalErrorEvent {
|
|
88
|
+
error: Error;
|
|
89
|
+
type: WorkerEventType.internalError;
|
|
90
|
+
}
|
|
91
|
+
export interface WorkerMessageEvent<Data> {
|
|
92
|
+
data: Data;
|
|
93
|
+
type: WorkerEventType.message;
|
|
94
|
+
}
|
|
95
|
+
export interface WorkerTerminationEvent {
|
|
96
|
+
type: WorkerEventType.termination;
|
|
97
|
+
}
|
|
98
|
+
export type WorkerEvent = WorkerInternalErrorEvent | WorkerMessageEvent<any> | WorkerTerminationEvent;
|
|
99
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
/// <reference lib="dom" />
|
|
4
|
+
// tslint:disable max-classes-per-file
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.WorkerEventType = void 0;
|
|
7
|
+
const symbols_1 = require("../symbols");
|
|
8
|
+
/** Event as emitted by worker thread. Subscribe to using `Thread.events(thread)`. */
|
|
9
|
+
var WorkerEventType;
|
|
10
|
+
(function (WorkerEventType) {
|
|
11
|
+
WorkerEventType["internalError"] = "internalError";
|
|
12
|
+
WorkerEventType["message"] = "message";
|
|
13
|
+
WorkerEventType["termination"] = "termination";
|
|
14
|
+
})(WorkerEventType || (exports.WorkerEventType = WorkerEventType = {}));
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export interface SerializedError {
|
|
2
|
+
__error_marker: '$$error';
|
|
3
|
+
message: string;
|
|
4
|
+
name: string;
|
|
5
|
+
stack?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare enum MasterMessageType {
|
|
8
|
+
cancel = "cancel",
|
|
9
|
+
run = "run"
|
|
10
|
+
}
|
|
11
|
+
export type MasterJobCancelMessage = {
|
|
12
|
+
type: MasterMessageType.cancel;
|
|
13
|
+
uid: number;
|
|
14
|
+
};
|
|
15
|
+
export type MasterJobRunMessage = {
|
|
16
|
+
type: MasterMessageType.run;
|
|
17
|
+
uid: number;
|
|
18
|
+
method?: string;
|
|
19
|
+
args: any[];
|
|
20
|
+
};
|
|
21
|
+
export type MasterSentMessage = MasterJobCancelMessage | MasterJobRunMessage;
|
|
22
|
+
export declare enum WorkerMessageType {
|
|
23
|
+
error = "error",
|
|
24
|
+
init = "init",
|
|
25
|
+
result = "result",
|
|
26
|
+
running = "running",
|
|
27
|
+
uncaughtError = "uncaughtError"
|
|
28
|
+
}
|
|
29
|
+
export type WorkerUncaughtErrorMessage = {
|
|
30
|
+
type: WorkerMessageType.uncaughtError;
|
|
31
|
+
error: {
|
|
32
|
+
message: string;
|
|
33
|
+
name: string;
|
|
34
|
+
stack?: string;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
export type WorkerInitMessage = {
|
|
38
|
+
type: WorkerMessageType.init;
|
|
39
|
+
exposed: {
|
|
40
|
+
type: 'function';
|
|
41
|
+
} | {
|
|
42
|
+
type: 'module';
|
|
43
|
+
methods: string[];
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
export type WorkerJobErrorMessage = {
|
|
47
|
+
type: WorkerMessageType.error;
|
|
48
|
+
uid: number;
|
|
49
|
+
error: SerializedError;
|
|
50
|
+
};
|
|
51
|
+
export type WorkerJobResultMessage = {
|
|
52
|
+
type: WorkerMessageType.result;
|
|
53
|
+
uid: number;
|
|
54
|
+
complete?: true;
|
|
55
|
+
payload?: any;
|
|
56
|
+
};
|
|
57
|
+
export type WorkerJobStartMessage = {
|
|
58
|
+
type: WorkerMessageType.running;
|
|
59
|
+
uid: number;
|
|
60
|
+
resultType: 'observable' | 'promise';
|
|
61
|
+
};
|
|
62
|
+
export type WorkerSentMessage = WorkerInitMessage | WorkerJobErrorMessage | WorkerJobResultMessage | WorkerJobStartMessage | WorkerUncaughtErrorMessage;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WorkerMessageType = exports.MasterMessageType = void 0;
|
|
4
|
+
/////////////////////////////
|
|
5
|
+
// Messages sent by master:
|
|
6
|
+
var MasterMessageType;
|
|
7
|
+
(function (MasterMessageType) {
|
|
8
|
+
MasterMessageType["cancel"] = "cancel";
|
|
9
|
+
MasterMessageType["run"] = "run";
|
|
10
|
+
})(MasterMessageType || (exports.MasterMessageType = MasterMessageType = {}));
|
|
11
|
+
////////////////////////////
|
|
12
|
+
// Messages sent by worker:
|
|
13
|
+
var WorkerMessageType;
|
|
14
|
+
(function (WorkerMessageType) {
|
|
15
|
+
WorkerMessageType["error"] = "error";
|
|
16
|
+
WorkerMessageType["init"] = "init";
|
|
17
|
+
WorkerMessageType["result"] = "result";
|
|
18
|
+
WorkerMessageType["running"] = "running";
|
|
19
|
+
WorkerMessageType["uncaughtError"] = "uncaughtError";
|
|
20
|
+
})(WorkerMessageType || (exports.WorkerMessageType = WorkerMessageType = {}));
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
type UnsubscribeFn = () => void;
|
|
2
|
+
export interface AbstractedWorkerAPI {
|
|
3
|
+
isWorkerRuntime(): boolean;
|
|
4
|
+
postMessageToMaster(message: any, transferList?: Transferable[]): void;
|
|
5
|
+
subscribeToMasterMessages(onMessage: (data: any) => void): UnsubscribeFn;
|
|
6
|
+
}
|
|
7
|
+
export type WorkerFunction = ((...args: any[]) => any) | (() => any);
|
|
8
|
+
export type WorkerModule<Keys extends string> = {
|
|
9
|
+
[key in Keys]: WorkerFunction;
|
|
10
|
+
};
|
|
11
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './index';
|
|
@@ -0,0 +1,27 @@
|
|
|
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
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
18
|
+
const index_1 = require("./index");
|
|
19
|
+
__exportStar(require("./index"), exports);
|
|
20
|
+
if (typeof global !== 'undefined') {
|
|
21
|
+
;
|
|
22
|
+
global.expose = index_1.expose;
|
|
23
|
+
}
|
|
24
|
+
if (typeof self !== 'undefined') {
|
|
25
|
+
;
|
|
26
|
+
self.expose = index_1.expose;
|
|
27
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
declare const _default: {
|
|
3
|
+
isWorkerRuntime: () => boolean;
|
|
4
|
+
postMessageToMaster: (message: any, transferList?: Transferable[] | undefined) => void;
|
|
5
|
+
subscribeToMasterMessages: (onMessage: (data: any) => void) => () => void;
|
|
6
|
+
};
|
|
7
|
+
export default _default;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable import/no-default-export */
|
|
3
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
4
|
+
/// <reference lib="dom" />
|
|
5
|
+
// tslint:disable no-shadowed-variable
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const isWorkerRuntime = function isWorkerRuntime() {
|
|
8
|
+
const isWindowContext = self !== undefined && typeof Window !== 'undefined' && self instanceof Window;
|
|
9
|
+
return self !== undefined && self['postMessage'] && !isWindowContext ? true : false;
|
|
10
|
+
};
|
|
11
|
+
const postMessageToMaster = function postMessageToMaster(data, transferList) {
|
|
12
|
+
self.postMessage(data, transferList);
|
|
13
|
+
};
|
|
14
|
+
const subscribeToMasterMessages = function subscribeToMasterMessages(onMessage) {
|
|
15
|
+
const messageHandler = (messageEvent) => {
|
|
16
|
+
onMessage(messageEvent.data);
|
|
17
|
+
};
|
|
18
|
+
const unsubscribe = () => {
|
|
19
|
+
self.removeEventListener('message', messageHandler);
|
|
20
|
+
};
|
|
21
|
+
self.addEventListener('message', messageHandler);
|
|
22
|
+
return unsubscribe;
|
|
23
|
+
};
|
|
24
|
+
exports.default = {
|
|
25
|
+
isWorkerRuntime,
|
|
26
|
+
postMessageToMaster,
|
|
27
|
+
subscribeToMasterMessages,
|
|
28
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable import/no-default-export */
|
|
3
|
+
// tslint:disable no-var-requires
|
|
4
|
+
/*
|
|
5
|
+
* This file is only a stub to make './implementation' resolve to the right module.
|
|
6
|
+
*/
|
|
7
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
8
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
9
|
+
};
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
const implementation_browser_1 = __importDefault(require("./implementation.browser"));
|
|
12
|
+
const implementation_tiny_worker_1 = __importDefault(require("./implementation.tiny-worker"));
|
|
13
|
+
const implementation_worker_threads_1 = __importDefault(require("./implementation.worker_threads"));
|
|
14
|
+
const runningInNode = typeof process !== 'undefined' && process.arch !== 'browser' && 'pid' in process;
|
|
15
|
+
function selectNodeImplementation() {
|
|
16
|
+
try {
|
|
17
|
+
implementation_worker_threads_1.default.testImplementation();
|
|
18
|
+
return implementation_worker_threads_1.default;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return implementation_tiny_worker_1.default;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.default = runningInNode ? selectNodeImplementation() : implementation_browser_1.default;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
declare const _default: {
|
|
3
|
+
isWorkerRuntime: () => boolean;
|
|
4
|
+
postMessageToMaster: (message: any, transferList?: Transferable[] | undefined) => void;
|
|
5
|
+
subscribeToMasterMessages: (onMessage: (data: any) => void) => () => void;
|
|
6
|
+
};
|
|
7
|
+
export default _default;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable import/no-default-export */
|
|
3
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
4
|
+
/// <reference lib="dom" />
|
|
5
|
+
// tslint:disable no-shadowed-variable
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
if (self === undefined) {
|
|
8
|
+
;
|
|
9
|
+
global.self = global;
|
|
10
|
+
}
|
|
11
|
+
const isWorkerRuntime = function isWorkerRuntime() {
|
|
12
|
+
return self !== undefined && self['postMessage'] ? true : false;
|
|
13
|
+
};
|
|
14
|
+
const postMessageToMaster = function postMessageToMaster(data) {
|
|
15
|
+
// TODO: Warn that Transferables are not supported on first attempt to use feature
|
|
16
|
+
self.postMessage(data);
|
|
17
|
+
};
|
|
18
|
+
let muxingHandlerSetUp = false;
|
|
19
|
+
const messageHandlers = new Set();
|
|
20
|
+
const subscribeToMasterMessages = function subscribeToMasterMessages(onMessage) {
|
|
21
|
+
if (!muxingHandlerSetUp) {
|
|
22
|
+
// We have one multiplexing message handler as tiny-worker's
|
|
23
|
+
// addEventListener() only allows you to set a single message handler
|
|
24
|
+
self.addEventListener('message', ((event) => {
|
|
25
|
+
for (const handler of messageHandlers)
|
|
26
|
+
handler(event.data);
|
|
27
|
+
}));
|
|
28
|
+
muxingHandlerSetUp = true;
|
|
29
|
+
}
|
|
30
|
+
messageHandlers.add(onMessage);
|
|
31
|
+
const unsubscribe = () => messageHandlers.delete(onMessage);
|
|
32
|
+
return unsubscribe;
|
|
33
|
+
};
|
|
34
|
+
exports.default = {
|
|
35
|
+
isWorkerRuntime,
|
|
36
|
+
postMessageToMaster,
|
|
37
|
+
subscribeToMasterMessages,
|
|
38
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
declare function testImplementation(): void;
|
|
2
|
+
declare const _default: {
|
|
3
|
+
isWorkerRuntime: () => boolean;
|
|
4
|
+
postMessageToMaster: (message: any, transferList?: Transferable[] | undefined) => void;
|
|
5
|
+
subscribeToMasterMessages: (onMessage: (data: any) => void) => () => void;
|
|
6
|
+
testImplementation: typeof testImplementation;
|
|
7
|
+
};
|
|
8
|
+
export default _default;
|