@xylabs/threads 4.7.1 → 4.7.3

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 (235) hide show
  1. package/dist/browser/master/implementation.browser.mjs +89 -0
  2. package/dist/browser/master/implementation.browser.mjs.map +1 -0
  3. package/dist/browser/master/index-browser.mjs +988 -0
  4. package/dist/browser/master/index-browser.mjs.map +1 -0
  5. package/dist/browser/worker/worker.browser.mjs +291 -0
  6. package/dist/browser/worker/worker.browser.mjs.map +1 -0
  7. package/dist/neutral/index.mjs +1022 -0
  8. package/dist/neutral/index.mjs.map +1 -0
  9. package/dist/neutral/master/implementation.mjs +264 -0
  10. package/dist/neutral/master/implementation.mjs.map +1 -0
  11. package/dist/neutral/master/pool.mjs +579 -0
  12. package/dist/neutral/master/pool.mjs.map +1 -0
  13. package/dist/neutral/master/register.mjs +162 -0
  14. package/dist/neutral/master/register.mjs.map +1 -0
  15. package/dist/neutral/master/spawn.mjs +412 -0
  16. package/dist/neutral/master/spawn.mjs.map +1 -0
  17. package/dist/neutral/master/thread.mjs +29 -0
  18. package/dist/neutral/master/thread.mjs.map +1 -0
  19. package/dist/neutral/observable-promise.mjs +132 -0
  20. package/dist/neutral/observable-promise.mjs.map +1 -0
  21. package/dist/neutral/observable.mjs +31 -0
  22. package/dist/neutral/observable.mjs.map +1 -0
  23. package/dist/node/master/implementation.node.mjs +154 -0
  24. package/dist/node/master/implementation.node.mjs.map +1 -0
  25. package/dist/node/master/index-node.mjs +988 -0
  26. package/dist/node/master/index-node.mjs.map +1 -0
  27. package/dist/node/worker/worker.node.mjs +304 -0
  28. package/dist/node/worker/worker.node.mjs.map +1 -0
  29. package/dist/{common.d.ts → types/common.d.ts} +5 -1
  30. package/dist/types/common.d.ts.map +1 -0
  31. package/dist/types/index.d.ts +9 -0
  32. package/dist/types/index.d.ts.map +1 -0
  33. package/dist/{master → types/master}/get-bundle-url.browser.d.ts +1 -0
  34. package/dist/types/master/get-bundle-url.browser.d.ts.map +1 -0
  35. package/dist/{master → types/master}/implementation.browser.d.ts +2 -1
  36. package/dist/types/master/implementation.browser.d.ts.map +1 -0
  37. package/dist/{master → types/master}/implementation.d.ts +4 -1
  38. package/dist/types/master/implementation.d.ts.map +1 -0
  39. package/dist/{master → types/master}/implementation.node.d.ts +2 -1
  40. package/dist/types/master/implementation.node.d.ts.map +1 -0
  41. package/dist/types/master/index-browser.d.ts +13 -0
  42. package/dist/types/master/index-browser.d.ts.map +1 -0
  43. package/dist/types/master/index-node.d.ts +13 -0
  44. package/dist/types/master/index-node.d.ts.map +1 -0
  45. package/dist/{master → types/master}/invocation-proxy.d.ts +2 -1
  46. package/dist/types/master/invocation-proxy.d.ts.map +1 -0
  47. package/dist/{master → types/master}/pool-types.d.ts +16 -1
  48. package/dist/types/master/pool-types.d.ts.map +1 -0
  49. package/dist/types/master/pool.d.ts +93 -0
  50. package/dist/types/master/pool.d.ts.map +1 -0
  51. package/dist/types/master/register.d.ts +2 -0
  52. package/dist/types/master/register.d.ts.map +1 -0
  53. package/dist/{master → types/master}/spawn.d.ts +12 -2
  54. package/dist/types/master/spawn.d.ts.map +1 -0
  55. package/dist/types/master/thread.d.ts +13 -0
  56. package/dist/types/master/thread.d.ts.map +1 -0
  57. package/dist/{observable-promise.d.ts → types/observable-promise.d.ts} +14 -0
  58. package/dist/types/observable-promise.d.ts.map +1 -0
  59. package/dist/types/observable.d.ts +21 -0
  60. package/dist/types/observable.d.ts.map +1 -0
  61. package/dist/{ponyfills.d.ts → types/ponyfills.d.ts} +1 -0
  62. package/dist/types/ponyfills.d.ts.map +1 -0
  63. package/dist/types/promise.d.ts +6 -0
  64. package/dist/types/promise.d.ts.map +1 -0
  65. package/dist/{serializers.d.ts → types/serializers.d.ts} +1 -0
  66. package/dist/types/serializers.d.ts.map +1 -0
  67. package/dist/{symbols.d.ts → types/symbols.d.ts} +1 -0
  68. package/dist/types/symbols.d.ts.map +1 -0
  69. package/{src/transferable.ts → dist/types/transferable.d.ts} +8 -33
  70. package/dist/types/transferable.d.ts.map +1 -0
  71. package/dist/types/{master.d.ts → types/master.d.ts} +17 -3
  72. package/dist/types/types/master.d.ts.map +1 -0
  73. package/dist/types/{messages.d.ts → types/messages.d.ts} +1 -0
  74. package/dist/types/types/messages.d.ts.map +1 -0
  75. package/dist/types/{worker.d.ts → types/worker.d.ts} +1 -0
  76. package/dist/types/types/worker.d.ts.map +1 -0
  77. package/dist/types/worker/WorkerGlobalScope.d.ts +6 -0
  78. package/dist/types/worker/WorkerGlobalScope.d.ts.map +1 -0
  79. package/dist/types/worker/expose.d.ts +4 -0
  80. package/dist/types/worker/expose.d.ts.map +1 -0
  81. package/dist/types/worker/worker.browser.d.ts +14 -0
  82. package/dist/types/worker/worker.browser.d.ts.map +1 -0
  83. package/dist/types/worker/worker.node.d.ts +25 -0
  84. package/dist/types/worker/worker.node.d.ts.map +1 -0
  85. package/package.json +55 -92
  86. package/dist/common.js +0 -16
  87. package/dist/esm/common.js +0 -16
  88. package/dist/esm/index.js +0 -26
  89. package/dist/esm/master/get-bundle-url.browser.js +0 -25
  90. package/dist/esm/master/implementation.browser.js +0 -65
  91. package/dist/esm/master/implementation.js +0 -43
  92. package/dist/esm/master/implementation.node.js +0 -205
  93. package/dist/esm/master/index.js +0 -14
  94. package/dist/esm/master/invocation-proxy.js +0 -121
  95. package/dist/esm/master/pool-types.js +0 -14
  96. package/dist/esm/master/pool.js +0 -262
  97. package/dist/esm/master/register.js +0 -11
  98. package/dist/esm/master/spawn.js +0 -114
  99. package/dist/esm/master/thread.js +0 -18
  100. package/dist/esm/observable-promise.js +0 -132
  101. package/dist/esm/observable.js +0 -33
  102. package/dist/esm/ponyfills.js +0 -20
  103. package/dist/esm/promise.js +0 -23
  104. package/dist/esm/serializers.js +0 -41
  105. package/dist/esm/symbols.js +0 -8
  106. package/dist/esm/transferable.js +0 -25
  107. package/dist/esm/types/master.js +0 -9
  108. package/dist/esm/types/messages.js +0 -16
  109. package/dist/esm/types/worker.js +0 -2
  110. package/dist/esm/worker/bundle-entry.js +0 -26
  111. package/dist/esm/worker/implementation.browser.js +0 -24
  112. package/dist/esm/worker/implementation.js +0 -19
  113. package/dist/esm/worker/implementation.tiny-worker.js +0 -37
  114. package/dist/esm/worker/implementation.worker_threads.js +0 -41
  115. package/dist/esm/worker/index.js +0 -174
  116. package/dist/esm/worker_threads.js +0 -13
  117. package/dist/index.d.ts +0 -7
  118. package/dist/index.js +0 -26
  119. package/dist/master/get-bundle-url.browser.js +0 -25
  120. package/dist/master/implementation.browser.js +0 -65
  121. package/dist/master/implementation.js +0 -43
  122. package/dist/master/implementation.node.js +0 -205
  123. package/dist/master/index.d.ts +0 -10
  124. package/dist/master/index.js +0 -14
  125. package/dist/master/invocation-proxy.js +0 -121
  126. package/dist/master/pool-types.js +0 -14
  127. package/dist/master/pool.d.ts +0 -50
  128. package/dist/master/pool.js +0 -262
  129. package/dist/master/register.d.ts +0 -1
  130. package/dist/master/register.js +0 -11
  131. package/dist/master/spawn.js +0 -114
  132. package/dist/master/thread.d.ts +0 -8
  133. package/dist/master/thread.js +0 -18
  134. package/dist/observable-promise.js +0 -132
  135. package/dist/observable.d.ts +0 -11
  136. package/dist/observable.js +0 -33
  137. package/dist/ponyfills.js +0 -20
  138. package/dist/promise.d.ts +0 -1
  139. package/dist/promise.js +0 -23
  140. package/dist/serializers.js +0 -41
  141. package/dist/symbols.js +0 -8
  142. package/dist/transferable.d.ts +0 -9
  143. package/dist/transferable.js +0 -25
  144. package/dist/types/master.js +0 -9
  145. package/dist/types/messages.js +0 -16
  146. package/dist/types/worker.js +0 -2
  147. package/dist/worker/bundle-entry.d.ts +0 -1
  148. package/dist/worker/bundle-entry.js +0 -26
  149. package/dist/worker/implementation.browser.d.ts +0 -6
  150. package/dist/worker/implementation.browser.js +0 -24
  151. package/dist/worker/implementation.d.ts +0 -3
  152. package/dist/worker/implementation.js +0 -19
  153. package/dist/worker/implementation.tiny-worker.d.ts +0 -6
  154. package/dist/worker/implementation.tiny-worker.js +0 -37
  155. package/dist/worker/implementation.worker_threads.d.ts +0 -8
  156. package/dist/worker/implementation.worker_threads.js +0 -41
  157. package/dist/worker/index.d.ts +0 -5
  158. package/dist/worker/index.js +0 -174
  159. package/dist/worker_threads.d.ts +0 -8
  160. package/dist/worker_threads.js +0 -13
  161. package/eslint.config.mjs +0 -35
  162. package/index.mjs +0 -10
  163. package/observable.d.ts +0 -2
  164. package/observable.js +0 -2
  165. package/observable.mjs +0 -4
  166. package/register.d.ts +0 -2
  167. package/register.js +0 -2
  168. package/register.mjs +0 -1
  169. package/rollup.config.js +0 -16
  170. package/src/common.ts +0 -19
  171. package/src/index.ts +0 -10
  172. package/src/master/get-bundle-url.browser.ts +0 -31
  173. package/src/master/implementation.browser.ts +0 -82
  174. package/src/master/implementation.node.ts +0 -285
  175. package/src/master/implementation.ts +0 -21
  176. package/src/master/index.ts +0 -19
  177. package/src/master/invocation-proxy.ts +0 -151
  178. package/src/master/pool-types.ts +0 -83
  179. package/src/master/pool.ts +0 -399
  180. package/src/master/register.ts +0 -10
  181. package/src/master/spawn.ts +0 -172
  182. package/src/master/thread.ts +0 -29
  183. package/src/observable-promise.ts +0 -183
  184. package/src/observable.ts +0 -44
  185. package/src/ponyfills.ts +0 -31
  186. package/src/promise.ts +0 -26
  187. package/src/serializers.ts +0 -68
  188. package/src/symbols.ts +0 -5
  189. package/src/types/master.ts +0 -132
  190. package/src/types/messages.ts +0 -72
  191. package/src/types/worker.ts +0 -14
  192. package/src/worker/bundle-entry.ts +0 -10
  193. package/src/worker/implementation.browser.ts +0 -40
  194. package/src/worker/implementation.tiny-worker.ts +0 -55
  195. package/src/worker/implementation.ts +0 -23
  196. package/src/worker/implementation.worker_threads.ts +0 -50
  197. package/src/worker/index.ts +0 -230
  198. package/src/worker_threads.ts +0 -27
  199. package/test/lib/index.ts +0 -1
  200. package/test/lib/serialization.ts +0 -38
  201. package/test/observable-promise.test.ts +0 -205
  202. package/test/observable.test.ts +0 -87
  203. package/test/pool.test.ts +0 -183
  204. package/test/serialization.test.ts +0 -23
  205. package/test/spawn.chromium.mocha.ts +0 -53
  206. package/test/spawn.test.ts +0 -87
  207. package/test/streaming.test.ts +0 -29
  208. package/test/transferables.test.ts +0 -71
  209. package/test/workers/arraybuffer-xor.ts +0 -10
  210. package/test/workers/count-to-five.ts +0 -12
  211. package/test/workers/counter.ts +0 -19
  212. package/test/workers/faulty-function.ts +0 -5
  213. package/test/workers/hello-world.ts +0 -5
  214. package/test/workers/increment.ts +0 -8
  215. package/test/workers/minmax.ts +0 -25
  216. package/test/workers/serialization.ts +0 -13
  217. package/test/workers/top-level-throw.ts +0 -1
  218. package/test-tooling/rollup/app.js +0 -21
  219. package/test-tooling/rollup/rollup.config.ts +0 -14
  220. package/test-tooling/rollup/worker.js +0 -7
  221. package/test-tooling/tsconfig/minimal.ts +0 -12
  222. package/test-tooling/webpack/addition-worker.ts +0 -9
  223. package/test-tooling/webpack/app-with-inlined-worker.ts +0 -28
  224. package/test-tooling/webpack/app.ts +0 -61
  225. package/test-tooling/webpack/pool-worker.ts +0 -5
  226. package/test-tooling/webpack/raw-loader.d.ts +0 -4
  227. package/test-tooling/webpack/webpack.chromium.mocha.ts +0 -21
  228. package/test-tooling/webpack/webpack.node.config.js +0 -29
  229. package/test-tooling/webpack/webpack.web.config.js +0 -28
  230. package/types/is-observable.d.ts +0 -7
  231. package/types/tiny-worker.d.ts +0 -4
  232. package/types/webworker.d.ts +0 -9
  233. package/worker.d.ts +0 -2
  234. package/worker.js +0 -2
  235. package/worker.mjs +0 -6
@@ -0,0 +1,162 @@
1
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
+ }) : x)(function(x) {
4
+ if (typeof require !== "undefined") return require.apply(this, arguments);
5
+ throw Error('Dynamic require of "' + x + '" is not supported');
6
+ });
7
+
8
+ // src/master/implementation.node.ts
9
+ import { EventEmitter } from "node:events";
10
+ import { cpus } from "node:os";
11
+ import path from "node:path";
12
+ import { cwd } from "node:process";
13
+ import { Worker as NativeWorker } from "node:worker_threads";
14
+ var defaultPoolSize = cpus().length;
15
+ function resolveScriptPath(scriptPath, baseURL) {
16
+ const makeAbsolute = (filePath) => {
17
+ return path.isAbsolute(filePath) ? filePath : path.join(baseURL ?? cwd(), filePath);
18
+ };
19
+ const absolutePath = makeAbsolute(scriptPath);
20
+ return absolutePath;
21
+ }
22
+ function initWorkerThreadsWorker() {
23
+ let allWorkers = [];
24
+ class Worker2 extends NativeWorker {
25
+ mappedEventListeners;
26
+ constructor(scriptPath, options) {
27
+ const resolvedScriptPath = options && options.fromSource ? null : resolveScriptPath(scriptPath, (options ?? {})._baseURL);
28
+ if (resolvedScriptPath) {
29
+ super(resolvedScriptPath, options);
30
+ } else {
31
+ const sourceCode = scriptPath;
32
+ super(sourceCode, { ...options, eval: true });
33
+ }
34
+ this.mappedEventListeners = /* @__PURE__ */ new WeakMap();
35
+ allWorkers.push(this);
36
+ }
37
+ addEventListener(eventName, rawListener) {
38
+ const listener = (message) => {
39
+ rawListener({ data: message });
40
+ };
41
+ this.mappedEventListeners.set(rawListener, listener);
42
+ this.on(eventName, listener);
43
+ }
44
+ removeEventListener(eventName, rawListener) {
45
+ const listener = this.mappedEventListeners.get(rawListener) || rawListener;
46
+ this.off(eventName, listener);
47
+ }
48
+ }
49
+ const terminateWorkersAndMaster = () => {
50
+ Promise.all(allWorkers.map((worker) => worker.terminate())).then(
51
+ () => process.exit(0),
52
+ () => process.exit(1)
53
+ );
54
+ allWorkers = [];
55
+ };
56
+ process.on("SIGINT", () => terminateWorkersAndMaster());
57
+ process.on("SIGTERM", () => terminateWorkersAndMaster());
58
+ class BlobWorker2 extends Worker2 {
59
+ constructor(blob, options) {
60
+ super(Buffer.from(blob).toString("utf-8"), { ...options, fromSource: true });
61
+ }
62
+ static fromText(source, options) {
63
+ return new Worker2(source, { ...options, fromSource: true });
64
+ }
65
+ }
66
+ return {
67
+ blob: BlobWorker2,
68
+ default: Worker2
69
+ };
70
+ }
71
+ function initTinyWorker() {
72
+ const TinyWorker = __require("tiny-worker");
73
+ let allWorkers = [];
74
+ class Worker2 extends TinyWorker {
75
+ emitter;
76
+ constructor(scriptPath, options) {
77
+ const resolvedScriptPath = options && options.fromSource ? null : process.platform === "win32" ? `file:///${resolveScriptPath(scriptPath).replaceAll("\\", "/")}` : resolveScriptPath(scriptPath);
78
+ if (resolvedScriptPath) {
79
+ super(resolvedScriptPath, [], { esm: true });
80
+ } else {
81
+ const sourceCode = scriptPath;
82
+ super(new Function(sourceCode), [], { esm: true });
83
+ }
84
+ allWorkers.push(this);
85
+ this.emitter = new EventEmitter();
86
+ this.onerror = (error) => this.emitter.emit("error", error);
87
+ this.onmessage = (message) => this.emitter.emit("message", message);
88
+ }
89
+ addEventListener(eventName, listener) {
90
+ this.emitter.addListener(eventName, listener);
91
+ }
92
+ removeEventListener(eventName, listener) {
93
+ this.emitter.removeListener(eventName, listener);
94
+ }
95
+ terminate() {
96
+ allWorkers = allWorkers.filter((worker) => worker !== this);
97
+ return super.terminate();
98
+ }
99
+ }
100
+ const terminateWorkersAndMaster = () => {
101
+ Promise.all(allWorkers.map((worker) => worker.terminate())).then(
102
+ () => process.exit(0),
103
+ () => process.exit(1)
104
+ );
105
+ allWorkers = [];
106
+ };
107
+ process.on("SIGINT", () => terminateWorkersAndMaster());
108
+ process.on("SIGTERM", () => terminateWorkersAndMaster());
109
+ class BlobWorker2 extends Worker2 {
110
+ constructor(blob, options) {
111
+ super(Buffer.from(blob).toString("utf-8"), { ...options, fromSource: true });
112
+ }
113
+ static fromText(source, options) {
114
+ return new Worker2(source, { ...options, fromSource: true });
115
+ }
116
+ }
117
+ return {
118
+ blob: BlobWorker2,
119
+ default: Worker2
120
+ };
121
+ }
122
+ var implementation;
123
+ var isTinyWorker;
124
+ function selectWorkerImplementation() {
125
+ try {
126
+ isTinyWorker = false;
127
+ return initWorkerThreadsWorker();
128
+ } catch (ex) {
129
+ console.error(ex);
130
+ console.debug("Node worker_threads not available. Trying to fall back to tiny-worker polyfill...");
131
+ isTinyWorker = true;
132
+ return initTinyWorker();
133
+ }
134
+ }
135
+ function getWorkerImplementation() {
136
+ if (!implementation) {
137
+ implementation = selectWorkerImplementation();
138
+ }
139
+ return implementation;
140
+ }
141
+ function isWorkerRuntime() {
142
+ if (isTinyWorker) {
143
+ return globalThis !== void 0 && self["postMessage"] ? true : false;
144
+ } else {
145
+ const isMainThread = typeof __non_webpack_require__ === "function" ? __non_webpack_require__("worker_threads").isMainThread : eval("require")("worker_threads").isMainThread;
146
+ return !isMainThread;
147
+ }
148
+ }
149
+
150
+ // src/master/index-node.ts
151
+ var BlobWorker = getWorkerImplementation().blob;
152
+ var Worker = getWorkerImplementation().default;
153
+
154
+ // src/master/register.ts
155
+ if (typeof globalThis !== "undefined") {
156
+ ;
157
+ globalThis.Worker = Worker;
158
+ } else if (window !== void 0) {
159
+ ;
160
+ window.Worker = Worker;
161
+ }
162
+ //# sourceMappingURL=register.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/master/implementation.node.ts","../../../src/master/index-node.ts","../../../src/master/register.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-require-imports */\n\n/* eslint-disable unicorn/prefer-add-event-listener */\n/* eslint-disable unicorn/prefer-event-target */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable unicorn/text-encoding-identifier-case */\n\nimport { EventEmitter } from 'node:events'\nimport { cpus } from 'node:os'\nimport path from 'node:path'\nimport { cwd } from 'node:process'\nimport { Worker as NativeWorker } from 'node:worker_threads'\n\nimport type {\n ImplementationExport, ThreadsWorkerOptions, WorkerImplementation,\n// eslint-disable-next-line import-x/no-internal-modules\n} from '../types/master.ts'\n\ndeclare const __non_webpack_require__: typeof require\n\ntype WorkerEventName = 'error' | 'message'\n\nexport const defaultPoolSize = cpus().length\n\nfunction resolveScriptPath(scriptPath: string, baseURL?: string | undefined) {\n const makeAbsolute = (filePath: string) => {\n return path.isAbsolute(filePath) ? filePath : path.join(baseURL ?? cwd(), filePath)\n }\n\n const absolutePath = makeAbsolute(scriptPath)\n return absolutePath\n}\n\nfunction initWorkerThreadsWorker(): ImplementationExport {\n let allWorkers: Array<NativeWorker> = []\n\n class Worker extends NativeWorker {\n private mappedEventListeners: WeakMap<EventListener, EventListener>\n\n constructor(scriptPath: string, options?: ThreadsWorkerOptions & { fromSource: boolean }) {\n const resolvedScriptPath = options && options.fromSource ? null : resolveScriptPath(scriptPath, (options ?? {})._baseURL)\n if (resolvedScriptPath) {\n super(resolvedScriptPath, options)\n } else {\n // `options.fromSource` is true\n const sourceCode = scriptPath\n super(sourceCode, { ...options, eval: true })\n }\n\n this.mappedEventListeners = new WeakMap()\n allWorkers.push(this)\n }\n\n addEventListener(eventName: string, rawListener: EventListener) {\n const listener = (message: any) => {\n rawListener({ data: message } as any)\n }\n this.mappedEventListeners.set(rawListener, listener)\n this.on(eventName, listener)\n }\n\n removeEventListener(eventName: string, rawListener: EventListener) {\n const listener = this.mappedEventListeners.get(rawListener) || rawListener\n this.off(eventName, listener)\n }\n }\n\n const terminateWorkersAndMaster = () => {\n // we should terminate all workers and then gracefully shutdown self process\n Promise.all(allWorkers.map(worker => worker.terminate())).then(\n () => process.exit(0),\n () => process.exit(1),\n )\n allWorkers = []\n }\n\n // Take care to not leave orphaned processes behind. See #147.\n process.on('SIGINT', () => terminateWorkersAndMaster())\n process.on('SIGTERM', () => terminateWorkersAndMaster())\n\n class BlobWorker extends Worker {\n constructor(blob: Uint8Array, options?: ThreadsWorkerOptions) {\n super(Buffer.from(blob).toString('utf-8'), { ...options, fromSource: true })\n }\n\n static fromText(source: string, options?: ThreadsWorkerOptions): WorkerImplementation {\n return new Worker(source, { ...options, fromSource: true }) as any\n }\n }\n\n return {\n blob: BlobWorker as any,\n default: Worker as any,\n }\n}\n\nfunction initTinyWorker(): ImplementationExport {\n const TinyWorker = require('tiny-worker')\n\n let allWorkers: Array<typeof TinyWorker> = []\n\n class Worker extends TinyWorker {\n private emitter: EventEmitter\n\n constructor(scriptPath: string, options?: ThreadsWorkerOptions & { fromSource?: boolean }) {\n // Need to apply a work-around for Windows or it will choke upon the absolute path\n // (`Error [ERR_INVALID_PROTOCOL]: Protocol 'c:' not supported`)\n const resolvedScriptPath\n = options && options.fromSource\n ? null\n : process.platform === 'win32'\n ? `file:///${resolveScriptPath(scriptPath).replaceAll('\\\\', '/')}`\n : resolveScriptPath(scriptPath)\n\n if (resolvedScriptPath) {\n super(resolvedScriptPath, [], { esm: true })\n } else {\n // `options.fromSource` is true\n const sourceCode = scriptPath\n super(new Function(sourceCode), [], { esm: true })\n }\n\n allWorkers.push(this)\n\n this.emitter = new EventEmitter()\n this.onerror = (error: Error) => this.emitter.emit('error', error)\n this.onmessage = (message: MessageEvent) => this.emitter.emit('message', message)\n }\n\n addEventListener(eventName: WorkerEventName, listener: EventListener) {\n this.emitter.addListener(eventName, listener)\n }\n\n removeEventListener(eventName: WorkerEventName, listener: EventListener) {\n this.emitter.removeListener(eventName, listener)\n }\n\n terminate() {\n allWorkers = allWorkers.filter(worker => worker !== this)\n return super.terminate()\n }\n }\n\n const terminateWorkersAndMaster = () => {\n // we should terminate all workers and then gracefully shutdown self process\n Promise.all(allWorkers.map(worker => worker.terminate())).then(\n () => process.exit(0),\n () => process.exit(1),\n )\n allWorkers = []\n }\n\n // Take care to not leave orphaned processes behind\n // See <https://github.com/avoidwork/tiny-worker#faq>\n process.on('SIGINT', () => terminateWorkersAndMaster())\n process.on('SIGTERM', () => terminateWorkersAndMaster())\n\n class BlobWorker extends Worker {\n constructor(blob: Uint8Array, options?: ThreadsWorkerOptions) {\n super(Buffer.from(blob).toString('utf-8'), { ...options, fromSource: true })\n }\n\n static fromText(source: string, options?: ThreadsWorkerOptions): WorkerImplementation {\n return new Worker(source, { ...options, fromSource: true }) as any\n }\n }\n\n return {\n blob: BlobWorker as any,\n default: Worker as any,\n }\n}\n\nlet implementation: ImplementationExport\nlet isTinyWorker: boolean\n\nfunction selectWorkerImplementation(): ImplementationExport {\n try {\n isTinyWorker = false\n return initWorkerThreadsWorker()\n } catch (ex) {\n console.error(ex)\n // tslint:disable-next-line no-console\n console.debug('Node worker_threads not available. Trying to fall back to tiny-worker polyfill...')\n isTinyWorker = true\n return initTinyWorker()\n }\n}\n\nexport function getWorkerImplementation(): ImplementationExport {\n if (!implementation) {\n implementation = selectWorkerImplementation()\n }\n return implementation\n}\n\nexport function isWorkerRuntime() {\n if (isTinyWorker) {\n return globalThis !== undefined && self['postMessage'] ? true : false\n } else {\n // Webpack hack\n const isMainThread\n = typeof __non_webpack_require__ === 'function'\n ? __non_webpack_require__('worker_threads').isMainThread\n : eval('require')('worker_threads').isMainThread\n return !isMainThread\n }\n}\n","/* eslint-disable import-x/no-internal-modules */\nimport type { BlobWorker as BlobWorkerClass, Worker as WorkerType } from '../types/master.ts'\nimport * as NodeImplementation from './implementation.node.ts'\n\nexport type { FunctionThread, ModuleThread } from '../types/master.ts'\nexport { Pool } from './pool.ts'\nexport { spawn } from './spawn.ts'\nexport { Thread } from './thread.ts'\n\nexport type BlobWorker = typeof BlobWorkerClass\nexport type Worker = WorkerType\n\n/** Separate class to spawn workers from source code blobs or strings. */\nexport const BlobWorker = NodeImplementation.getWorkerImplementation().blob\n\n/** Worker implementation. Either web worker or a node.js Worker class. */\nexport const Worker = NodeImplementation.getWorkerImplementation().default\n\nexport { isWorkerRuntime } from './implementation.ts'\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Worker as WorkerImplementation } from './index-node.ts'\n\ndeclare const window: any\n\nif (typeof globalThis !== 'undefined') {\n ;(globalThis as any).Worker = WorkerImplementation\n} else if (window !== undefined) {\n ;(window as any).Worker = WorkerImplementation\n}\n"],"mappings":"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","names":["Worker","BlobWorker"]}
@@ -0,0 +1,412 @@
1
+ // src/master/spawn.ts
2
+ import DebugLogger2 from "debug";
3
+ import { Observable as Observable3 } from "observable-fns";
4
+
5
+ // src/serializers.ts
6
+ var DefaultErrorSerializer = {
7
+ deserialize(message) {
8
+ return Object.assign(new Error(message.message), {
9
+ name: message.name,
10
+ stack: message.stack
11
+ });
12
+ },
13
+ serialize(error) {
14
+ return {
15
+ __error_marker: "$$error",
16
+ message: error.message,
17
+ name: error.name,
18
+ stack: error.stack
19
+ };
20
+ }
21
+ };
22
+ var isSerializedError = (thing) => thing && typeof thing === "object" && "__error_marker" in thing && thing.__error_marker === "$$error";
23
+ var DefaultSerializer = {
24
+ deserialize(message) {
25
+ return isSerializedError(message) ? DefaultErrorSerializer.deserialize(message) : message;
26
+ },
27
+ serialize(input) {
28
+ return input instanceof Error ? DefaultErrorSerializer.serialize(input) : input;
29
+ }
30
+ };
31
+
32
+ // src/common.ts
33
+ globalThis.registeredSerializer = globalThis.registeredSerializer ?? DefaultSerializer;
34
+ function deserialize(message) {
35
+ return globalThis.registeredSerializer.deserialize(message);
36
+ }
37
+ function serialize(input) {
38
+ return globalThis.registeredSerializer.serialize(input);
39
+ }
40
+
41
+ // src/promise.ts
42
+ var doNothing = () => void 0;
43
+ function createPromiseWithResolver() {
44
+ let alreadyResolved = false;
45
+ let resolvedTo;
46
+ let resolver = doNothing;
47
+ const promise = new Promise((resolve) => {
48
+ if (alreadyResolved) {
49
+ resolve(resolvedTo);
50
+ } else {
51
+ resolver = resolve;
52
+ }
53
+ });
54
+ const exposedResolver = (value) => {
55
+ alreadyResolved = true;
56
+ resolvedTo = value;
57
+ resolver(resolvedTo);
58
+ };
59
+ return [promise, exposedResolver];
60
+ }
61
+
62
+ // src/symbols.ts
63
+ var $errors = Symbol("thread.errors");
64
+ var $events = Symbol("thread.events");
65
+ var $terminate = Symbol("thread.terminate");
66
+ var $transferable = Symbol("thread.transferable");
67
+ var $worker = Symbol("thread.worker");
68
+
69
+ // src/master/invocation-proxy.ts
70
+ import DebugLogger from "debug";
71
+ import { multicast, Observable as Observable2 } from "observable-fns";
72
+
73
+ // src/observable-promise.ts
74
+ import { Observable } from "observable-fns";
75
+ var doNothing2 = () => {
76
+ };
77
+ var returnInput = (input) => input;
78
+ var runDeferred = (fn) => Promise.resolve().then(fn);
79
+ function fail(error) {
80
+ throw error;
81
+ }
82
+ function isThenable(thing) {
83
+ return thing && typeof thing.then === "function";
84
+ }
85
+ var ObservablePromise = class _ObservablePromise extends Observable {
86
+ [Symbol.toStringTag] = "[object ObservablePromise]";
87
+ initHasRun = false;
88
+ fulfillmentCallbacks = [];
89
+ rejectionCallbacks = [];
90
+ firstValue;
91
+ firstValueSet = false;
92
+ rejection;
93
+ state = "pending";
94
+ constructor(init) {
95
+ super((originalObserver) => {
96
+ const self = this;
97
+ const observer = {
98
+ ...originalObserver,
99
+ complete() {
100
+ originalObserver.complete();
101
+ self.onCompletion();
102
+ },
103
+ error(error) {
104
+ originalObserver.error(error);
105
+ self.onError(error);
106
+ },
107
+ next(value) {
108
+ originalObserver.next(value);
109
+ self.onNext(value);
110
+ }
111
+ };
112
+ try {
113
+ this.initHasRun = true;
114
+ return init(observer);
115
+ } catch (error) {
116
+ observer.error(error);
117
+ }
118
+ });
119
+ }
120
+ onNext(value) {
121
+ if (!this.firstValueSet) {
122
+ this.firstValue = value;
123
+ this.firstValueSet = true;
124
+ }
125
+ }
126
+ onError(error) {
127
+ this.state = "rejected";
128
+ this.rejection = error;
129
+ for (const onRejected of this.rejectionCallbacks) {
130
+ runDeferred(() => onRejected(error));
131
+ }
132
+ }
133
+ onCompletion() {
134
+ this.state = "fulfilled";
135
+ for (const onFulfilled of this.fulfillmentCallbacks) {
136
+ runDeferred(() => onFulfilled(this.firstValue));
137
+ }
138
+ }
139
+ then(onFulfilledRaw, onRejectedRaw) {
140
+ const onFulfilled = onFulfilledRaw || returnInput;
141
+ const onRejected = onRejectedRaw || fail;
142
+ let onRejectedCalled = false;
143
+ return new Promise((resolve, reject) => {
144
+ const rejectionCallback = (error) => {
145
+ if (onRejectedCalled) return;
146
+ onRejectedCalled = true;
147
+ try {
148
+ resolve(onRejected(error));
149
+ } catch (anotherError) {
150
+ reject(anotherError);
151
+ }
152
+ };
153
+ const fulfillmentCallback = (value) => {
154
+ try {
155
+ resolve(onFulfilled(value));
156
+ } catch (ex) {
157
+ const error = ex;
158
+ rejectionCallback(error);
159
+ }
160
+ };
161
+ if (!this.initHasRun) {
162
+ this.subscribe({ error: rejectionCallback });
163
+ }
164
+ if (this.state === "fulfilled") {
165
+ return resolve(onFulfilled(this.firstValue));
166
+ }
167
+ if (this.state === "rejected") {
168
+ onRejectedCalled = true;
169
+ return resolve(onRejected(this.rejection));
170
+ }
171
+ this.fulfillmentCallbacks.push(fulfillmentCallback);
172
+ this.rejectionCallbacks.push(rejectionCallback);
173
+ });
174
+ }
175
+ catch(onRejected) {
176
+ return this.then(void 0, onRejected);
177
+ }
178
+ finally(onCompleted) {
179
+ const handler = onCompleted || doNothing2;
180
+ return this.then(
181
+ (value) => {
182
+ handler();
183
+ return value;
184
+ },
185
+ () => handler()
186
+ );
187
+ }
188
+ static from(thing) {
189
+ return isThenable(thing) ? new _ObservablePromise((observer) => {
190
+ const onFulfilled = (value) => {
191
+ observer.next(value);
192
+ observer.complete();
193
+ };
194
+ const onRejected = (error) => {
195
+ observer.error(error);
196
+ };
197
+ thing.then(onFulfilled, onRejected);
198
+ }) : super.from(thing);
199
+ }
200
+ };
201
+
202
+ // src/transferable.ts
203
+ function isTransferDescriptor(thing) {
204
+ return thing && typeof thing === "object" && thing[$transferable];
205
+ }
206
+
207
+ // src/master/invocation-proxy.ts
208
+ var debugMessages = DebugLogger("threads:master:messages");
209
+ var nextJobUID = 1;
210
+ var dedupe = (array) => [...new Set(array)];
211
+ var isJobErrorMessage = (data) => data && data.type === "error" /* error */;
212
+ var isJobResultMessage = (data) => data && data.type === "result" /* result */;
213
+ var isJobStartMessage = (data) => data && data.type === "running" /* running */;
214
+ function createObservableForJob(worker, jobUID) {
215
+ return new Observable2((observer) => {
216
+ let asyncType;
217
+ const messageHandler = (event) => {
218
+ debugMessages("Message from worker:", event.data);
219
+ if (!event.data || event.data.uid !== jobUID) return;
220
+ if (isJobStartMessage(event.data)) {
221
+ asyncType = event.data.resultType;
222
+ } else if (isJobResultMessage(event.data)) {
223
+ if (asyncType === "promise") {
224
+ if (event.data.payload !== void 0) {
225
+ observer.next(deserialize(event.data.payload));
226
+ }
227
+ observer.complete();
228
+ worker.removeEventListener("message", messageHandler);
229
+ } else {
230
+ if (event.data.payload) {
231
+ observer.next(deserialize(event.data.payload));
232
+ }
233
+ if (event.data.complete) {
234
+ observer.complete();
235
+ worker.removeEventListener("message", messageHandler);
236
+ }
237
+ }
238
+ } else if (isJobErrorMessage(event.data)) {
239
+ const error = deserialize(event.data.error);
240
+ if (asyncType === "promise" || !asyncType) {
241
+ observer.error(error);
242
+ } else {
243
+ observer.error(error);
244
+ }
245
+ worker.removeEventListener("message", messageHandler);
246
+ }
247
+ };
248
+ worker.addEventListener("message", messageHandler);
249
+ return () => {
250
+ if (asyncType === "observable" || !asyncType) {
251
+ const cancelMessage = {
252
+ type: "cancel" /* cancel */,
253
+ uid: jobUID
254
+ };
255
+ worker.postMessage(cancelMessage);
256
+ }
257
+ worker.removeEventListener("message", messageHandler);
258
+ };
259
+ });
260
+ }
261
+ function prepareArguments(rawArgs) {
262
+ if (rawArgs.length === 0) {
263
+ return {
264
+ args: [],
265
+ transferables: []
266
+ };
267
+ }
268
+ const args = [];
269
+ const transferables = [];
270
+ for (const arg of rawArgs) {
271
+ if (isTransferDescriptor(arg)) {
272
+ args.push(serialize(arg.send));
273
+ transferables.push(...arg.transferables);
274
+ } else {
275
+ args.push(serialize(arg));
276
+ }
277
+ }
278
+ return {
279
+ args,
280
+ transferables: transferables.length === 0 ? transferables : dedupe(transferables)
281
+ };
282
+ }
283
+ function createProxyFunction(worker, method) {
284
+ return (...rawArgs) => {
285
+ const uid = nextJobUID++;
286
+ const { args, transferables } = prepareArguments(rawArgs);
287
+ const runMessage = {
288
+ args,
289
+ method,
290
+ type: "run" /* run */,
291
+ uid
292
+ };
293
+ debugMessages("Sending command to run function to worker:", runMessage);
294
+ try {
295
+ worker.postMessage(runMessage, transferables);
296
+ } catch (error) {
297
+ return ObservablePromise.from(Promise.reject(error));
298
+ }
299
+ return ObservablePromise.from(multicast(createObservableForJob(worker, uid)));
300
+ };
301
+ }
302
+ function createProxyModule(worker, methodNames) {
303
+ const proxy = {};
304
+ for (const methodName of methodNames) {
305
+ proxy[methodName] = createProxyFunction(worker, methodName);
306
+ }
307
+ return proxy;
308
+ }
309
+
310
+ // src/master/spawn.ts
311
+ var debugMessages2 = DebugLogger2("threads:master:messages");
312
+ var debugSpawn = DebugLogger2("threads:master:spawn");
313
+ var debugThreadUtils = DebugLogger2("threads:master:thread-utils");
314
+ var isInitMessage = (data) => data && data.type === "init";
315
+ var isUncaughtErrorMessage = (data) => data && data.type === "uncaughtError";
316
+ var initMessageTimeout = typeof process !== "undefined" && process.env !== void 0 && process.env.THREADS_WORKER_INIT_TIMEOUT ? Number.parseInt(process.env.THREADS_WORKER_INIT_TIMEOUT, 10) : 1e4;
317
+ async function withTimeout(promise, timeoutInMs, errorMessage) {
318
+ let timeoutHandle;
319
+ const timeout = new Promise((resolve, reject) => {
320
+ timeoutHandle = setTimeout(() => reject(new Error(errorMessage)), timeoutInMs);
321
+ });
322
+ const result = await Promise.race([promise, timeout]);
323
+ clearTimeout(timeoutHandle);
324
+ return result;
325
+ }
326
+ function receiveInitMessage(worker) {
327
+ return new Promise((resolve, reject) => {
328
+ const messageHandler = (event) => {
329
+ debugMessages2("Message from worker before finishing initialization:", event.data);
330
+ if (isInitMessage(event.data)) {
331
+ worker.removeEventListener("message", messageHandler);
332
+ resolve(event.data);
333
+ } else if (isUncaughtErrorMessage(event.data)) {
334
+ worker.removeEventListener("message", messageHandler);
335
+ reject(deserialize(event.data.error));
336
+ }
337
+ };
338
+ worker.addEventListener("message", messageHandler);
339
+ });
340
+ }
341
+ function createEventObservable(worker, workerTermination) {
342
+ return new Observable3((observer) => {
343
+ const messageHandler = (messageEvent) => {
344
+ const workerEvent = {
345
+ data: messageEvent.data,
346
+ type: "message" /* message */
347
+ };
348
+ observer.next(workerEvent);
349
+ };
350
+ const rejectionHandler = (errorEvent) => {
351
+ debugThreadUtils("Unhandled promise rejection event in thread:", errorEvent);
352
+ const workerEvent = {
353
+ error: new Error(errorEvent.reason),
354
+ type: "internalError" /* internalError */
355
+ };
356
+ observer.next(workerEvent);
357
+ };
358
+ worker.addEventListener("message", messageHandler);
359
+ worker.addEventListener("unhandledrejection", rejectionHandler);
360
+ workerTermination.then(() => {
361
+ const terminationEvent = { type: "termination" /* termination */ };
362
+ worker.removeEventListener("message", messageHandler);
363
+ worker.removeEventListener("unhandledrejection", rejectionHandler);
364
+ observer.next(terminationEvent);
365
+ observer.complete();
366
+ });
367
+ });
368
+ }
369
+ function createTerminator(worker) {
370
+ const [termination, resolver] = createPromiseWithResolver();
371
+ const terminate = async () => {
372
+ debugThreadUtils("Terminating worker");
373
+ await worker.terminate();
374
+ resolver();
375
+ };
376
+ return { terminate, termination };
377
+ }
378
+ function setPrivateThreadProps(raw, worker, workerEvents, terminate) {
379
+ const workerErrors = workerEvents.filter((event) => event.type === "internalError" /* internalError */).map((errorEvent) => errorEvent.error);
380
+ return Object.assign(raw, {
381
+ [$errors]: workerErrors,
382
+ [$events]: workerEvents,
383
+ [$terminate]: terminate,
384
+ [$worker]: worker
385
+ });
386
+ }
387
+ async function spawn(worker, options) {
388
+ debugSpawn("Initializing new thread");
389
+ const timeout = options && options.timeout ? options.timeout : initMessageTimeout;
390
+ const initMessage = await withTimeout(
391
+ receiveInitMessage(worker),
392
+ timeout,
393
+ `Timeout: Did not receive an init message from worker after ${timeout}ms. Make sure the worker calls expose().`
394
+ );
395
+ const exposed = initMessage.exposed;
396
+ const { termination, terminate } = createTerminator(worker);
397
+ const events = createEventObservable(worker, termination);
398
+ if (exposed.type === "function") {
399
+ const proxy = createProxyFunction(worker);
400
+ return setPrivateThreadProps(proxy, worker, events, terminate);
401
+ } else if (exposed.type === "module") {
402
+ const proxy = createProxyModule(worker, exposed.methods);
403
+ return setPrivateThreadProps(proxy, worker, events, terminate);
404
+ } else {
405
+ const type = exposed.type;
406
+ throw new Error(`Worker init message states unexpected type of expose(): ${type}`);
407
+ }
408
+ }
409
+ export {
410
+ spawn
411
+ };
412
+ //# sourceMappingURL=spawn.mjs.map