@xylabs/threads 4.6.4 → 4.7.0

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 (227) 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/worker/worker.browser.mjs +291 -0
  4. package/dist/browser/worker/worker.browser.mjs.map +1 -0
  5. package/dist/neutral/index.mjs +1022 -0
  6. package/dist/neutral/index.mjs.map +1 -0
  7. package/dist/neutral/master/implementation.mjs +264 -0
  8. package/dist/neutral/master/implementation.mjs.map +1 -0
  9. package/dist/neutral/master/index.mjs +988 -0
  10. package/dist/neutral/master/index.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 +272 -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/worker/worker.node.mjs +304 -0
  26. package/dist/node/worker/worker.node.mjs.map +1 -0
  27. package/dist/{common.d.ts → types/common.d.ts} +5 -1
  28. package/dist/types/common.d.ts.map +1 -0
  29. package/dist/types/index.d.ts +9 -0
  30. package/dist/types/index.d.ts.map +1 -0
  31. package/dist/{master → types/master}/get-bundle-url.browser.d.ts +1 -0
  32. package/dist/types/master/get-bundle-url.browser.d.ts.map +1 -0
  33. package/dist/{master → types/master}/implementation.browser.d.ts +2 -1
  34. package/dist/types/master/implementation.browser.d.ts.map +1 -0
  35. package/dist/{master → types/master}/implementation.d.ts +4 -1
  36. package/dist/types/master/implementation.d.ts.map +1 -0
  37. package/dist/{master → types/master}/implementation.node.d.ts +2 -1
  38. package/dist/types/master/implementation.node.d.ts.map +1 -0
  39. package/dist/types/master/index.d.ts +13 -0
  40. package/dist/types/master/index.d.ts.map +1 -0
  41. package/dist/{master → types/master}/invocation-proxy.d.ts +2 -1
  42. package/dist/types/master/invocation-proxy.d.ts.map +1 -0
  43. package/dist/{master → types/master}/pool-types.d.ts +16 -1
  44. package/dist/types/master/pool-types.d.ts.map +1 -0
  45. package/dist/types/master/pool.d.ts +93 -0
  46. package/dist/types/master/pool.d.ts.map +1 -0
  47. package/dist/types/master/register.d.ts +2 -0
  48. package/dist/types/master/register.d.ts.map +1 -0
  49. package/dist/{master → types/master}/spawn.d.ts +12 -2
  50. package/dist/types/master/spawn.d.ts.map +1 -0
  51. package/dist/types/master/thread.d.ts +13 -0
  52. package/dist/types/master/thread.d.ts.map +1 -0
  53. package/dist/{observable-promise.d.ts → types/observable-promise.d.ts} +14 -0
  54. package/dist/types/observable-promise.d.ts.map +1 -0
  55. package/dist/types/observable.d.ts +21 -0
  56. package/dist/types/observable.d.ts.map +1 -0
  57. package/dist/{ponyfills.d.ts → types/ponyfills.d.ts} +1 -0
  58. package/dist/types/ponyfills.d.ts.map +1 -0
  59. package/dist/types/promise.d.ts +6 -0
  60. package/dist/types/promise.d.ts.map +1 -0
  61. package/dist/{serializers.d.ts → types/serializers.d.ts} +1 -0
  62. package/dist/types/serializers.d.ts.map +1 -0
  63. package/dist/{symbols.d.ts → types/symbols.d.ts} +1 -0
  64. package/dist/types/symbols.d.ts.map +1 -0
  65. package/dist/types/transferable.d.ts +43 -0
  66. package/dist/types/transferable.d.ts.map +1 -0
  67. package/dist/types/{master.d.ts → types/master.d.ts} +17 -3
  68. package/dist/types/types/master.d.ts.map +1 -0
  69. package/dist/types/{messages.d.ts → types/messages.d.ts} +1 -0
  70. package/dist/types/types/messages.d.ts.map +1 -0
  71. package/dist/types/{worker.d.ts → types/worker.d.ts} +1 -0
  72. package/dist/types/types/worker.d.ts.map +1 -0
  73. package/dist/types/worker/WorkerGlobalScope.d.ts +6 -0
  74. package/dist/types/worker/WorkerGlobalScope.d.ts.map +1 -0
  75. package/dist/types/worker/expose.d.ts +4 -0
  76. package/dist/types/worker/expose.d.ts.map +1 -0
  77. package/dist/types/worker/worker.browser.d.ts +14 -0
  78. package/dist/types/worker/worker.browser.d.ts.map +1 -0
  79. package/dist/types/worker/worker.node.d.ts +25 -0
  80. package/dist/types/worker/worker.node.d.ts.map +1 -0
  81. package/package.json +66 -77
  82. package/src/common.ts +10 -6
  83. package/src/index.ts +10 -9
  84. package/src/master/get-bundle-url.browser.ts +2 -1
  85. package/src/master/implementation.browser.ts +2 -2
  86. package/src/master/implementation.node.ts +19 -96
  87. package/src/master/implementation.ts +2 -2
  88. package/src/master/index.ts +7 -7
  89. package/src/master/invocation-proxy.ts +6 -6
  90. package/src/master/pool-types.ts +1 -1
  91. package/src/master/pool.ts +14 -13
  92. package/src/master/register.ts +2 -1
  93. package/src/master/spawn.ts +8 -8
  94. package/src/master/thread.ts +2 -2
  95. package/src/observable-promise.ts +3 -2
  96. package/src/serializers.ts +1 -1
  97. package/src/transferable.ts +2 -1
  98. package/src/types/master.ts +3 -3
  99. package/src/worker/WorkerGlobalScope.ts +5 -0
  100. package/src/worker/expose.ts +234 -0
  101. package/src/worker/is-observable.d.ts +7 -0
  102. package/src/worker/{implementation.browser.ts → worker.browser.ts} +26 -10
  103. package/src/worker/{implementation.worker_threads.ts → worker.node.ts} +30 -12
  104. package/types/is-observable.d.ts +1 -1
  105. package/xy.config.ts +24 -0
  106. package/dist/common.js +0 -16
  107. package/dist/esm/common.js +0 -16
  108. package/dist/esm/index.js +0 -26
  109. package/dist/esm/master/get-bundle-url.browser.js +0 -25
  110. package/dist/esm/master/implementation.browser.js +0 -65
  111. package/dist/esm/master/implementation.js +0 -43
  112. package/dist/esm/master/implementation.node.js +0 -205
  113. package/dist/esm/master/index.js +0 -14
  114. package/dist/esm/master/invocation-proxy.js +0 -121
  115. package/dist/esm/master/pool-types.js +0 -14
  116. package/dist/esm/master/pool.js +0 -262
  117. package/dist/esm/master/register.js +0 -11
  118. package/dist/esm/master/spawn.js +0 -114
  119. package/dist/esm/master/thread.js +0 -18
  120. package/dist/esm/observable-promise.js +0 -132
  121. package/dist/esm/observable.js +0 -33
  122. package/dist/esm/ponyfills.js +0 -20
  123. package/dist/esm/promise.js +0 -23
  124. package/dist/esm/serializers.js +0 -41
  125. package/dist/esm/symbols.js +0 -8
  126. package/dist/esm/transferable.js +0 -25
  127. package/dist/esm/types/master.js +0 -9
  128. package/dist/esm/types/messages.js +0 -16
  129. package/dist/esm/types/worker.js +0 -2
  130. package/dist/esm/worker/bundle-entry.js +0 -26
  131. package/dist/esm/worker/implementation.browser.js +0 -24
  132. package/dist/esm/worker/implementation.js +0 -19
  133. package/dist/esm/worker/implementation.tiny-worker.js +0 -37
  134. package/dist/esm/worker/implementation.worker_threads.js +0 -41
  135. package/dist/esm/worker/index.js +0 -174
  136. package/dist/esm/worker_threads.js +0 -13
  137. package/dist/index.d.ts +0 -7
  138. package/dist/index.js +0 -26
  139. package/dist/master/get-bundle-url.browser.js +0 -25
  140. package/dist/master/implementation.browser.js +0 -65
  141. package/dist/master/implementation.js +0 -43
  142. package/dist/master/implementation.node.js +0 -205
  143. package/dist/master/index.d.ts +0 -10
  144. package/dist/master/index.js +0 -14
  145. package/dist/master/invocation-proxy.js +0 -121
  146. package/dist/master/pool-types.js +0 -14
  147. package/dist/master/pool.d.ts +0 -50
  148. package/dist/master/pool.js +0 -262
  149. package/dist/master/register.d.ts +0 -1
  150. package/dist/master/register.js +0 -11
  151. package/dist/master/spawn.js +0 -114
  152. package/dist/master/thread.d.ts +0 -8
  153. package/dist/master/thread.js +0 -18
  154. package/dist/observable-promise.js +0 -132
  155. package/dist/observable.d.ts +0 -11
  156. package/dist/observable.js +0 -33
  157. package/dist/ponyfills.js +0 -20
  158. package/dist/promise.d.ts +0 -1
  159. package/dist/promise.js +0 -23
  160. package/dist/serializers.js +0 -41
  161. package/dist/symbols.js +0 -8
  162. package/dist/transferable.d.ts +0 -9
  163. package/dist/transferable.js +0 -25
  164. package/dist/types/master.js +0 -9
  165. package/dist/types/messages.js +0 -16
  166. package/dist/types/worker.js +0 -2
  167. package/dist/worker/bundle-entry.d.ts +0 -1
  168. package/dist/worker/bundle-entry.js +0 -26
  169. package/dist/worker/implementation.browser.d.ts +0 -6
  170. package/dist/worker/implementation.browser.js +0 -24
  171. package/dist/worker/implementation.d.ts +0 -3
  172. package/dist/worker/implementation.js +0 -19
  173. package/dist/worker/implementation.tiny-worker.d.ts +0 -6
  174. package/dist/worker/implementation.tiny-worker.js +0 -37
  175. package/dist/worker/implementation.worker_threads.d.ts +0 -8
  176. package/dist/worker/implementation.worker_threads.js +0 -41
  177. package/dist/worker/index.d.ts +0 -5
  178. package/dist/worker/index.js +0 -174
  179. package/dist/worker_threads.d.ts +0 -8
  180. package/dist/worker_threads.js +0 -13
  181. package/observable.d.ts +0 -2
  182. package/observable.js +0 -2
  183. package/observable.mjs +0 -4
  184. package/register.d.ts +0 -2
  185. package/register.js +0 -2
  186. package/register.mjs +0 -1
  187. package/rollup.config.js +0 -16
  188. package/src/worker/bundle-entry.ts +0 -10
  189. package/src/worker/implementation.tiny-worker.ts +0 -55
  190. package/src/worker/implementation.ts +0 -23
  191. package/src/worker/index.ts +0 -230
  192. package/src/worker_threads.ts +0 -27
  193. package/test/lib/index.ts +0 -1
  194. package/test/lib/serialization.ts +0 -38
  195. package/test/observable-promise.test.ts +0 -205
  196. package/test/observable.test.ts +0 -87
  197. package/test/pool.test.ts +0 -183
  198. package/test/serialization.test.ts +0 -23
  199. package/test/spawn.chromium.mocha.ts +0 -53
  200. package/test/spawn.test.ts +0 -87
  201. package/test/streaming.test.ts +0 -29
  202. package/test/transferables.test.ts +0 -71
  203. package/test/workers/arraybuffer-xor.ts +0 -10
  204. package/test/workers/count-to-five.ts +0 -12
  205. package/test/workers/counter.ts +0 -19
  206. package/test/workers/faulty-function.ts +0 -5
  207. package/test/workers/hello-world.ts +0 -5
  208. package/test/workers/increment.ts +0 -8
  209. package/test/workers/minmax.ts +0 -25
  210. package/test/workers/serialization.ts +0 -13
  211. package/test/workers/top-level-throw.ts +0 -1
  212. package/test-tooling/rollup/app.js +0 -21
  213. package/test-tooling/rollup/rollup.config.ts +0 -14
  214. package/test-tooling/rollup/worker.js +0 -7
  215. package/test-tooling/tsconfig/minimal.ts +0 -12
  216. package/test-tooling/webpack/addition-worker.ts +0 -9
  217. package/test-tooling/webpack/app-with-inlined-worker.ts +0 -28
  218. package/test-tooling/webpack/app.ts +0 -61
  219. package/test-tooling/webpack/pool-worker.ts +0 -5
  220. package/test-tooling/webpack/raw-loader.d.ts +0 -4
  221. package/test-tooling/webpack/webpack.chromium.mocha.ts +0 -21
  222. package/test-tooling/webpack/webpack.node.config.js +0 -29
  223. package/test-tooling/webpack/webpack.web.config.js +0 -28
  224. package/types/webworker.d.ts +0 -9
  225. package/worker.d.ts +0 -2
  226. package/worker.js +0 -2
  227. package/worker.mjs +0 -6
@@ -1,174 +0,0 @@
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
- }
@@ -1,8 +0,0 @@
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 {};
@@ -1,13 +0,0 @@
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
- }
package/observable.d.ts DELETED
@@ -1,2 +0,0 @@
1
- // eslint-disable-next-line import-x/no-internal-modules
2
- export * from './dist/observable'
package/observable.js DELETED
@@ -1,2 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-require-imports */
2
- module.exports = require('./dist/observable')
package/observable.mjs DELETED
@@ -1,4 +0,0 @@
1
- import * as Observables from './dist/observable.js'
2
-
3
- export const Observable = Observables.Observable
4
- export const Subject = Observables.Subject
package/register.d.ts DELETED
@@ -1,2 +0,0 @@
1
- // eslint-disable-next-line import-x/no-internal-modules
2
- export * from './dist/master/register'
package/register.js DELETED
@@ -1,2 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-require-imports */
2
- require('./dist/master/register')
package/register.mjs DELETED
@@ -1 +0,0 @@
1
- import './dist/master/register.js'
package/rollup.config.js DELETED
@@ -1,16 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-require-imports */
2
- const commonjs = require('@rollup/plugin-commonjs')
3
- /* eslint-disable @typescript-eslint/no-require-imports */
4
- const { nodeResolve } = require('@rollup/plugin-node-resolve')
5
-
6
- module.exports = {
7
- plugins: [
8
- nodeResolve({
9
- browser: true,
10
- mainFields: ['module', 'main'],
11
- preferBuiltins: true,
12
- }),
13
-
14
- commonjs(),
15
- ],
16
- }
@@ -1,10 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import { expose } from './index'
3
- export * from './index'
4
-
5
- if (typeof globalThis !== 'undefined') {
6
- ;(globalThis as any).expose = expose
7
- }
8
- if (typeof globalThis !== 'undefined') {
9
- ;(globalThis as any).expose = expose
10
- }
@@ -1,55 +0,0 @@
1
- /* eslint-disable import-x/no-internal-modules */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
3
- /// <reference lib="dom" />
4
- // tslint:disable no-shadowed-variable
5
-
6
- import type { AbstractedWorkerAPI } from '../types/worker'
7
-
8
- interface WorkerGlobalScope {
9
- addEventListener(eventName: string, listener: (event: Event) => void): void
10
- postMessage(message: any, transferables?: any[]): void
11
- removeEventListener(eventName: string, listener: (event: Event) => void): void
12
- }
13
-
14
- declare const self: WorkerGlobalScope
15
- try {
16
- if (self === undefined) {
17
- ;(globalThis as any).self = globalThis
18
- }
19
- } catch {
20
- ;(globalThis as any).self = globalThis
21
- }
22
-
23
- const isWorkerRuntime: AbstractedWorkerAPI['isWorkerRuntime'] = function isWorkerRuntime() {
24
- return self !== undefined && self['postMessage'] ? true : false
25
- }
26
-
27
- const postMessageToMaster: AbstractedWorkerAPI['postMessageToMaster'] = function postMessageToMaster(data) {
28
- // TODO: Warn that Transferables are not supported on first attempt to use feature
29
- self.postMessage(data)
30
- }
31
-
32
- let muxingHandlerSetUp = false
33
- const messageHandlers = new Set<(data: any) => void>()
34
-
35
- const subscribeToMasterMessages: AbstractedWorkerAPI['subscribeToMasterMessages'] = function subscribeToMasterMessages(onMessage) {
36
- if (!muxingHandlerSetUp) {
37
- // We have one multiplexing message handler as tiny-worker's
38
- // addEventListener() only allows you to set a single message handler
39
- self.addEventListener('message', ((event: MessageEvent) => {
40
- for (const handler of messageHandlers) handler(event.data)
41
- }) as EventListener)
42
- muxingHandlerSetUp = true
43
- }
44
-
45
- messageHandlers.add(onMessage)
46
-
47
- const unsubscribe = () => messageHandlers.delete(onMessage)
48
- return unsubscribe
49
- }
50
-
51
- export default {
52
- isWorkerRuntime,
53
- postMessageToMaster,
54
- subscribeToMasterMessages,
55
- }
@@ -1,23 +0,0 @@
1
- /* eslint-disable import-x/no-internal-modules */
2
- // tslint:disable no-var-requires
3
- /*
4
- * This file is only a stub to make './implementation' resolve to the right module.
5
- */
6
-
7
- import type { AbstractedWorkerAPI } from '../types/worker'
8
- import WebWorkerImplementation from './implementation.browser'
9
- import TinyWorkerImplementation from './implementation.tiny-worker'
10
- import WorkerThreadsImplementation from './implementation.worker_threads'
11
-
12
- const runningInNode = typeof process !== 'undefined' && (process.arch as string) !== 'browser' && 'pid' in process
13
-
14
- function selectNodeImplementation(): AbstractedWorkerAPI {
15
- try {
16
- WorkerThreadsImplementation.testImplementation()
17
- return WorkerThreadsImplementation
18
- } catch {
19
- return TinyWorkerImplementation
20
- }
21
- }
22
-
23
- export default runningInNode ? selectNodeImplementation() : WebWorkerImplementation
@@ -1,230 +0,0 @@
1
- /* eslint-disable import-x/no-internal-modules */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
3
- /* eslint-disable @typescript-eslint/no-floating-promises */
4
- import isSomeObservable from 'is-observable-2-1-0'
5
- import type { Observable, Subscription } from 'observable-fns'
6
-
7
- import { deserialize, serialize } from '../common'
8
- import type { TransferDescriptor } from '../transferable'
9
- import { isTransferDescriptor } from '../transferable'
10
- import type {
11
- MasterJobCancelMessage,
12
- MasterJobRunMessage,
13
- SerializedError,
14
- WorkerInitMessage,
15
- WorkerJobErrorMessage,
16
- WorkerJobResultMessage,
17
- WorkerJobStartMessage,
18
- WorkerUncaughtErrorMessage,
19
- } from '../types/messages'
20
- import {
21
- MasterMessageType,
22
- WorkerMessageType,
23
- } from '../types/messages'
24
- import type { WorkerFunction, WorkerModule } from '../types/worker'
25
- import Implementation from './implementation'
26
-
27
- export { registerSerializer } from '../common'
28
- export { Transfer } from '../transferable'
29
-
30
- /** Returns `true` if this code is currently running in a worker. */
31
- export const isWorkerRuntime = Implementation.isWorkerRuntime
32
-
33
- let exposeCalled = false
34
-
35
- const activeSubscriptions = new Map<number, Subscription<any>>()
36
-
37
- const isMasterJobCancelMessage = (thing: any): thing is MasterJobCancelMessage => thing && thing.type === MasterMessageType.cancel
38
- const isMasterJobRunMessage = (thing: any): thing is MasterJobRunMessage => thing && thing.type === MasterMessageType.run
39
-
40
- /**
41
- * There are issues with `is-observable` not recognizing zen-observable's instances.
42
- * We are using `observable-fns`, but it's based on zen-observable, too.
43
- */
44
- const isObservable = (thing: any): thing is Observable<any> => isSomeObservable(thing) || isZenObservable(thing)
45
-
46
- function isZenObservable(thing: any): thing is Observable<any> {
47
- return thing && typeof thing === 'object' && typeof thing.subscribe === 'function'
48
- }
49
-
50
- function deconstructTransfer(thing: any) {
51
- return isTransferDescriptor(thing) ? { payload: thing.send, transferables: thing.transferables } : { payload: thing, transferables: undefined }
52
- }
53
-
54
- function postFunctionInitMessage() {
55
- const initMessage: WorkerInitMessage = {
56
- exposed: { type: 'function' },
57
- type: WorkerMessageType.init,
58
- }
59
- Implementation.postMessageToMaster(initMessage)
60
- }
61
-
62
- function postModuleInitMessage(methodNames: string[]) {
63
- const initMessage: WorkerInitMessage = {
64
- exposed: {
65
- methods: methodNames,
66
- type: 'module',
67
- },
68
- type: WorkerMessageType.init,
69
- }
70
- Implementation.postMessageToMaster(initMessage)
71
- }
72
-
73
- function postJobErrorMessage(uid: number, rawError: Error | TransferDescriptor<Error>) {
74
- const { payload: error, transferables } = deconstructTransfer(rawError)
75
- const errorMessage: WorkerJobErrorMessage = {
76
- error: serialize(error) as any as SerializedError,
77
- type: WorkerMessageType.error,
78
- uid,
79
- }
80
- Implementation.postMessageToMaster(errorMessage, transferables)
81
- }
82
-
83
- function postJobResultMessage(uid: number, completed: boolean, resultValue?: any) {
84
- const { payload, transferables } = deconstructTransfer(resultValue)
85
- const resultMessage: WorkerJobResultMessage = {
86
- complete: completed ? true : undefined,
87
- payload,
88
- type: WorkerMessageType.result,
89
- uid,
90
- }
91
- Implementation.postMessageToMaster(resultMessage, transferables)
92
- }
93
-
94
- function postJobStartMessage(uid: number, resultType: WorkerJobStartMessage['resultType']) {
95
- const startMessage: WorkerJobStartMessage = {
96
- resultType,
97
- type: WorkerMessageType.running,
98
- uid,
99
- }
100
- Implementation.postMessageToMaster(startMessage)
101
- }
102
-
103
- function postUncaughtErrorMessage(error: Error) {
104
- try {
105
- const errorMessage: WorkerUncaughtErrorMessage = {
106
- error: serialize(error) as any as SerializedError,
107
- type: WorkerMessageType.uncaughtError,
108
- }
109
- Implementation.postMessageToMaster(errorMessage)
110
- } catch (subError) {
111
- // tslint:disable-next-line no-console
112
- console.error(
113
- 'Not reporting uncaught error back to master thread as it ' + 'occured while reporting an uncaught error already.' + '\nLatest error:',
114
- subError,
115
- '\nOriginal error:',
116
- error,
117
- )
118
- }
119
- }
120
-
121
- async function runFunction(jobUID: number, fn: WorkerFunction, args: any[]) {
122
- let syncResult: any
123
-
124
- try {
125
- syncResult = fn(...args)
126
- } catch (error) {
127
- return postJobErrorMessage(jobUID, error)
128
- }
129
-
130
- const resultType = isObservable(syncResult) ? 'observable' : 'promise'
131
- postJobStartMessage(jobUID, resultType)
132
-
133
- if (isObservable(syncResult)) {
134
- const subscription = syncResult.subscribe(
135
- value => postJobResultMessage(jobUID, false, serialize(value)),
136
- (error) => {
137
- postJobErrorMessage(jobUID, serialize(error) as any)
138
- activeSubscriptions.delete(jobUID)
139
- },
140
- () => {
141
- postJobResultMessage(jobUID, true)
142
- activeSubscriptions.delete(jobUID)
143
- },
144
- )
145
- activeSubscriptions.set(jobUID, subscription)
146
- } else {
147
- try {
148
- const result = await syncResult
149
- postJobResultMessage(jobUID, true, serialize(result))
150
- } catch (error) {
151
- postJobErrorMessage(jobUID, serialize(error) as any)
152
- }
153
- }
154
- }
155
-
156
- /**
157
- * Expose a function or a module (an object whose values are functions)
158
- * to the main thread. Must be called exactly once in every worker thread
159
- * to signal its API to the main thread.
160
- *
161
- * @param exposed Function or object whose values are functions
162
- */
163
- export function expose(exposed: WorkerFunction | WorkerModule<any>) {
164
- if (!Implementation.isWorkerRuntime()) {
165
- throw new Error('expose() called in the master thread.')
166
- }
167
- if (exposeCalled) {
168
- throw new Error('expose() called more than once. This is not possible. Pass an object to expose() if you want to expose multiple functions.')
169
- }
170
- exposeCalled = true
171
-
172
- if (typeof exposed === 'function') {
173
- Implementation.subscribeToMasterMessages((messageData) => {
174
- if (isMasterJobRunMessage(messageData) && !messageData.method) {
175
- runFunction(messageData.uid, exposed, messageData.args.map(deserialize))
176
- }
177
- })
178
- postFunctionInitMessage()
179
- } else if (typeof exposed === 'object' && exposed) {
180
- Implementation.subscribeToMasterMessages((messageData) => {
181
- if (isMasterJobRunMessage(messageData) && messageData.method) {
182
- runFunction(messageData.uid, exposed[messageData.method], messageData.args.map(deserialize))
183
- }
184
- })
185
-
186
- const methodNames = Object.keys(exposed).filter(key => typeof exposed[key] === 'function')
187
- postModuleInitMessage(methodNames)
188
- } else {
189
- throw new Error(`Invalid argument passed to expose(). Expected a function or an object, got: ${exposed}`)
190
- }
191
-
192
- Implementation.subscribeToMasterMessages((messageData) => {
193
- if (isMasterJobCancelMessage(messageData)) {
194
- const jobUID = messageData.uid
195
- const subscription = activeSubscriptions.get(jobUID)
196
-
197
- if (subscription) {
198
- subscription.unsubscribe()
199
- activeSubscriptions.delete(jobUID)
200
- }
201
- }
202
- })
203
- }
204
-
205
- if (typeof globalThis !== 'undefined' && typeof self.addEventListener === 'function' && Implementation.isWorkerRuntime()) {
206
- self.addEventListener('error', (event) => {
207
- // Post with some delay, so the master had some time to subscribe to messages
208
- setTimeout(() => postUncaughtErrorMessage(event.error || event), 250)
209
- })
210
- self.addEventListener('unhandledrejection', (event) => {
211
- const error = (event as any).reason
212
- if (error && typeof (error as any).message === 'string') {
213
- // Post with some delay, so the master had some time to subscribe to messages
214
- setTimeout(() => postUncaughtErrorMessage(error), 250)
215
- }
216
- })
217
- }
218
-
219
- if (typeof process !== 'undefined' && typeof process.on === 'function' && Implementation.isWorkerRuntime()) {
220
- process.on('uncaughtException', (error) => {
221
- // Post with some delay, so the master had some time to subscribe to messages
222
- setTimeout(() => postUncaughtErrorMessage(error), 250)
223
- })
224
- process.on('unhandledRejection', (error) => {
225
- if (error && typeof (error as any).message === 'string') {
226
- // Post with some delay, so the master had some time to subscribe to messages
227
- setTimeout(() => postUncaughtErrorMessage(error as any), 250)
228
- }
229
- })
230
- }
@@ -1,27 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
- // Webpack hack
3
- // tslint:disable no-eval
4
-
5
- declare function __non_webpack_require__(module: string): any
6
-
7
- // FIXME
8
- type MessagePort = any
9
-
10
- interface WorkerThreadsModule {
11
- MessagePort: typeof MessagePort
12
- isMainThread: boolean
13
- parentPort: MessagePort
14
- }
15
-
16
- let implementation: WorkerThreadsModule | undefined
17
-
18
- function selectImplementation(): WorkerThreadsModule {
19
- return typeof __non_webpack_require__ === 'function' ? __non_webpack_require__('worker_threads') : eval('require')('worker_threads')
20
- }
21
-
22
- export default function getImplementation(): WorkerThreadsModule {
23
- if (!implementation) {
24
- implementation = selectImplementation()
25
- }
26
- return implementation
27
- }
package/test/lib/index.ts DELETED
@@ -1 +0,0 @@
1
- export * from './serialization.js'
@@ -1,38 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
-
3
- import type { JsonSerializable, SerializerImplementation } from '../../src/index'
4
-
5
- export class Foo<T> {
6
- private readonly value: T
7
-
8
- constructor(value: T) {
9
- this.value = value
10
- }
11
-
12
- getValue() {
13
- return this.value
14
- }
15
- }
16
-
17
- interface SerializedFoo<T extends JsonSerializable> {
18
- __type: '$$foo'
19
- val: T
20
- }
21
-
22
- const isSerializedFoo = (thing: any): thing is SerializedFoo<JsonSerializable> =>
23
- thing && typeof thing === 'object' && '__type' in thing && thing.__type === '$$foo'
24
-
25
- export const fooSerializer: SerializerImplementation = {
26
- deserialize(serialized, fallback) {
27
- return isSerializedFoo(serialized) ? new Foo(serialized.val) : fallback(serialized)
28
- },
29
-
30
- serialize(data, fallback) {
31
- return data instanceof Foo
32
- ? {
33
- __type: '$$foo',
34
- val: data.getValue(),
35
- }
36
- : fallback(data)
37
- },
38
- }