@xylabs/threads 4.7.0 → 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 (227) 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/observable.d.ts +2 -0
  92. package/observable.js +2 -0
  93. package/observable.mjs +4 -0
  94. package/package.json +77 -66
  95. package/register.d.ts +2 -0
  96. package/register.js +2 -0
  97. package/register.mjs +1 -0
  98. package/rollup.config.js +16 -0
  99. package/src/common.ts +6 -10
  100. package/src/index.ts +9 -10
  101. package/src/master/get-bundle-url.browser.ts +1 -2
  102. package/src/master/implementation.browser.ts +2 -2
  103. package/src/master/implementation.node.ts +96 -19
  104. package/src/master/implementation.ts +2 -2
  105. package/src/master/index.ts +7 -7
  106. package/src/master/invocation-proxy.ts +6 -6
  107. package/src/master/pool-types.ts +1 -1
  108. package/src/master/pool.ts +13 -14
  109. package/src/master/register.ts +1 -2
  110. package/src/master/spawn.ts +8 -8
  111. package/src/master/thread.ts +2 -2
  112. package/src/observable-promise.ts +2 -3
  113. package/src/serializers.ts +1 -1
  114. package/src/transferable.ts +1 -2
  115. package/src/types/master.ts +3 -3
  116. package/src/worker/bundle-entry.ts +10 -0
  117. package/src/worker/{worker.browser.ts → implementation.browser.ts} +10 -26
  118. package/src/worker/implementation.tiny-worker.ts +55 -0
  119. package/src/worker/implementation.ts +23 -0
  120. package/src/worker/{worker.node.ts → implementation.worker_threads.ts} +12 -30
  121. package/src/worker/index.ts +230 -0
  122. package/src/worker_threads.ts +27 -0
  123. package/test/lib/index.ts +1 -0
  124. package/test/lib/serialization.ts +38 -0
  125. package/test/observable-promise.test.ts +205 -0
  126. package/test/observable.test.ts +87 -0
  127. package/test/pool.test.ts +183 -0
  128. package/test/serialization.test.ts +23 -0
  129. package/test/spawn.chromium.mocha.ts +53 -0
  130. package/test/spawn.test.ts +87 -0
  131. package/test/streaming.test.ts +29 -0
  132. package/test/transferables.test.ts +71 -0
  133. package/test/workers/arraybuffer-xor.ts +10 -0
  134. package/test/workers/count-to-five.ts +12 -0
  135. package/test/workers/counter.ts +19 -0
  136. package/test/workers/faulty-function.ts +5 -0
  137. package/test/workers/hello-world.ts +5 -0
  138. package/test/workers/increment.ts +8 -0
  139. package/test/workers/minmax.ts +25 -0
  140. package/test/workers/serialization.ts +13 -0
  141. package/test/workers/top-level-throw.ts +1 -0
  142. package/test-tooling/rollup/app.js +21 -0
  143. package/test-tooling/rollup/rollup.config.ts +14 -0
  144. package/test-tooling/rollup/worker.js +7 -0
  145. package/test-tooling/tsconfig/minimal.ts +12 -0
  146. package/test-tooling/webpack/addition-worker.ts +9 -0
  147. package/test-tooling/webpack/app-with-inlined-worker.ts +28 -0
  148. package/test-tooling/webpack/app.ts +61 -0
  149. package/test-tooling/webpack/pool-worker.ts +5 -0
  150. package/test-tooling/webpack/raw-loader.d.ts +4 -0
  151. package/test-tooling/webpack/webpack.chromium.mocha.ts +21 -0
  152. package/test-tooling/webpack/webpack.node.config.js +29 -0
  153. package/test-tooling/webpack/webpack.web.config.js +28 -0
  154. package/types/is-observable.d.ts +1 -1
  155. package/types/webworker.d.ts +9 -0
  156. package/worker.d.ts +2 -0
  157. package/worker.js +2 -0
  158. package/worker.mjs +6 -0
  159. package/dist/browser/master/implementation.browser.mjs +0 -89
  160. package/dist/browser/master/implementation.browser.mjs.map +0 -1
  161. package/dist/browser/worker/worker.browser.mjs +0 -291
  162. package/dist/browser/worker/worker.browser.mjs.map +0 -1
  163. package/dist/neutral/index.mjs +0 -1022
  164. package/dist/neutral/index.mjs.map +0 -1
  165. package/dist/neutral/master/implementation.mjs +0 -264
  166. package/dist/neutral/master/implementation.mjs.map +0 -1
  167. package/dist/neutral/master/index.mjs +0 -988
  168. package/dist/neutral/master/index.mjs.map +0 -1
  169. package/dist/neutral/master/pool.mjs +0 -579
  170. package/dist/neutral/master/pool.mjs.map +0 -1
  171. package/dist/neutral/master/register.mjs +0 -272
  172. package/dist/neutral/master/register.mjs.map +0 -1
  173. package/dist/neutral/master/spawn.mjs +0 -412
  174. package/dist/neutral/master/spawn.mjs.map +0 -1
  175. package/dist/neutral/master/thread.mjs +0 -29
  176. package/dist/neutral/master/thread.mjs.map +0 -1
  177. package/dist/neutral/observable-promise.mjs +0 -132
  178. package/dist/neutral/observable-promise.mjs.map +0 -1
  179. package/dist/neutral/observable.mjs +0 -31
  180. package/dist/neutral/observable.mjs.map +0 -1
  181. package/dist/node/master/implementation.node.mjs +0 -154
  182. package/dist/node/master/implementation.node.mjs.map +0 -1
  183. package/dist/node/worker/worker.node.mjs +0 -304
  184. package/dist/node/worker/worker.node.mjs.map +0 -1
  185. package/dist/types/common.d.ts.map +0 -1
  186. package/dist/types/index.d.ts +0 -9
  187. package/dist/types/index.d.ts.map +0 -1
  188. package/dist/types/master/get-bundle-url.browser.d.ts.map +0 -1
  189. package/dist/types/master/implementation.browser.d.ts.map +0 -1
  190. package/dist/types/master/implementation.d.ts.map +0 -1
  191. package/dist/types/master/implementation.node.d.ts.map +0 -1
  192. package/dist/types/master/index.d.ts +0 -13
  193. package/dist/types/master/index.d.ts.map +0 -1
  194. package/dist/types/master/invocation-proxy.d.ts.map +0 -1
  195. package/dist/types/master/pool-types.d.ts.map +0 -1
  196. package/dist/types/master/pool.d.ts +0 -93
  197. package/dist/types/master/pool.d.ts.map +0 -1
  198. package/dist/types/master/register.d.ts +0 -2
  199. package/dist/types/master/register.d.ts.map +0 -1
  200. package/dist/types/master/spawn.d.ts.map +0 -1
  201. package/dist/types/master/thread.d.ts +0 -13
  202. package/dist/types/master/thread.d.ts.map +0 -1
  203. package/dist/types/observable-promise.d.ts.map +0 -1
  204. package/dist/types/observable.d.ts +0 -21
  205. package/dist/types/observable.d.ts.map +0 -1
  206. package/dist/types/ponyfills.d.ts.map +0 -1
  207. package/dist/types/promise.d.ts +0 -6
  208. package/dist/types/promise.d.ts.map +0 -1
  209. package/dist/types/serializers.d.ts.map +0 -1
  210. package/dist/types/symbols.d.ts.map +0 -1
  211. package/dist/types/transferable.d.ts +0 -43
  212. package/dist/types/transferable.d.ts.map +0 -1
  213. package/dist/types/types/master.d.ts.map +0 -1
  214. package/dist/types/types/messages.d.ts.map +0 -1
  215. package/dist/types/types/worker.d.ts.map +0 -1
  216. package/dist/types/worker/WorkerGlobalScope.d.ts +0 -6
  217. package/dist/types/worker/WorkerGlobalScope.d.ts.map +0 -1
  218. package/dist/types/worker/expose.d.ts +0 -4
  219. package/dist/types/worker/expose.d.ts.map +0 -1
  220. package/dist/types/worker/worker.browser.d.ts +0 -14
  221. package/dist/types/worker/worker.browser.d.ts.map +0 -1
  222. package/dist/types/worker/worker.node.d.ts +0 -25
  223. package/dist/types/worker/worker.node.d.ts.map +0 -1
  224. package/src/worker/WorkerGlobalScope.ts +0 -5
  225. package/src/worker/expose.ts +0 -234
  226. package/src/worker/is-observable.d.ts +0 -7
  227. package/xy.config.ts +0 -24
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xylabs/threads",
3
- "version": "4.7.0",
3
+ "version": "4.7.1",
4
4
  "description": "Web workers & worker threads as simple as a function call",
5
5
  "keywords": [
6
6
  "thread",
@@ -29,88 +29,85 @@
29
29
  "./register.*js",
30
30
  "./worker.*js"
31
31
  ],
32
- "type": "module",
33
32
  "exports": {
34
33
  ".": {
35
- "types": "./dist/types/index.d.ts",
36
- "import": "./dist/neutral/index.mjs",
37
- "default": "./dist/neutral/index.mjs"
38
- },
39
- "./implementation": {
40
- "browser": {
41
- "types": "./dist/types/master/implementation.browser.d.ts",
42
- "import": "./dist/browser/master/implementation.browser.mjs",
43
- "default": "./dist/browser/master/implementation.browser.mjs"
44
- },
45
- "node": {
46
- "types": "./dist/types/master/implementation.node.d.ts",
47
- "import": "./dist/node/master/implementation.node.mjs",
48
- "default": "./dist/node/master/implementation.node.mjs"
49
- },
50
- "types": "./dist/types/master/implementation.d.ts",
51
- "import": "./dist/neutral/master/implementation.mjs",
52
- "default": "./dist/neutral/master/implementation.mjs"
34
+ "types": "./dist/index.d.ts",
35
+ "require": "./dist/index.js",
36
+ "import": "./dist/esm/index.js",
37
+ "default": "./dist/esm/index.js"
53
38
  },
54
39
  "./master": {
55
- "types": "./dist/types/master/index.d.ts",
56
- "import": "./dist/neutral/master/index.mjs",
57
- "default": "./dist/neutral/master/index.mjs"
58
- },
59
- "./spawn": {
60
- "types": "./dist/types/master/spawn.d.ts",
61
- "import": "./dist/neutral/master/spawn.mjs",
62
- "default": "./dist/neutral/master/spawn.mjs"
63
- },
64
- "./thread": {
65
- "types": "./dist/types/master/thread.d.ts",
66
- "import": "./dist/neutral/master/thread.mjs",
67
- "default": "./dist/neutral/master/thread.mjs"
40
+ "types": "./dist/types/master.d.ts",
41
+ "require": "./dist/master.js",
42
+ "import": "./dist/esm/master.js",
43
+ "default": "./dist/esm/master.js"
68
44
  },
69
45
  "./messenger": {
70
- "types": "./dist/types/types/messages.d.ts"
46
+ "types": "./dist/types/messenger.d.ts"
71
47
  },
72
48
  "./observable": {
73
- "types": "./dist/types/observable.d.ts",
74
- "import": "./dist/neutral/observable.mjs",
75
- "default": "./dist/neutral/observable.mjs"
76
- },
77
- "./pool": {
78
- "types": "./dist/types/master/pool.d.ts",
79
- "import": "./dist/neutral/master/pool.mjs",
80
- "default": "./dist/neutral/master/pool.mjs"
81
- },
82
- "./observable-promise": {
83
- "types": "./dist/types/observable-promise.d.ts",
84
- "import": "./dist/neutral/observable-promise.mjs",
85
- "default": "./dist/neutral/observable-promise.mjs"
49
+ "types": "./dist/observable.d.ts",
50
+ "require": "./dist/observable.js",
51
+ "import": "./dist/esm/observable.js",
52
+ "default": "./dist/esm/observable.js"
86
53
  },
87
54
  "./register": {
88
- "types": "./dist/types/master/register.d.ts",
89
- "import": "./dist/neutral/master/register.mjs",
90
- "default": "./dist/neutral/master/register.mjs"
55
+ "types": "./dist/master/register.d.ts",
56
+ "require": "./dist/master/register/index.js",
57
+ "import": "./dist/esm/master/register/index.js",
58
+ "default": "./dist/esm/master/register/index.js"
91
59
  },
92
60
  "./worker": {
93
- "browser": {
94
- "types": "./dist/types/worker/worker.browser.d.ts",
95
- "import": "./dist/browser/worker/worker.browser.mjs",
96
- "default": "./dist/browser/worker/worker.browser.mjs"
97
- },
98
- "node": {
99
- "types": "./dist/types/worker/worker.node.d.ts",
100
- "import": "./dist/node/worker/worker.node.mjs",
101
- "default": "./dist/node/worker/worker.node.mjs"
102
- }
61
+ "types": "./dist/types/worker.d.ts",
62
+ "require": "./dist/worker/index.js",
63
+ "import": "./dist/esm/worker/index.js",
64
+ "default": "./dist/esm/worker/index.js"
103
65
  }
104
66
  },
105
- "main": "dist/neutral/index.mjs",
106
- "module": "dist/neutral/index.mjs",
107
- "types": "dist/types/index.d.ts",
67
+ "main": "dist/index.js",
68
+ "module": "dist/esm/index.js",
69
+ "browser": {
70
+ "./dist/esm/master/implementation.js": "./dist/esm/master/implementation.browser.js",
71
+ "./dist/esm/master/implementation.node.js": false,
72
+ "./dist/esm/worker/implementation.js": "./dist/esm/worker/implementation.browser.js",
73
+ "./dist/esm/worker/implementation.tiny-worker.js": false,
74
+ "./dist/esm/worker/implementation.worker_threads.js": false,
75
+ "./dist/master/implementation.js": "./dist/master/implementation.browser.js",
76
+ "./dist/master/implementation.node.js": false,
77
+ "./dist/worker/implementation.js": "./dist/worker/implementation.browser.js",
78
+ "./dist/worker/implementation.tiny-worker.js": false,
79
+ "./dist/worker/implementation.worker_threads.js": false,
80
+ "callsites": false,
81
+ "tiny-worker": false,
82
+ "ts-node": false,
83
+ "ts-node/register": false,
84
+ "worker_threads": false
85
+ },
86
+ "types": "dist/index.d.ts",
108
87
  "files": [
109
88
  "dist/**",
110
89
  "*.js",
111
90
  "*.mjs",
112
91
  "*.ts"
113
92
  ],
93
+ "scripts": {
94
+ "build-threads": "yarn clean && yarn build:cjs && yarn build:es",
95
+ "build:cjs": "tsc -p tsconfig.json",
96
+ "build:es": "tsc -p tsconfig-esm.json",
97
+ "bundle": "rollup -c -f umd --file=bundle/worker.js --name=threads --silent -- dist/esm/worker/bundle-entry.js",
98
+ "clean": "rimraf ./dist ./dist-esm",
99
+ "dev": "yarn clean && tsc -p tsconfig.json --watch",
100
+ "package-build": "echo BUILD && yarn build-threads && echo BUILD_DONE",
101
+ "package-compile": "echo COMPILE && yarn build-threads && echo COMPILE_DONE",
102
+ "package-publint": "echo Skipping Publint - @xylabs/threads",
103
+ "postbuild": "yarn bundle",
104
+ "prepare": "yarn build-threads",
105
+ "test": "yarn test:library && yarn test:tooling && yarn test:puppeteer:basic && yarn test:puppeteer:webpack",
106
+ "test:library": "cross-env TS_NODE_FILES=true vitest ./test/**/*.test.ts",
107
+ "test:puppeteer:basic": "puppet-run --plugin=mocha --bundle=./test/workers/:workers/ --serve=./bundle/worker.js:/worker.js ./test/*.chromium*.ts",
108
+ "test:puppeteer:webpack": "puppet-run --serve ./test-tooling/webpack/dist/app.web/0.worker.js --serve ./test-tooling/webpack/dist/app.web/1.worker.js --plugin=mocha ./test-tooling/webpack/webpack.chromium.mocha.ts",
109
+ "test:tooling": "cross-env TS_NODE_FILES=true vitest ./test-tooling/**/*.test.ts"
110
+ },
114
111
  "ava": {
115
112
  "extensions": [
116
113
  "ts"
@@ -125,16 +122,30 @@
125
122
  "serial": true
126
123
  },
127
124
  "dependencies": {
125
+ "callsites-3-1-0": "npm:callsites@3.1.0",
128
126
  "debug": "^4.4.0",
129
127
  "is-observable-2-1-0": "npm:is-observable@2.1.0",
130
128
  "observable-fns": "^0.6.1"
131
129
  },
132
130
  "devDependencies": {
131
+ "@babel/types": "^7.26.10",
132
+ "@rollup/plugin-commonjs": "^28.0.3",
133
+ "@rollup/plugin-node-resolve": "^16.0.1",
133
134
  "@types/debug": "^4.1.12",
134
135
  "@types/node": "^22.13.10",
135
- "@xylabs/eslint-config-flat": "^6.1.4",
136
- "@xylabs/ts-scripts-yarn3": "^6.1.4",
137
- "typescript": "^5.8.2"
136
+ "@xylabs/eslint-config-flat": "^6.1.3",
137
+ "@xylabs/ts-scripts-yarn3": "^6.1.3",
138
+ "cross-env": "^7.0.3",
139
+ "puppet-run": "^0.11.4",
140
+ "raw-loader": "^4.0.2",
141
+ "rimraf": "^6.0.1",
142
+ "rollup": "^4.36.0",
143
+ "threads-plugin": "^1.4.0",
144
+ "tiny-worker": "^2.3.0",
145
+ "tslib": "^2.8.1",
146
+ "typescript": "^5.8.2",
147
+ "vitest": "^3.0.9",
148
+ "webpack": "^5.98.0"
138
149
  },
139
150
  "optionalDependencies": {
140
151
  "tiny-worker": "^2.3.0"
package/register.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ // eslint-disable-next-line import-x/no-internal-modules
2
+ export * from './dist/master/register'
package/register.js ADDED
@@ -0,0 +1,2 @@
1
+ /* eslint-disable @typescript-eslint/no-require-imports */
2
+ require('./dist/master/register')
package/register.mjs ADDED
@@ -0,0 +1 @@
1
+ import './dist/master/register.js'
@@ -0,0 +1,16 @@
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
+ }
package/src/common.ts CHANGED
@@ -1,23 +1,19 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
  import type {
3
3
  JsonSerializable, Serializer, SerializerImplementation,
4
- } from './serializers.ts'
5
- import { DefaultSerializer, extendSerializer } from './serializers.ts'
4
+ } from './serializers'
5
+ import { DefaultSerializer, extendSerializer } from './serializers'
6
6
 
7
- declare global {
8
- var registeredSerializer: Serializer<JsonSerializable>
9
- }
10
-
11
- globalThis.registeredSerializer = globalThis.registeredSerializer ?? DefaultSerializer
7
+ let registeredSerializer: Serializer<JsonSerializable> = DefaultSerializer
12
8
 
13
9
  export function registerSerializer(serializer: SerializerImplementation<JsonSerializable>) {
14
- globalThis.registeredSerializer = extendSerializer(globalThis.registeredSerializer, serializer)
10
+ registeredSerializer = extendSerializer(registeredSerializer, serializer)
15
11
  }
16
12
 
17
13
  export function deserialize(message: JsonSerializable): any {
18
- return globalThis.registeredSerializer.deserialize(message)
14
+ return registeredSerializer.deserialize(message)
19
15
  }
20
16
 
21
17
  export function serialize(input: any): JsonSerializable {
22
- return globalThis.registeredSerializer.serialize(input)
18
+ return registeredSerializer.serialize(input)
23
19
  }
package/src/index.ts CHANGED
@@ -1,11 +1,10 @@
1
1
  /* eslint-disable import-x/no-internal-modules */
2
- export { registerSerializer } from './common.ts'
3
- export * from './master/index.ts'
4
- export type { QueuedTask } from './master/pool.ts'
5
- export type { ExposedToThreadType as ExposedAs } from './master/spawn.ts'
6
- export type {
7
- JsonSerializable, Serializer, SerializerImplementation,
8
- } from './serializers.ts'
9
- export { DefaultSerializer } from './serializers.ts'
10
- export type { TransferDescriptor } from './transferable.ts'
11
- export { Transfer } from './transferable.ts'
2
+ export { registerSerializer } from './common'
3
+ export * from './master/index'
4
+ export { QueuedTask } from './master/pool'
5
+ export { ExposedToThreadType as ExposedAs } from './master/spawn'
6
+ export {
7
+ DefaultSerializer, JsonSerializable, Serializer, SerializerImplementation,
8
+ } from './serializers'
9
+ export { Transfer, TransferDescriptor } from './transferable'
10
+ export { expose } from './worker/index'
@@ -14,8 +14,7 @@ function getBundleURL(): string {
14
14
  // Attempt to find the URL of the current script and use that as the base URL
15
15
  try {
16
16
  throw new Error('getBundleURL failed')
17
- } catch (ex) {
18
- const err = ex as Error
17
+ } catch (err) {
19
18
  const matches = ('' + err.stack).match(/(https?|file|ftp|chrome-extension|moz-extension):\/\/[^\n)]+/g)
20
19
  if (matches) {
21
20
  return getBaseURL(matches[0])
@@ -2,8 +2,8 @@
2
2
  /* eslint-disable import-x/no-internal-modules */
3
3
  // tslint:disable max-classes-per-file
4
4
 
5
- import type { ImplementationExport, ThreadsWorkerOptions } from '../types/master.ts'
6
- import { getBundleURL } from './get-bundle-url.browser.ts'
5
+ import type { ImplementationExport, ThreadsWorkerOptions } from '../types/master'
6
+ import { getBundleURL } from './get-bundle-url.browser'
7
7
 
8
8
  export const defaultPoolSize = typeof navigator !== 'undefined' && navigator.hardwareConcurrency ? navigator.hardwareConcurrency : 4
9
9
 
@@ -1,50 +1,123 @@
1
1
  /* eslint-disable @typescript-eslint/no-require-imports */
2
+ /* eslint-disable import-x/no-internal-modules */
3
+ /* eslint-disable unicorn/no-process-exit */
4
+ /* eslint-disable unicorn/prefer-logical-operator-over-ternary */
5
+ /* eslint-disable unicorn/prefer-regexp-test */
2
6
 
3
7
  /* eslint-disable unicorn/prefer-add-event-listener */
4
8
  /* eslint-disable unicorn/prefer-event-target */
5
9
  /* eslint-disable @typescript-eslint/no-explicit-any */
6
10
  /* eslint-disable unicorn/text-encoding-identifier-case */
11
+ /// <reference lib="dom" />
7
12
 
8
13
  import { EventEmitter } from 'node:events'
9
14
  import { cpus } from 'node:os'
10
15
  import path from 'node:path'
11
- import { cwd } from 'node:process'
12
- import { Worker as NativeWorker } from 'node:worker_threads'
16
+ import { fileURLToPath } from 'node:url'
17
+
18
+ import type { CallSite } from 'callsites-3-1-0'
19
+ import getCallsites from 'callsites-3-1-0'
13
20
 
14
21
  import type {
15
22
  ImplementationExport, ThreadsWorkerOptions, WorkerImplementation,
16
- // eslint-disable-next-line import-x/no-internal-modules
17
- } from '../types/master.ts'
23
+ } from '../types/master'
24
+
25
+ interface WorkerGlobalScope {
26
+ addEventListener(eventName: string, listener: (event: Event) => void): void
27
+ postMessage(message: any, transferables?: any[]): void
28
+ removeEventListener(eventName: string, listener: (event: Event) => void): void
29
+ }
18
30
 
19
31
  declare const __non_webpack_require__: typeof require
32
+ declare const self: WorkerGlobalScope
20
33
 
21
34
  type WorkerEventName = 'error' | 'message'
22
35
 
36
+ let tsNodeAvailable: boolean | undefined
37
+
23
38
  export const defaultPoolSize = cpus().length
24
39
 
40
+ function detectTsNode() {
41
+ if (typeof __non_webpack_require__ === 'function') {
42
+ // Webpack build: => No ts-node required or possible
43
+ return false
44
+ }
45
+ if (tsNodeAvailable) {
46
+ return tsNodeAvailable
47
+ }
48
+
49
+ try {
50
+ eval('require').resolve('ts-node')
51
+ tsNodeAvailable = true
52
+ } catch (error) {
53
+ if (error && error.code === 'MODULE_NOT_FOUND') {
54
+ tsNodeAvailable = false
55
+ } else {
56
+ // Re-throw
57
+ throw error
58
+ }
59
+ }
60
+ return tsNodeAvailable
61
+ }
62
+
63
+ function createTsNodeModule(scriptPath: string) {
64
+ return `
65
+ require("ts-node/register/transpile-only");
66
+ require(${JSON.stringify(scriptPath)});
67
+ `
68
+ }
69
+
70
+ function rebaseScriptPath(scriptPath: string, ignoreRegex: RegExp) {
71
+ const parentCallSite = getCallsites().find((callsite: CallSite) => {
72
+ const filename = callsite.getFileName()
73
+ return Boolean(
74
+ filename && !filename.match(ignoreRegex) && !/[/\\]master[/\\]implementation/.test(filename) && !/^internal\/process/.test(filename),
75
+ )
76
+ })
77
+
78
+ const rawCallerPath = parentCallSite ? parentCallSite.getFileName() : null
79
+ let callerPath = rawCallerPath ? rawCallerPath : null
80
+ if (callerPath && callerPath.startsWith('file:')) {
81
+ callerPath = fileURLToPath(callerPath)
82
+ }
83
+ return callerPath ? path.join(path.dirname(callerPath), scriptPath) : scriptPath
84
+ }
85
+
25
86
  function resolveScriptPath(scriptPath: string, baseURL?: string | undefined) {
26
- const makeAbsolute = (filePath: string) => {
27
- return path.isAbsolute(filePath) ? filePath : path.join(baseURL ?? cwd(), filePath)
87
+ const makeRelative = (filePath: string) => {
88
+ // eval() hack is also webpack-related
89
+ return path.isAbsolute(filePath) ? filePath : path.join(baseURL || eval('__dirname'), filePath)
28
90
  }
29
91
 
30
- const absolutePath = makeAbsolute(scriptPath)
31
- return absolutePath
92
+ return typeof __non_webpack_require__ === 'function'
93
+ ? __non_webpack_require__.resolve(makeRelative(scriptPath))
94
+ : eval('require').resolve(makeRelative(rebaseScriptPath(scriptPath, /[/\\]worker_threads[/\\]/)))
32
95
  }
33
96
 
34
97
  function initWorkerThreadsWorker(): ImplementationExport {
35
- let allWorkers: Array<NativeWorker> = []
98
+ // Webpack hack
99
+ const NativeWorker
100
+ = typeof __non_webpack_require__ === 'function' ? __non_webpack_require__('worker_threads').Worker : eval('require')('worker_threads').Worker
101
+
102
+ let allWorkers: Array<typeof NativeWorker> = []
36
103
 
37
104
  class Worker extends NativeWorker {
38
105
  private mappedEventListeners: WeakMap<EventListener, EventListener>
39
106
 
40
107
  constructor(scriptPath: string, options?: ThreadsWorkerOptions & { fromSource: boolean }) {
41
- const resolvedScriptPath = options && options.fromSource ? null : resolveScriptPath(scriptPath, (options ?? {})._baseURL)
42
- if (resolvedScriptPath) {
43
- super(resolvedScriptPath, options)
44
- } else {
108
+ const resolvedScriptPath = options && options.fromSource ? null : resolveScriptPath(scriptPath, (options || {})._baseURL)
109
+
110
+ if (!resolvedScriptPath) {
45
111
  // `options.fromSource` is true
46
112
  const sourceCode = scriptPath
47
113
  super(sourceCode, { ...options, eval: true })
114
+ } else if (/\.tsx?$/i.test(resolvedScriptPath) && detectTsNode()) {
115
+ super(createTsNodeModule(resolvedScriptPath), { ...options, eval: true })
116
+ } else if (/\.asar[/\\]/.test(resolvedScriptPath)) {
117
+ // See <https://github.com/andywer/threads-plugin/issues/17>
118
+ super(resolvedScriptPath.replace(/\.asar([/\\])/, '.asar.unpacked$1'), options)
119
+ } else {
120
+ super(resolvedScriptPath, options)
48
121
  }
49
122
 
50
123
  this.mappedEventListeners = new WeakMap()
@@ -112,12 +185,17 @@ function initTinyWorker(): ImplementationExport {
112
185
  ? `file:///${resolveScriptPath(scriptPath).replaceAll('\\', '/')}`
113
186
  : resolveScriptPath(scriptPath)
114
187
 
115
- if (resolvedScriptPath) {
116
- super(resolvedScriptPath, [], { esm: true })
117
- } else {
188
+ if (!resolvedScriptPath) {
118
189
  // `options.fromSource` is true
119
190
  const sourceCode = scriptPath
120
191
  super(new Function(sourceCode), [], { esm: true })
192
+ } else if (/\.tsx?$/i.test(resolvedScriptPath) && detectTsNode()) {
193
+ super(new Function(createTsNodeModule(resolveScriptPath(scriptPath))), [], { esm: true })
194
+ } else if (/\.asar[/\\]/.test(resolvedScriptPath)) {
195
+ // See <https://github.com/andywer/threads-plugin/issues/17>
196
+ super(resolvedScriptPath.replace(/\.asar([/\\])/, '.asar.unpacked$1'), [], { esm: true })
197
+ } else {
198
+ super(resolvedScriptPath, [], { esm: true })
121
199
  }
122
200
 
123
201
  allWorkers.push(this)
@@ -178,8 +256,7 @@ function selectWorkerImplementation(): ImplementationExport {
178
256
  try {
179
257
  isTinyWorker = false
180
258
  return initWorkerThreadsWorker()
181
- } catch (ex) {
182
- console.error(ex)
259
+ } catch {
183
260
  // tslint:disable-next-line no-console
184
261
  console.debug('Node worker_threads not available. Trying to fall back to tiny-worker polyfill...')
185
262
  isTinyWorker = true
@@ -196,7 +273,7 @@ export function getWorkerImplementation(): ImplementationExport {
196
273
 
197
274
  export function isWorkerRuntime() {
198
275
  if (isTinyWorker) {
199
- return globalThis !== undefined && self['postMessage'] ? true : false
276
+ return self !== undefined && self['postMessage'] ? true : false
200
277
  } else {
201
278
  // Webpack hack
202
279
  const isMainThread
@@ -6,8 +6,8 @@
6
6
  // browsers already in the package.json, so if get here, it's safe to pass-through the
7
7
  // node implementation
8
8
 
9
- import * as BrowserImplementation from './implementation.browser.ts'
10
- import * as NodeImplementation from './implementation.node.ts'
9
+ import * as BrowserImplementation from './implementation.browser'
10
+ import * as NodeImplementation from './implementation.node'
11
11
 
12
12
  const runningInNode = typeof process !== 'undefined' && (process.arch as string) !== 'browser' && 'pid' in process
13
13
  const implementation = runningInNode ? NodeImplementation : BrowserImplementation
@@ -1,11 +1,11 @@
1
1
  /* eslint-disable import-x/no-internal-modules */
2
- import type { BlobWorker as BlobWorkerClass, Worker as WorkerType } from '../types/master.ts'
3
- import { getWorkerImplementation } from './implementation.ts'
2
+ import type { BlobWorker as BlobWorkerClass, Worker as WorkerType } from '../types/master'
3
+ import { getWorkerImplementation } from './implementation'
4
4
 
5
- export type { FunctionThread, ModuleThread } from '../types/master.ts'
6
- export { Pool } from './pool.ts'
7
- export { spawn } from './spawn.ts'
8
- export { Thread } from './thread.ts'
5
+ export { FunctionThread, ModuleThread } from '../types/master'
6
+ export { Pool } from './pool'
7
+ export { spawn } from './spawn'
8
+ export { Thread } from './thread'
9
9
 
10
10
  export type BlobWorker = typeof BlobWorkerClass
11
11
  export type Worker = WorkerType
@@ -16,4 +16,4 @@ export const BlobWorker = getWorkerImplementation().blob
16
16
  /** Worker implementation. Either web worker or a node.js Worker class. */
17
17
  export const Worker = getWorkerImplementation().default
18
18
 
19
- export { isWorkerRuntime } from './implementation.ts'
19
+ export { isWorkerRuntime } from './implementation'
@@ -10,23 +10,23 @@
10
10
  import DebugLogger from 'debug'
11
11
  import { multicast, Observable } from 'observable-fns'
12
12
 
13
- import { deserialize, serialize } from '../common.ts'
14
- import { ObservablePromise } from '../observable-promise.ts'
15
- import { isTransferDescriptor } from '../transferable.ts'
13
+ import { deserialize, serialize } from '../common'
14
+ import { ObservablePromise } from '../observable-promise'
15
+ import { isTransferDescriptor } from '../transferable'
16
16
  import type {
17
17
  ModuleMethods, ModuleProxy, ProxyableFunction, Worker as WorkerType,
18
- } from '../types/master.ts'
18
+ } from '../types/master'
19
19
  import type {
20
20
  MasterJobCancelMessage,
21
21
  MasterJobRunMessage,
22
22
  WorkerJobErrorMessage,
23
23
  WorkerJobResultMessage,
24
24
  WorkerJobStartMessage,
25
- } from '../types/messages.ts'
25
+ } from '../types/messages'
26
26
  import {
27
27
  MasterMessageType,
28
28
  WorkerMessageType,
29
- } from '../types/messages.ts'
29
+ } from '../types/messages'
30
30
 
31
31
  const debugMessages = DebugLogger('threads:master:messages')
32
32
 
@@ -1,6 +1,6 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
  /* eslint-disable @typescript-eslint/member-ordering */
3
- import type { Thread } from './thread.ts'
3
+ import type { Thread } from './thread'
4
4
 
5
5
  /** Pool event type. Specifies the type of each `PoolEvent`. */
6
6
  export enum PoolEventType {
@@ -1,25 +1,24 @@
1
1
  /* eslint-disable import-x/export */
2
2
  /* eslint-disable unicorn/no-thenable */
3
3
 
4
+ /* eslint-disable require-await */
4
5
  /* eslint-disable @typescript-eslint/member-ordering */
5
6
  /* eslint-disable unicorn/no-array-reduce */
6
7
  /* eslint-disable @typescript-eslint/no-explicit-any */
7
8
  /* eslint-disable @typescript-eslint/no-namespace */
8
-
9
- /// <reference lib="esnext" />
10
-
9
+ /* eslint-disable @typescript-eslint/no-floating-promises */
11
10
  import DebugLogger from 'debug'
12
11
  import {
13
12
  multicast, Observable, Subject,
14
13
  } from 'observable-fns'
15
14
 
16
- import { allSettled } from '../ponyfills.ts'
17
- import { defaultPoolSize } from './implementation.ts'
15
+ import { allSettled } from '../ponyfills'
16
+ import { defaultPoolSize } from './implementation'
18
17
  import type {
19
18
  PoolEvent, QueuedTask, TaskRunFunction, WorkerDescriptor,
20
- } from './pool-types.ts'
21
- import { PoolEventType } from './pool-types.ts'
22
- import { Thread } from './thread.ts'
19
+ } from './pool-types'
20
+ import { PoolEventType } from './pool-types'
21
+ import { Thread } from './thread'
23
22
 
24
23
  export declare namespace Pool {
25
24
  type Event<ThreadType extends Thread = any> = PoolEvent<ThreadType>
@@ -178,8 +177,7 @@ class WorkerPool<ThreadType extends Thread> implements Pool<ThreadType> {
178
177
  type: PoolEventType.taskCompleted,
179
178
  workerID,
180
179
  })
181
- } catch (ex) {
182
- const error = ex as Error
180
+ } catch (error) {
183
181
  this.debug(`Task #${task.id} failed`)
184
182
  this.eventSubject.next({
185
183
  error,
@@ -190,7 +188,7 @@ class WorkerPool<ThreadType extends Thread> implements Pool<ThreadType> {
190
188
  }
191
189
  }
192
190
 
193
- private run(worker: WorkerDescriptor<ThreadType>, task: QueuedTask<ThreadType, any>) {
191
+ private async run(worker: WorkerDescriptor<ThreadType>, task: QueuedTask<ThreadType, any>) {
194
192
  const runPromise = (async () => {
195
193
  const removeTaskFromWorkersRunningTasks = () => {
196
194
  worker.runningTasks = worker.runningTasks.filter(someRunPromise => someRunPromise !== runPromise)
@@ -395,6 +393,7 @@ function PoolConstructor<ThreadType extends Thread>(spawnWorker: () => Promise<T
395
393
  */
396
394
  export const Pool = PoolConstructor as typeof PoolConstructor & { EventType: typeof PoolEventType }
397
395
 
398
- export type { PoolEvent, QueuedTask } from './pool-types.ts'
399
- export { PoolEventType } from './pool-types.ts'
400
- export { Thread } from './thread.ts'
396
+ export {
397
+ PoolEvent, PoolEventType, QueuedTask,
398
+ } from './pool-types'
399
+ export { Thread } from './thread'
@@ -1,6 +1,5 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
- // eslint-disable-next-line no-restricted-imports
3
- import { Worker as WorkerImplementation } from './index.ts'
2
+ import { Worker as WorkerImplementation } from './index'
4
3
 
5
4
  declare const window: any
6
5