@xylabs/threads 4.7.0-rc.1 → 4.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/dist/{types/common.d.ts → common.d.ts} +1 -5
  2. package/dist/common.js +16 -0
  3. package/dist/esm/common.js +16 -0
  4. package/dist/esm/index.js +26 -0
  5. package/dist/esm/master/get-bundle-url.browser.js +25 -0
  6. package/dist/esm/master/implementation.browser.js +65 -0
  7. package/dist/esm/master/implementation.js +43 -0
  8. package/dist/esm/master/implementation.node.js +205 -0
  9. package/dist/esm/master/index.js +14 -0
  10. package/dist/esm/master/invocation-proxy.js +121 -0
  11. package/dist/esm/master/pool-types.js +14 -0
  12. package/dist/esm/master/pool.js +262 -0
  13. package/dist/esm/master/register.js +11 -0
  14. package/dist/esm/master/spawn.js +114 -0
  15. package/dist/esm/master/thread.js +18 -0
  16. package/dist/esm/observable-promise.js +132 -0
  17. package/dist/esm/observable.js +33 -0
  18. package/dist/esm/ponyfills.js +20 -0
  19. package/dist/esm/promise.js +23 -0
  20. package/dist/esm/serializers.js +41 -0
  21. package/dist/esm/symbols.js +8 -0
  22. package/dist/esm/transferable.js +25 -0
  23. package/dist/esm/types/master.js +9 -0
  24. package/dist/esm/types/messages.js +16 -0
  25. package/dist/esm/types/worker.js +2 -0
  26. package/dist/esm/worker/bundle-entry.js +26 -0
  27. package/dist/esm/worker/implementation.browser.js +24 -0
  28. package/dist/esm/worker/implementation.js +19 -0
  29. package/dist/esm/worker/implementation.tiny-worker.js +37 -0
  30. package/dist/esm/worker/implementation.worker_threads.js +41 -0
  31. package/dist/esm/worker/index.js +174 -0
  32. package/dist/esm/worker_threads.js +13 -0
  33. package/dist/index.d.ts +7 -0
  34. package/dist/index.js +26 -0
  35. package/dist/{types/master → master}/get-bundle-url.browser.d.ts +0 -1
  36. package/dist/master/get-bundle-url.browser.js +25 -0
  37. package/dist/{types/master → master}/implementation.browser.d.ts +1 -2
  38. package/dist/master/implementation.browser.js +65 -0
  39. package/dist/{types/master → master}/implementation.d.ts +1 -4
  40. package/dist/master/implementation.js +43 -0
  41. package/dist/{types/master → master}/implementation.node.d.ts +1 -2
  42. package/dist/master/implementation.node.js +205 -0
  43. package/dist/master/index.d.ts +10 -0
  44. package/dist/master/index.js +14 -0
  45. package/dist/{types/master → master}/invocation-proxy.d.ts +1 -2
  46. package/dist/master/invocation-proxy.js +121 -0
  47. package/dist/{types/master → master}/pool-types.d.ts +1 -16
  48. package/dist/master/pool-types.js +14 -0
  49. package/dist/master/pool.d.ts +50 -0
  50. package/dist/master/pool.js +262 -0
  51. package/dist/master/register.d.ts +1 -0
  52. package/dist/master/register.js +11 -0
  53. package/dist/{types/master → master}/spawn.d.ts +2 -12
  54. package/dist/master/spawn.js +114 -0
  55. package/dist/master/thread.d.ts +8 -0
  56. package/dist/master/thread.js +18 -0
  57. package/dist/{types/observable-promise.d.ts → observable-promise.d.ts} +0 -14
  58. package/dist/observable-promise.js +132 -0
  59. package/dist/observable.d.ts +11 -0
  60. package/dist/observable.js +33 -0
  61. package/dist/{types/ponyfills.d.ts → ponyfills.d.ts} +0 -1
  62. package/dist/ponyfills.js +20 -0
  63. package/dist/promise.d.ts +1 -0
  64. package/dist/promise.js +23 -0
  65. package/dist/{types/serializers.d.ts → serializers.d.ts} +0 -1
  66. package/dist/serializers.js +41 -0
  67. package/dist/{types/symbols.d.ts → symbols.d.ts} +0 -1
  68. package/dist/symbols.js +8 -0
  69. package/dist/transferable.d.ts +9 -0
  70. package/dist/transferable.js +25 -0
  71. package/dist/types/{types/master.d.ts → master.d.ts} +3 -17
  72. package/dist/types/master.js +9 -0
  73. package/dist/types/{types/messages.d.ts → messages.d.ts} +0 -1
  74. package/dist/types/messages.js +16 -0
  75. package/dist/types/{types/worker.d.ts → worker.d.ts} +0 -1
  76. package/dist/types/worker.js +2 -0
  77. package/dist/worker/bundle-entry.d.ts +1 -0
  78. package/dist/worker/bundle-entry.js +26 -0
  79. package/dist/worker/implementation.browser.d.ts +6 -0
  80. package/dist/worker/implementation.browser.js +24 -0
  81. package/dist/worker/implementation.d.ts +3 -0
  82. package/dist/worker/implementation.js +19 -0
  83. package/dist/worker/implementation.tiny-worker.d.ts +6 -0
  84. package/dist/worker/implementation.tiny-worker.js +37 -0
  85. package/dist/worker/implementation.worker_threads.d.ts +8 -0
  86. package/dist/worker/implementation.worker_threads.js +41 -0
  87. package/dist/worker/index.d.ts +5 -0
  88. package/dist/worker/index.js +174 -0
  89. package/dist/worker_threads.d.ts +8 -0
  90. package/dist/worker_threads.js +13 -0
  91. package/eslint.config.mjs +35 -0
  92. package/index.mjs +10 -0
  93. package/observable.d.ts +2 -0
  94. package/observable.js +2 -0
  95. package/observable.mjs +4 -0
  96. package/package.json +93 -53
  97. package/register.d.ts +2 -0
  98. package/register.js +2 -0
  99. package/register.mjs +1 -0
  100. package/rollup.config.js +16 -0
  101. package/src/common.ts +19 -0
  102. package/src/index.ts +10 -0
  103. package/src/master/get-bundle-url.browser.ts +31 -0
  104. package/src/master/implementation.browser.ts +82 -0
  105. package/src/master/implementation.node.ts +285 -0
  106. package/src/master/implementation.ts +21 -0
  107. package/src/master/index.ts +19 -0
  108. package/src/master/invocation-proxy.ts +151 -0
  109. package/src/master/pool-types.ts +83 -0
  110. package/src/master/pool.ts +399 -0
  111. package/src/master/register.ts +10 -0
  112. package/src/master/spawn.ts +172 -0
  113. package/src/master/thread.ts +29 -0
  114. package/src/observable-promise.ts +183 -0
  115. package/src/observable.ts +44 -0
  116. package/src/ponyfills.ts +31 -0
  117. package/src/promise.ts +26 -0
  118. package/src/serializers.ts +68 -0
  119. package/src/symbols.ts +5 -0
  120. package/{dist/types/transferable.d.ts → src/transferable.ts} +33 -8
  121. package/src/types/master.ts +132 -0
  122. package/src/types/messages.ts +72 -0
  123. package/src/types/worker.ts +14 -0
  124. package/src/worker/bundle-entry.ts +10 -0
  125. package/src/worker/implementation.browser.ts +40 -0
  126. package/src/worker/implementation.tiny-worker.ts +55 -0
  127. package/src/worker/implementation.ts +23 -0
  128. package/src/worker/implementation.worker_threads.ts +50 -0
  129. package/src/worker/index.ts +230 -0
  130. package/src/worker_threads.ts +27 -0
  131. package/test/lib/index.ts +1 -0
  132. package/test/lib/serialization.ts +38 -0
  133. package/test/observable-promise.test.ts +205 -0
  134. package/test/observable.test.ts +87 -0
  135. package/test/pool.test.ts +183 -0
  136. package/test/serialization.test.ts +23 -0
  137. package/test/spawn.chromium.mocha.ts +53 -0
  138. package/test/spawn.test.ts +87 -0
  139. package/test/streaming.test.ts +29 -0
  140. package/test/transferables.test.ts +71 -0
  141. package/test/workers/arraybuffer-xor.ts +10 -0
  142. package/test/workers/count-to-five.ts +12 -0
  143. package/test/workers/counter.ts +19 -0
  144. package/test/workers/faulty-function.ts +5 -0
  145. package/test/workers/hello-world.ts +5 -0
  146. package/test/workers/increment.ts +8 -0
  147. package/test/workers/minmax.ts +25 -0
  148. package/test/workers/serialization.ts +13 -0
  149. package/test/workers/top-level-throw.ts +1 -0
  150. package/test-tooling/rollup/app.js +21 -0
  151. package/test-tooling/rollup/rollup.config.ts +14 -0
  152. package/test-tooling/rollup/worker.js +7 -0
  153. package/test-tooling/tsconfig/minimal.ts +12 -0
  154. package/test-tooling/webpack/addition-worker.ts +9 -0
  155. package/test-tooling/webpack/app-with-inlined-worker.ts +28 -0
  156. package/test-tooling/webpack/app.ts +61 -0
  157. package/test-tooling/webpack/pool-worker.ts +5 -0
  158. package/test-tooling/webpack/raw-loader.d.ts +4 -0
  159. package/test-tooling/webpack/webpack.chromium.mocha.ts +21 -0
  160. package/test-tooling/webpack/webpack.node.config.js +29 -0
  161. package/test-tooling/webpack/webpack.web.config.js +28 -0
  162. package/types/is-observable.d.ts +7 -0
  163. package/types/tiny-worker.d.ts +4 -0
  164. package/types/webworker.d.ts +9 -0
  165. package/worker.d.ts +2 -0
  166. package/worker.js +2 -0
  167. package/worker.mjs +6 -0
  168. package/dist/browser/master/implementation.browser.mjs +0 -89
  169. package/dist/browser/master/implementation.browser.mjs.map +0 -1
  170. package/dist/browser/worker/worker.browser.mjs +0 -291
  171. package/dist/browser/worker/worker.browser.mjs.map +0 -1
  172. package/dist/neutral/index.mjs +0 -1022
  173. package/dist/neutral/index.mjs.map +0 -1
  174. package/dist/neutral/master/implementation.mjs +0 -264
  175. package/dist/neutral/master/implementation.mjs.map +0 -1
  176. package/dist/neutral/master/index.mjs +0 -988
  177. package/dist/neutral/master/index.mjs.map +0 -1
  178. package/dist/neutral/master/pool.mjs +0 -579
  179. package/dist/neutral/master/pool.mjs.map +0 -1
  180. package/dist/neutral/master/register.mjs +0 -272
  181. package/dist/neutral/master/register.mjs.map +0 -1
  182. package/dist/neutral/master/spawn.mjs +0 -412
  183. package/dist/neutral/master/spawn.mjs.map +0 -1
  184. package/dist/neutral/master/thread.mjs +0 -29
  185. package/dist/neutral/master/thread.mjs.map +0 -1
  186. package/dist/neutral/observable-promise.mjs +0 -132
  187. package/dist/neutral/observable-promise.mjs.map +0 -1
  188. package/dist/neutral/observable.mjs +0 -31
  189. package/dist/neutral/observable.mjs.map +0 -1
  190. package/dist/node/master/implementation.node.mjs +0 -154
  191. package/dist/node/master/implementation.node.mjs.map +0 -1
  192. package/dist/node/worker/worker.node.mjs +0 -304
  193. package/dist/node/worker/worker.node.mjs.map +0 -1
  194. package/dist/types/common.d.ts.map +0 -1
  195. package/dist/types/index.d.ts +0 -9
  196. package/dist/types/index.d.ts.map +0 -1
  197. package/dist/types/master/get-bundle-url.browser.d.ts.map +0 -1
  198. package/dist/types/master/implementation.browser.d.ts.map +0 -1
  199. package/dist/types/master/implementation.d.ts.map +0 -1
  200. package/dist/types/master/implementation.node.d.ts.map +0 -1
  201. package/dist/types/master/index.d.ts +0 -13
  202. package/dist/types/master/index.d.ts.map +0 -1
  203. package/dist/types/master/invocation-proxy.d.ts.map +0 -1
  204. package/dist/types/master/pool-types.d.ts.map +0 -1
  205. package/dist/types/master/pool.d.ts +0 -93
  206. package/dist/types/master/pool.d.ts.map +0 -1
  207. package/dist/types/master/register.d.ts +0 -2
  208. package/dist/types/master/register.d.ts.map +0 -1
  209. package/dist/types/master/spawn.d.ts.map +0 -1
  210. package/dist/types/master/thread.d.ts +0 -13
  211. package/dist/types/master/thread.d.ts.map +0 -1
  212. package/dist/types/observable-promise.d.ts.map +0 -1
  213. package/dist/types/observable.d.ts +0 -21
  214. package/dist/types/observable.d.ts.map +0 -1
  215. package/dist/types/ponyfills.d.ts.map +0 -1
  216. package/dist/types/promise.d.ts +0 -6
  217. package/dist/types/promise.d.ts.map +0 -1
  218. package/dist/types/serializers.d.ts.map +0 -1
  219. package/dist/types/symbols.d.ts.map +0 -1
  220. package/dist/types/transferable.d.ts.map +0 -1
  221. package/dist/types/types/master.d.ts.map +0 -1
  222. package/dist/types/types/messages.d.ts.map +0 -1
  223. package/dist/types/types/worker.d.ts.map +0 -1
  224. package/dist/types/worker/WorkerGlobalScope.d.ts +0 -6
  225. package/dist/types/worker/WorkerGlobalScope.d.ts.map +0 -1
  226. package/dist/types/worker/expose.d.ts +0 -4
  227. package/dist/types/worker/expose.d.ts.map +0 -1
  228. package/dist/types/worker/worker.browser.d.ts +0 -14
  229. package/dist/types/worker/worker.browser.d.ts.map +0 -1
  230. package/dist/types/worker/worker.node.d.ts +0 -25
  231. package/dist/types/worker/worker.node.d.ts.map +0 -1
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createPromiseWithResolver = createPromiseWithResolver;
4
+ const doNothing = () => undefined;
5
+ function createPromiseWithResolver() {
6
+ let alreadyResolved = false;
7
+ let resolvedTo;
8
+ let resolver = doNothing;
9
+ const promise = new Promise((resolve) => {
10
+ if (alreadyResolved) {
11
+ resolve(resolvedTo);
12
+ }
13
+ else {
14
+ resolver = resolve;
15
+ }
16
+ });
17
+ const exposedResolver = (value) => {
18
+ alreadyResolved = true;
19
+ resolvedTo = value;
20
+ resolver(resolvedTo);
21
+ };
22
+ return [promise, exposedResolver];
23
+ }
@@ -14,4 +14,3 @@ type JsonSerializableObject = {
14
14
  export type JsonSerializable = JsonSerializablePrimitive | JsonSerializablePrimitive[] | JsonSerializableObject | JsonSerializableObject[];
15
15
  export declare const DefaultSerializer: Serializer<JsonSerializable>;
16
16
  export {};
17
- //# sourceMappingURL=serializers.d.ts.map
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DefaultSerializer = void 0;
4
+ exports.extendSerializer = extendSerializer;
5
+ function extendSerializer(extend, implementation) {
6
+ const fallbackDeserializer = extend.deserialize.bind(extend);
7
+ const fallbackSerializer = extend.serialize.bind(extend);
8
+ return {
9
+ deserialize(message) {
10
+ return implementation.deserialize(message, fallbackDeserializer);
11
+ },
12
+ serialize(input) {
13
+ return implementation.serialize(input, fallbackSerializer);
14
+ },
15
+ };
16
+ }
17
+ const DefaultErrorSerializer = {
18
+ deserialize(message) {
19
+ return Object.assign(new 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
+ };
@@ -3,4 +3,3 @@ export declare const $events: unique symbol;
3
3
  export declare const $terminate: unique symbol;
4
4
  export declare const $transferable: unique symbol;
5
5
  export declare const $worker: unique symbol;
6
- //# sourceMappingURL=symbols.d.ts.map
@@ -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,9 @@
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
+ export declare function Transfer(transferable: Transferable): TransferDescriptor;
9
+ export declare function Transfer<T>(payload: T, transferables: Transferable[]): TransferDescriptor;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isTransferDescriptor = isTransferDescriptor;
4
+ exports.Transfer = Transfer;
5
+ const symbols_1 = require("./symbols");
6
+ function isTransferable(thing) {
7
+ if (!thing || typeof thing !== 'object')
8
+ return false;
9
+ return true;
10
+ }
11
+ function isTransferDescriptor(thing) {
12
+ return thing && typeof thing === 'object' && thing[symbols_1.$transferable];
13
+ }
14
+ function Transfer(payload, transferables) {
15
+ if (!transferables) {
16
+ if (!isTransferable(payload))
17
+ throw new Error('Not transferable');
18
+ transferables = [payload];
19
+ }
20
+ return {
21
+ [symbols_1.$transferable]: true,
22
+ send: payload,
23
+ transferables,
24
+ };
25
+ }
@@ -1,7 +1,7 @@
1
1
  import type { Observable } from 'observable-fns';
2
- import type { ObservablePromise } from '../observable-promise.ts';
3
- import type { $errors, $events, $terminate, $worker } from '../symbols.ts';
4
- import type { TransferDescriptor } from '../transferable.ts';
2
+ import type { ObservablePromise } from '../observable-promise';
3
+ import type { $errors, $events, $terminate, $worker } from '../symbols';
4
+ import type { TransferDescriptor } from '../transferable';
5
5
  interface ObservableLikeSubscription {
6
6
  unsubscribe(): any;
7
7
  }
@@ -36,39 +36,27 @@ interface AnyFunctionThread extends PrivateThreadProps {
36
36
  }
37
37
  interface AnyModuleThread extends PrivateThreadProps {
38
38
  }
39
- /** Worker thread. Either a `FunctionThread` or a `ModuleThread`. */
40
39
  export type Thread = AnyFunctionThread | AnyModuleThread;
41
40
  export type TransferList = Transferable[];
42
- /** Worker instance. Either a web worker or a node.js Worker provided by `worker_threads` or `tiny-worker`. */
43
41
  export interface Worker extends EventTarget {
44
42
  postMessage(value: any, transferList?: TransferList): void;
45
- /** In nodejs 10+ return type is Promise while with tiny-worker and in browser return type is void */
46
43
  terminate(callback?: (error?: Error, exitCode?: number) => void): void | Promise<number>;
47
44
  }
48
45
  export interface ThreadsWorkerOptions extends WorkerOptions {
49
- /** Whether to apply CORS protection workaround. Defaults to true. */
50
46
  CORSWorkaround?: boolean;
51
- /** Prefix for the path passed to the Worker constructor. Web worker only. */
52
47
  _baseURL?: string;
53
- /** Resource limits passed on to Node worker_threads */
54
48
  resourceLimits?: {
55
- /** The size of a pre-allocated memory range used for generated code. */
56
49
  codeRangeSizeMb?: number;
57
- /** The maximum size of the main heap in MB. */
58
50
  maxOldGenerationSizeMb?: number;
59
- /** The maximum size of a heap space for recently created objects. */
60
51
  maxYoungGenerationSizeMb?: number;
61
52
  };
62
- /** Data passed on to node.js worker_threads. */
63
53
  workerData?: any;
64
54
  }
65
- /** Worker implementation. Either web worker or a node.js Worker class. */
66
55
  export declare class WorkerImplementation extends EventTarget implements Worker {
67
56
  constructor(path: string, options?: ThreadsWorkerOptions);
68
57
  postMessage(value: any, transferList?: TransferList): void;
69
58
  terminate(): void | Promise<number>;
70
59
  }
71
- /** Class to spawn workers from a blob or source string. */
72
60
  export declare class BlobWorker extends WorkerImplementation {
73
61
  constructor(blob: Blob, options?: ThreadsWorkerOptions);
74
62
  static fromText(source: string, options?: ThreadsWorkerOptions): WorkerImplementation;
@@ -77,7 +65,6 @@ export interface ImplementationExport {
77
65
  blob: typeof BlobWorker;
78
66
  default: typeof WorkerImplementation;
79
67
  }
80
- /** Event as emitted by worker thread. Subscribe to using `Thread.events(thread)`. */
81
68
  export declare enum WorkerEventType {
82
69
  internalError = "internalError",
83
70
  message = "message",
@@ -96,4 +83,3 @@ export interface WorkerTerminationEvent {
96
83
  }
97
84
  export type WorkerEvent = WorkerInternalErrorEvent | WorkerMessageEvent<any> | WorkerTerminationEvent;
98
85
  export {};
99
- //# sourceMappingURL=master.d.ts.map
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WorkerEventType = void 0;
4
+ var WorkerEventType;
5
+ (function (WorkerEventType) {
6
+ WorkerEventType["internalError"] = "internalError";
7
+ WorkerEventType["message"] = "message";
8
+ WorkerEventType["termination"] = "termination";
9
+ })(WorkerEventType || (exports.WorkerEventType = WorkerEventType = {}));
@@ -58,4 +58,3 @@ export type WorkerJobStartMessage = {
58
58
  uid: number;
59
59
  resultType: 'observable' | 'promise';
60
60
  };
61
- //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WorkerMessageType = exports.MasterMessageType = void 0;
4
+ var MasterMessageType;
5
+ (function (MasterMessageType) {
6
+ MasterMessageType["cancel"] = "cancel";
7
+ MasterMessageType["run"] = "run";
8
+ })(MasterMessageType || (exports.MasterMessageType = MasterMessageType = {}));
9
+ var WorkerMessageType;
10
+ (function (WorkerMessageType) {
11
+ WorkerMessageType["error"] = "error";
12
+ WorkerMessageType["init"] = "init";
13
+ WorkerMessageType["result"] = "result";
14
+ WorkerMessageType["running"] = "running";
15
+ WorkerMessageType["uncaughtError"] = "uncaughtError";
16
+ })(WorkerMessageType || (exports.WorkerMessageType = WorkerMessageType = {}));
@@ -9,4 +9,3 @@ export type WorkerModule<Keys extends string> = {
9
9
  [key in Keys]: WorkerFunction;
10
10
  };
11
11
  export {};
12
- //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1 @@
1
+ export * from './index';
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ const index_1 = require("./index");
18
+ __exportStar(require("./index"), exports);
19
+ if (typeof globalThis !== 'undefined') {
20
+ ;
21
+ globalThis.expose = index_1.expose;
22
+ }
23
+ if (typeof globalThis !== 'undefined') {
24
+ ;
25
+ globalThis.expose = index_1.expose;
26
+ }
@@ -0,0 +1,6 @@
1
+ declare const _default: {
2
+ isWorkerRuntime: () => boolean;
3
+ postMessageToMaster: (message: any, transferList?: Transferable[]) => void;
4
+ subscribeToMasterMessages: (onMessage: (data: any) => void) => () => void;
5
+ };
6
+ export default _default;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const isWorkerRuntime = function isWorkerRuntime() {
4
+ const isWindowContext = self !== undefined && typeof Window !== 'undefined' && self instanceof Window;
5
+ return self !== undefined && self['postMessage'] && !isWindowContext ? true : false;
6
+ };
7
+ const postMessageToMaster = function postMessageToMaster(data, transferList) {
8
+ self.postMessage(data, transferList);
9
+ };
10
+ const subscribeToMasterMessages = function subscribeToMasterMessages(onMessage) {
11
+ const messageHandler = (messageEvent) => {
12
+ onMessage(messageEvent.data);
13
+ };
14
+ const unsubscribe = () => {
15
+ self.removeEventListener('message', messageHandler);
16
+ };
17
+ self.addEventListener('message', messageHandler);
18
+ return unsubscribe;
19
+ };
20
+ exports.default = {
21
+ isWorkerRuntime,
22
+ postMessageToMaster,
23
+ subscribeToMasterMessages,
24
+ };
@@ -0,0 +1,3 @@
1
+ import type { AbstractedWorkerAPI } from '../types/worker';
2
+ declare const _default: AbstractedWorkerAPI;
3
+ export default _default;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const implementation_browser_1 = __importDefault(require("./implementation.browser"));
7
+ const implementation_tiny_worker_1 = __importDefault(require("./implementation.tiny-worker"));
8
+ const implementation_worker_threads_1 = __importDefault(require("./implementation.worker_threads"));
9
+ const runningInNode = typeof process !== 'undefined' && process.arch !== 'browser' && 'pid' in process;
10
+ function selectNodeImplementation() {
11
+ try {
12
+ implementation_worker_threads_1.default.testImplementation();
13
+ return implementation_worker_threads_1.default;
14
+ }
15
+ catch {
16
+ return implementation_tiny_worker_1.default;
17
+ }
18
+ }
19
+ exports.default = runningInNode ? selectNodeImplementation() : implementation_browser_1.default;
@@ -0,0 +1,6 @@
1
+ declare const _default: {
2
+ isWorkerRuntime: () => boolean;
3
+ postMessageToMaster: (message: any, transferList?: Transferable[]) => void;
4
+ subscribeToMasterMessages: (onMessage: (data: any) => void) => () => void;
5
+ };
6
+ export default _default;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ try {
4
+ if (self === undefined) {
5
+ ;
6
+ globalThis.self = globalThis;
7
+ }
8
+ }
9
+ catch {
10
+ ;
11
+ globalThis.self = globalThis;
12
+ }
13
+ const isWorkerRuntime = function isWorkerRuntime() {
14
+ return self !== undefined && self['postMessage'] ? true : false;
15
+ };
16
+ const postMessageToMaster = function postMessageToMaster(data) {
17
+ self.postMessage(data);
18
+ };
19
+ let muxingHandlerSetUp = false;
20
+ const messageHandlers = new Set();
21
+ const subscribeToMasterMessages = function subscribeToMasterMessages(onMessage) {
22
+ if (!muxingHandlerSetUp) {
23
+ self.addEventListener('message', ((event) => {
24
+ for (const handler of messageHandlers)
25
+ handler(event.data);
26
+ }));
27
+ muxingHandlerSetUp = true;
28
+ }
29
+ messageHandlers.add(onMessage);
30
+ const unsubscribe = () => messageHandlers.delete(onMessage);
31
+ return unsubscribe;
32
+ };
33
+ exports.default = {
34
+ isWorkerRuntime,
35
+ postMessageToMaster,
36
+ subscribeToMasterMessages,
37
+ };
@@ -0,0 +1,8 @@
1
+ declare function testImplementation(): void;
2
+ declare const _default: {
3
+ isWorkerRuntime: () => boolean;
4
+ postMessageToMaster: (message: any, transferList?: Transferable[]) => void;
5
+ subscribeToMasterMessages: (onMessage: (data: any) => void) => () => void;
6
+ testImplementation: typeof testImplementation;
7
+ };
8
+ export default _default;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const worker_threads_1 = __importDefault(require("../worker_threads"));
7
+ function assertMessagePort(port) {
8
+ if (!port) {
9
+ throw new Error('Invariant violation: MessagePort to parent is not available.');
10
+ }
11
+ return port;
12
+ }
13
+ const isWorkerRuntime = function isWorkerRuntime() {
14
+ return !(0, worker_threads_1.default)().isMainThread;
15
+ };
16
+ const postMessageToMaster = function postMessageToMaster(data, transferList) {
17
+ assertMessagePort((0, worker_threads_1.default)().parentPort).postMessage(data, transferList);
18
+ };
19
+ const subscribeToMasterMessages = function subscribeToMasterMessages(onMessage) {
20
+ const parentPort = (0, worker_threads_1.default)().parentPort;
21
+ if (!parentPort) {
22
+ throw new Error('Invariant violation: MessagePort to parent is not available.');
23
+ }
24
+ const messageHandler = (message) => {
25
+ onMessage(message);
26
+ };
27
+ const unsubscribe = () => {
28
+ assertMessagePort(parentPort).off('message', messageHandler);
29
+ };
30
+ assertMessagePort(parentPort).on('message', messageHandler);
31
+ return unsubscribe;
32
+ };
33
+ function testImplementation() {
34
+ (0, worker_threads_1.default)();
35
+ }
36
+ exports.default = {
37
+ isWorkerRuntime,
38
+ postMessageToMaster,
39
+ subscribeToMasterMessages,
40
+ testImplementation,
41
+ };
@@ -0,0 +1,5 @@
1
+ import type { WorkerFunction, WorkerModule } from '../types/worker';
2
+ export { registerSerializer } from '../common';
3
+ export { Transfer } from '../transferable';
4
+ export declare const isWorkerRuntime: () => boolean;
5
+ export declare function expose(exposed: WorkerFunction | WorkerModule<any>): void;
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.isWorkerRuntime = exports.Transfer = exports.registerSerializer = void 0;
7
+ exports.expose = expose;
8
+ const is_observable_2_1_0_1 = __importDefault(require("is-observable-2-1-0"));
9
+ const common_1 = require("../common");
10
+ const transferable_1 = require("../transferable");
11
+ const messages_1 = require("../types/messages");
12
+ const implementation_1 = __importDefault(require("./implementation"));
13
+ var common_2 = require("../common");
14
+ Object.defineProperty(exports, "registerSerializer", { enumerable: true, get: function () { return common_2.registerSerializer; } });
15
+ var transferable_2 = require("../transferable");
16
+ Object.defineProperty(exports, "Transfer", { enumerable: true, get: function () { return transferable_2.Transfer; } });
17
+ exports.isWorkerRuntime = implementation_1.default.isWorkerRuntime;
18
+ let exposeCalled = false;
19
+ const activeSubscriptions = new Map();
20
+ const isMasterJobCancelMessage = (thing) => thing && thing.type === messages_1.MasterMessageType.cancel;
21
+ const isMasterJobRunMessage = (thing) => thing && thing.type === messages_1.MasterMessageType.run;
22
+ const isObservable = (thing) => (0, is_observable_2_1_0_1.default)(thing) || isZenObservable(thing);
23
+ function isZenObservable(thing) {
24
+ return thing && typeof thing === 'object' && typeof thing.subscribe === 'function';
25
+ }
26
+ function deconstructTransfer(thing) {
27
+ return (0, transferable_1.isTransferDescriptor)(thing) ? { payload: thing.send, transferables: thing.transferables } : { payload: thing, transferables: undefined };
28
+ }
29
+ function postFunctionInitMessage() {
30
+ const initMessage = {
31
+ exposed: { type: 'function' },
32
+ type: messages_1.WorkerMessageType.init,
33
+ };
34
+ implementation_1.default.postMessageToMaster(initMessage);
35
+ }
36
+ function postModuleInitMessage(methodNames) {
37
+ const initMessage = {
38
+ exposed: {
39
+ methods: methodNames,
40
+ type: 'module',
41
+ },
42
+ type: messages_1.WorkerMessageType.init,
43
+ };
44
+ implementation_1.default.postMessageToMaster(initMessage);
45
+ }
46
+ function postJobErrorMessage(uid, rawError) {
47
+ const { payload: error, transferables } = deconstructTransfer(rawError);
48
+ const errorMessage = {
49
+ error: (0, common_1.serialize)(error),
50
+ type: messages_1.WorkerMessageType.error,
51
+ uid,
52
+ };
53
+ implementation_1.default.postMessageToMaster(errorMessage, transferables);
54
+ }
55
+ function postJobResultMessage(uid, completed, resultValue) {
56
+ const { payload, transferables } = deconstructTransfer(resultValue);
57
+ const resultMessage = {
58
+ complete: completed ? true : undefined,
59
+ payload,
60
+ type: messages_1.WorkerMessageType.result,
61
+ uid,
62
+ };
63
+ implementation_1.default.postMessageToMaster(resultMessage, transferables);
64
+ }
65
+ function postJobStartMessage(uid, resultType) {
66
+ const startMessage = {
67
+ resultType,
68
+ type: messages_1.WorkerMessageType.running,
69
+ uid,
70
+ };
71
+ implementation_1.default.postMessageToMaster(startMessage);
72
+ }
73
+ function postUncaughtErrorMessage(error) {
74
+ try {
75
+ const errorMessage = {
76
+ error: (0, common_1.serialize)(error),
77
+ type: messages_1.WorkerMessageType.uncaughtError,
78
+ };
79
+ implementation_1.default.postMessageToMaster(errorMessage);
80
+ }
81
+ catch (subError) {
82
+ console.error('Not reporting uncaught error back to master thread as it ' + 'occured while reporting an uncaught error already.' + '\nLatest error:', subError, '\nOriginal error:', error);
83
+ }
84
+ }
85
+ async function runFunction(jobUID, fn, args) {
86
+ let syncResult;
87
+ try {
88
+ syncResult = fn(...args);
89
+ }
90
+ catch (error) {
91
+ return postJobErrorMessage(jobUID, error);
92
+ }
93
+ const resultType = isObservable(syncResult) ? 'observable' : 'promise';
94
+ postJobStartMessage(jobUID, resultType);
95
+ if (isObservable(syncResult)) {
96
+ const subscription = syncResult.subscribe(value => postJobResultMessage(jobUID, false, (0, common_1.serialize)(value)), (error) => {
97
+ postJobErrorMessage(jobUID, (0, common_1.serialize)(error));
98
+ activeSubscriptions.delete(jobUID);
99
+ }, () => {
100
+ postJobResultMessage(jobUID, true);
101
+ activeSubscriptions.delete(jobUID);
102
+ });
103
+ activeSubscriptions.set(jobUID, subscription);
104
+ }
105
+ else {
106
+ try {
107
+ const result = await syncResult;
108
+ postJobResultMessage(jobUID, true, (0, common_1.serialize)(result));
109
+ }
110
+ catch (error) {
111
+ postJobErrorMessage(jobUID, (0, common_1.serialize)(error));
112
+ }
113
+ }
114
+ }
115
+ function expose(exposed) {
116
+ if (!implementation_1.default.isWorkerRuntime()) {
117
+ throw new Error('expose() called in the master thread.');
118
+ }
119
+ if (exposeCalled) {
120
+ throw new Error('expose() called more than once. This is not possible. Pass an object to expose() if you want to expose multiple functions.');
121
+ }
122
+ exposeCalled = true;
123
+ if (typeof exposed === 'function') {
124
+ implementation_1.default.subscribeToMasterMessages((messageData) => {
125
+ if (isMasterJobRunMessage(messageData) && !messageData.method) {
126
+ runFunction(messageData.uid, exposed, messageData.args.map(common_1.deserialize));
127
+ }
128
+ });
129
+ postFunctionInitMessage();
130
+ }
131
+ else if (typeof exposed === 'object' && exposed) {
132
+ implementation_1.default.subscribeToMasterMessages((messageData) => {
133
+ if (isMasterJobRunMessage(messageData) && messageData.method) {
134
+ runFunction(messageData.uid, exposed[messageData.method], messageData.args.map(common_1.deserialize));
135
+ }
136
+ });
137
+ const methodNames = Object.keys(exposed).filter(key => typeof exposed[key] === 'function');
138
+ postModuleInitMessage(methodNames);
139
+ }
140
+ else {
141
+ throw new Error(`Invalid argument passed to expose(). Expected a function or an object, got: ${exposed}`);
142
+ }
143
+ implementation_1.default.subscribeToMasterMessages((messageData) => {
144
+ if (isMasterJobCancelMessage(messageData)) {
145
+ const jobUID = messageData.uid;
146
+ const subscription = activeSubscriptions.get(jobUID);
147
+ if (subscription) {
148
+ subscription.unsubscribe();
149
+ activeSubscriptions.delete(jobUID);
150
+ }
151
+ }
152
+ });
153
+ }
154
+ if (typeof globalThis !== 'undefined' && typeof self.addEventListener === 'function' && implementation_1.default.isWorkerRuntime()) {
155
+ self.addEventListener('error', (event) => {
156
+ setTimeout(() => postUncaughtErrorMessage(event.error || event), 250);
157
+ });
158
+ self.addEventListener('unhandledrejection', (event) => {
159
+ const error = event.reason;
160
+ if (error && typeof error.message === 'string') {
161
+ setTimeout(() => postUncaughtErrorMessage(error), 250);
162
+ }
163
+ });
164
+ }
165
+ if (typeof process !== 'undefined' && typeof process.on === 'function' && implementation_1.default.isWorkerRuntime()) {
166
+ process.on('uncaughtException', (error) => {
167
+ setTimeout(() => postUncaughtErrorMessage(error), 250);
168
+ });
169
+ process.on('unhandledRejection', (error) => {
170
+ if (error && typeof error.message === 'string') {
171
+ setTimeout(() => postUncaughtErrorMessage(error), 250);
172
+ }
173
+ });
174
+ }
@@ -0,0 +1,8 @@
1
+ type MessagePort = any;
2
+ interface WorkerThreadsModule {
3
+ MessagePort: typeof MessagePort;
4
+ isMainThread: boolean;
5
+ parentPort: MessagePort;
6
+ }
7
+ export default function getImplementation(): WorkerThreadsModule;
8
+ export {};
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = getImplementation;
4
+ let implementation;
5
+ function selectImplementation() {
6
+ return typeof __non_webpack_require__ === 'function' ? __non_webpack_require__('worker_threads') : eval('require')('worker_threads');
7
+ }
8
+ function getImplementation() {
9
+ if (!implementation) {
10
+ implementation = selectImplementation();
11
+ }
12
+ return implementation;
13
+ }
@@ -0,0 +1,35 @@
1
+ import {
2
+ typescriptConfig,
3
+ unicornConfig,
4
+ workspacesConfig,
5
+ rulesConfig,
6
+ importConfig,
7
+ } from '@xylabs/eslint-config-flat'
8
+
9
+ export default [
10
+ { ignores: ['.yarn', 'dist', '**/dist/**',
11
+ 'build', '**/build/**', 'node_modules/**', 'public', 'storybook-static', 'eslint.config.mjs',
12
+ 'rollup.config.js', 'test-tooling', 'test', 'types', 'worker.*', '*.mjs', '*.d.ts', '*.js'] },
13
+ unicornConfig,
14
+ workspacesConfig,
15
+ rulesConfig,
16
+ typescriptConfig,
17
+ importConfig,
18
+ {
19
+ rules: {
20
+ 'no-restricted-syntax': ['off'],
21
+ 'no-restricted-imports': [
22
+ 'warn',
23
+ {
24
+ paths: [
25
+ ...rulesConfig.rules['no-restricted-imports'][1].paths,
26
+ '@xyo-network/*',
27
+ 'lodash',
28
+ 'lodash-es',
29
+ '@xylabs/lodash',
30
+ ],
31
+ },
32
+ ],
33
+ },
34
+ },
35
+ ]