@xylabs/threads 4.6.3 → 4.7.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/dist/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/{src/transferable.ts → dist/types/transferable.d.ts} +8 -33
  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 +53 -93
  82. package/dist/common.js +0 -16
  83. package/dist/esm/common.js +0 -16
  84. package/dist/esm/index.js +0 -26
  85. package/dist/esm/master/get-bundle-url.browser.js +0 -25
  86. package/dist/esm/master/implementation.browser.js +0 -65
  87. package/dist/esm/master/implementation.js +0 -43
  88. package/dist/esm/master/implementation.node.js +0 -205
  89. package/dist/esm/master/index.js +0 -14
  90. package/dist/esm/master/invocation-proxy.js +0 -121
  91. package/dist/esm/master/pool-types.js +0 -14
  92. package/dist/esm/master/pool.js +0 -262
  93. package/dist/esm/master/register.js +0 -11
  94. package/dist/esm/master/spawn.js +0 -114
  95. package/dist/esm/master/thread.js +0 -18
  96. package/dist/esm/observable-promise.js +0 -132
  97. package/dist/esm/observable.js +0 -33
  98. package/dist/esm/ponyfills.js +0 -20
  99. package/dist/esm/promise.js +0 -23
  100. package/dist/esm/serializers.js +0 -41
  101. package/dist/esm/symbols.js +0 -8
  102. package/dist/esm/transferable.js +0 -25
  103. package/dist/esm/types/master.js +0 -9
  104. package/dist/esm/types/messages.js +0 -16
  105. package/dist/esm/types/worker.js +0 -2
  106. package/dist/esm/worker/bundle-entry.js +0 -26
  107. package/dist/esm/worker/implementation.browser.js +0 -24
  108. package/dist/esm/worker/implementation.js +0 -19
  109. package/dist/esm/worker/implementation.tiny-worker.js +0 -37
  110. package/dist/esm/worker/implementation.worker_threads.js +0 -41
  111. package/dist/esm/worker/index.js +0 -174
  112. package/dist/esm/worker_threads.js +0 -13
  113. package/dist/index.d.ts +0 -7
  114. package/dist/index.js +0 -26
  115. package/dist/master/get-bundle-url.browser.js +0 -25
  116. package/dist/master/implementation.browser.js +0 -65
  117. package/dist/master/implementation.js +0 -43
  118. package/dist/master/implementation.node.js +0 -205
  119. package/dist/master/index.d.ts +0 -10
  120. package/dist/master/index.js +0 -14
  121. package/dist/master/invocation-proxy.js +0 -121
  122. package/dist/master/pool-types.js +0 -14
  123. package/dist/master/pool.d.ts +0 -50
  124. package/dist/master/pool.js +0 -262
  125. package/dist/master/register.d.ts +0 -1
  126. package/dist/master/register.js +0 -11
  127. package/dist/master/spawn.js +0 -114
  128. package/dist/master/thread.d.ts +0 -8
  129. package/dist/master/thread.js +0 -18
  130. package/dist/observable-promise.js +0 -132
  131. package/dist/observable.d.ts +0 -11
  132. package/dist/observable.js +0 -33
  133. package/dist/ponyfills.js +0 -20
  134. package/dist/promise.d.ts +0 -1
  135. package/dist/promise.js +0 -23
  136. package/dist/serializers.js +0 -41
  137. package/dist/symbols.js +0 -8
  138. package/dist/transferable.d.ts +0 -9
  139. package/dist/transferable.js +0 -25
  140. package/dist/types/master.js +0 -9
  141. package/dist/types/messages.js +0 -16
  142. package/dist/types/worker.js +0 -2
  143. package/dist/worker/bundle-entry.d.ts +0 -1
  144. package/dist/worker/bundle-entry.js +0 -26
  145. package/dist/worker/implementation.browser.d.ts +0 -6
  146. package/dist/worker/implementation.browser.js +0 -24
  147. package/dist/worker/implementation.d.ts +0 -3
  148. package/dist/worker/implementation.js +0 -19
  149. package/dist/worker/implementation.tiny-worker.d.ts +0 -6
  150. package/dist/worker/implementation.tiny-worker.js +0 -37
  151. package/dist/worker/implementation.worker_threads.d.ts +0 -8
  152. package/dist/worker/implementation.worker_threads.js +0 -41
  153. package/dist/worker/index.d.ts +0 -5
  154. package/dist/worker/index.js +0 -174
  155. package/dist/worker_threads.d.ts +0 -8
  156. package/dist/worker_threads.js +0 -13
  157. package/eslint.config.mjs +0 -35
  158. package/index.mjs +0 -10
  159. package/observable.d.ts +0 -2
  160. package/observable.js +0 -2
  161. package/observable.mjs +0 -4
  162. package/register.d.ts +0 -2
  163. package/register.js +0 -2
  164. package/register.mjs +0 -1
  165. package/rollup.config.js +0 -16
  166. package/src/common.ts +0 -19
  167. package/src/index.ts +0 -10
  168. package/src/master/get-bundle-url.browser.ts +0 -31
  169. package/src/master/implementation.browser.ts +0 -82
  170. package/src/master/implementation.node.ts +0 -285
  171. package/src/master/implementation.ts +0 -21
  172. package/src/master/index.ts +0 -19
  173. package/src/master/invocation-proxy.ts +0 -151
  174. package/src/master/pool-types.ts +0 -83
  175. package/src/master/pool.ts +0 -399
  176. package/src/master/register.ts +0 -10
  177. package/src/master/spawn.ts +0 -172
  178. package/src/master/thread.ts +0 -29
  179. package/src/observable-promise.ts +0 -183
  180. package/src/observable.ts +0 -44
  181. package/src/ponyfills.ts +0 -31
  182. package/src/promise.ts +0 -26
  183. package/src/serializers.ts +0 -68
  184. package/src/symbols.ts +0 -5
  185. package/src/types/master.ts +0 -132
  186. package/src/types/messages.ts +0 -72
  187. package/src/types/worker.ts +0 -14
  188. package/src/worker/bundle-entry.ts +0 -10
  189. package/src/worker/implementation.browser.ts +0 -40
  190. package/src/worker/implementation.tiny-worker.ts +0 -55
  191. package/src/worker/implementation.ts +0 -23
  192. package/src/worker/implementation.worker_threads.ts +0 -50
  193. package/src/worker/index.ts +0 -230
  194. package/src/worker_threads.ts +0 -27
  195. package/test/lib/index.ts +0 -1
  196. package/test/lib/serialization.ts +0 -38
  197. package/test/observable-promise.test.ts +0 -205
  198. package/test/observable.test.ts +0 -87
  199. package/test/pool.test.ts +0 -183
  200. package/test/serialization.test.ts +0 -23
  201. package/test/spawn.chromium.mocha.ts +0 -53
  202. package/test/spawn.test.ts +0 -87
  203. package/test/streaming.test.ts +0 -29
  204. package/test/transferables.test.ts +0 -71
  205. package/test/workers/arraybuffer-xor.ts +0 -10
  206. package/test/workers/count-to-five.ts +0 -12
  207. package/test/workers/counter.ts +0 -19
  208. package/test/workers/faulty-function.ts +0 -5
  209. package/test/workers/hello-world.ts +0 -5
  210. package/test/workers/increment.ts +0 -8
  211. package/test/workers/minmax.ts +0 -25
  212. package/test/workers/serialization.ts +0 -13
  213. package/test/workers/top-level-throw.ts +0 -1
  214. package/test-tooling/rollup/app.js +0 -21
  215. package/test-tooling/rollup/rollup.config.ts +0 -14
  216. package/test-tooling/rollup/worker.js +0 -7
  217. package/test-tooling/tsconfig/minimal.ts +0 -12
  218. package/test-tooling/webpack/addition-worker.ts +0 -9
  219. package/test-tooling/webpack/app-with-inlined-worker.ts +0 -28
  220. package/test-tooling/webpack/app.ts +0 -61
  221. package/test-tooling/webpack/pool-worker.ts +0 -5
  222. package/test-tooling/webpack/raw-loader.d.ts +0 -4
  223. package/test-tooling/webpack/webpack.chromium.mocha.ts +0 -21
  224. package/test-tooling/webpack/webpack.node.config.js +0 -29
  225. package/test-tooling/webpack/webpack.web.config.js +0 -28
  226. package/types/is-observable.d.ts +0 -7
  227. package/types/tiny-worker.d.ts +0 -4
  228. package/types/webworker.d.ts +0 -9
  229. package/worker.d.ts +0 -2
  230. package/worker.js +0 -2
  231. package/worker.mjs +0 -6
@@ -1,183 +0,0 @@
1
- /* eslint-disable unicorn/no-thenable */
2
- /* eslint-disable @typescript-eslint/member-ordering */
3
- /* eslint-disable @typescript-eslint/no-floating-promises */
4
-
5
- /* eslint-disable @typescript-eslint/no-explicit-any */
6
- /* eslint-disable @typescript-eslint/no-this-alias */
7
- /* eslint-disable unicorn/no-this-assignment */
8
- import type { ObservableLike, SubscriptionObserver } from 'observable-fns'
9
- import { Observable } from 'observable-fns'
10
-
11
- type OnFulfilled<T, Result = void> = (value: T) => Result
12
- type OnRejected<Result = void> = (error: Error) => Result
13
-
14
- type Initializer<T> = (observer: SubscriptionObserver<T>) => UnsubscribeFn | void
15
-
16
- type Thenable<T> = { then: (onFulfilled?: (value: T) => any, onRejected?: (error: any) => any) => any }
17
-
18
- type UnsubscribeFn = () => void
19
-
20
- const doNothing = () => {}
21
- const returnInput = <T>(input: T): T => input
22
- const runDeferred = (fn: () => void) => Promise.resolve().then(fn)
23
-
24
- function fail(error: Error): never {
25
- throw error
26
- }
27
-
28
- function isThenable(thing: any): thing is Thenable<any> {
29
- return thing && typeof thing.then === 'function'
30
- }
31
-
32
- /**
33
- * Creates a hybrid, combining the APIs of an Observable and a Promise.
34
- *
35
- * It is used to proxy async process states when we are initially not sure
36
- * if that async process will yield values once (-> Promise) or multiple
37
- * times (-> Observable).
38
- *
39
- * Note that the observable promise inherits some of the observable's characteristics:
40
- * The `init` function will be called *once for every time anyone subscribes to it*.
41
- *
42
- * If this is undesired, derive a hot observable from it using `makeHot()` and
43
- * subscribe to that.
44
- */
45
- export class ObservablePromise<T> extends Observable<T> implements Promise<T> {
46
- readonly [Symbol.toStringTag] = '[object ObservablePromise]'
47
- private initHasRun = false
48
- private fulfillmentCallbacks: Array<OnFulfilled<T>> = []
49
- private rejectionCallbacks: OnRejected[] = []
50
-
51
- private firstValue: T | undefined
52
- private firstValueSet = false
53
- private rejection: Error | undefined
54
- private state: 'fulfilled' | 'pending' | 'rejected' = 'pending'
55
-
56
- constructor(init: Initializer<T>) {
57
- super((originalObserver: SubscriptionObserver<T>) => {
58
- // tslint:disable-next-line no-this-assignment
59
- const self = this
60
- const observer: SubscriptionObserver<T> = {
61
- ...originalObserver,
62
- complete() {
63
- originalObserver.complete()
64
- self.onCompletion()
65
- },
66
- error(error: Error) {
67
- originalObserver.error(error)
68
- self.onError(error)
69
- },
70
- next(value: T) {
71
- originalObserver.next(value)
72
- self.onNext(value)
73
- },
74
- }
75
-
76
- try {
77
- this.initHasRun = true
78
- return init(observer)
79
- } catch (error) {
80
- observer.error(error)
81
- }
82
- })
83
- }
84
-
85
- private onNext(value: T) {
86
- if (!this.firstValueSet) {
87
- this.firstValue = value
88
- this.firstValueSet = true
89
- }
90
- }
91
-
92
- private onError(error: Error) {
93
- this.state = 'rejected'
94
- this.rejection = error
95
-
96
- for (const onRejected of this.rejectionCallbacks) {
97
- // Promisifying the call to turn errors into unhandled promise rejections
98
- // instead of them failing sync and cancelling the iteration
99
- runDeferred(() => onRejected(error))
100
- }
101
- }
102
-
103
- private onCompletion() {
104
- this.state = 'fulfilled'
105
-
106
- for (const onFulfilled of this.fulfillmentCallbacks) {
107
- // Promisifying the call to turn errors into unhandled promise rejections
108
- // instead of them failing sync and cancelling the iteration
109
- runDeferred(() => onFulfilled(this.firstValue as T))
110
- }
111
- }
112
-
113
- then<TResult1 = T, TResult2 = never>(
114
- onFulfilledRaw?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null,
115
- onRejectedRaw?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null,
116
- ): Promise<TResult1 | TResult2> {
117
- const onFulfilled: OnFulfilled<T, TResult1> = onFulfilledRaw || (returnInput as any)
118
- const onRejected = onRejectedRaw || fail
119
- let onRejectedCalled = false
120
-
121
- return new Promise<TResult1 | TResult2>((resolve, reject) => {
122
- const rejectionCallback = (error: Error) => {
123
- if (onRejectedCalled) return
124
- onRejectedCalled = true
125
-
126
- try {
127
- resolve(onRejected(error))
128
- } catch (anotherError) {
129
- reject(anotherError)
130
- }
131
- }
132
- const fulfillmentCallback = (value: T) => {
133
- try {
134
- resolve(onFulfilled(value))
135
- } catch (error) {
136
- rejectionCallback(error)
137
- }
138
- }
139
- if (!this.initHasRun) {
140
- this.subscribe({ error: rejectionCallback })
141
- }
142
- if (this.state === 'fulfilled') {
143
- return resolve(onFulfilled(this.firstValue as T))
144
- }
145
- if (this.state === 'rejected') {
146
- onRejectedCalled = true
147
- return resolve(onRejected(this.rejection as Error))
148
- }
149
- this.fulfillmentCallbacks.push(fulfillmentCallback)
150
- this.rejectionCallbacks.push(rejectionCallback)
151
- })
152
- }
153
-
154
- catch<Result = never>(onRejected: ((error: Error) => Promise<Result> | Result) | null | undefined) {
155
- return this.then(undefined, onRejected) as Promise<Result>
156
- }
157
-
158
- finally(onCompleted?: (() => void) | null | undefined) {
159
- const handler = onCompleted || doNothing
160
- return this.then(
161
- (value: T) => {
162
- handler()
163
- return value
164
- },
165
- () => handler(),
166
- ) as Promise<T>
167
- }
168
-
169
- static from<T>(thing: Observable<T> | ObservableLike<T> | ArrayLike<T> | Thenable<T>): ObservablePromise<T> {
170
- return isThenable(thing)
171
- ? new ObservablePromise((observer) => {
172
- const onFulfilled = (value: T) => {
173
- observer.next(value)
174
- observer.complete()
175
- }
176
- const onRejected = (error: any) => {
177
- observer.error(error)
178
- }
179
- thing.then(onFulfilled, onRejected)
180
- })
181
- : (super.from(thing) as ObservablePromise<T>)
182
- }
183
- }
package/src/observable.ts DELETED
@@ -1,44 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import type { ObservableLike, SubscriptionObserver } from 'observable-fns'
3
- import { Observable } from 'observable-fns'
4
-
5
- const $observers = Symbol('observers')
6
-
7
- /**
8
- * Observable subject. Implements the Observable interface, but also exposes
9
- * the `next()`, `error()`, `complete()` methods to initiate observable
10
- * updates "from the outside".
11
- *
12
- * Use `Observable.from(subject)` to derive an observable that proxies all
13
- * values, errors and the completion raised on this subject, but does not
14
- * expose the `next()`, `error()`, `complete()` methods.
15
- */
16
- export class Subject<T> extends Observable<T> implements ObservableLike<T> {
17
- private [$observers]: Array<SubscriptionObserver<T>>
18
-
19
- constructor() {
20
- super((observer) => {
21
- this[$observers] = [...(this[$observers] || []), observer]
22
- const unsubscribe = () => {
23
- this[$observers] = this[$observers].filter(someObserver => someObserver !== observer)
24
- }
25
- return unsubscribe
26
- })
27
-
28
- this[$observers] = []
29
- }
30
-
31
- complete() {
32
- for (const observer of this[$observers]) observer.complete()
33
- }
34
-
35
- error(error: any) {
36
- for (const observer of this[$observers]) observer.error(error)
37
- }
38
-
39
- next(value: T) {
40
- for (const observer of this[$observers]) observer.next(value)
41
- }
42
- }
43
-
44
- export { Observable } from 'observable-fns'
package/src/ponyfills.ts DELETED
@@ -1,31 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
- export type SettlementResult<T> =
3
- | {
4
- status: 'fulfilled'
5
- value: T
6
- }
7
- | {
8
- reason: any
9
- status: 'rejected'
10
- }
11
-
12
- // Based on <https://github.com/es-shims/Promise.allSettled/blob/master/implementation.js>
13
- export function allSettled<T>(values: T[]): Promise<Array<SettlementResult<T>>> {
14
- return Promise.all(
15
- values.map((item) => {
16
- const onFulfill = (value: T) => {
17
- return { status: 'fulfilled', value } as const
18
- }
19
- const onReject = (reason: any) => {
20
- return { reason, status: 'rejected' } as const
21
- }
22
-
23
- const itemPromise = Promise.resolve(item)
24
- try {
25
- return itemPromise.then(onFulfill, onReject)
26
- } catch (error) {
27
- return Promise.reject(error)
28
- }
29
- }),
30
- )
31
- }
package/src/promise.ts DELETED
@@ -1,26 +0,0 @@
1
- // eslint-disable-next-line unicorn/no-useless-undefined
2
- const doNothing = () => undefined
3
-
4
- /**
5
- * Creates a new promise and exposes its resolver function.
6
- * Use with care!
7
- */
8
- export function createPromiseWithResolver<T>(): [Promise<T>, (result: T) => void] {
9
- let alreadyResolved = false
10
- let resolvedTo: T
11
- let resolver: (value: T | PromiseLike<T>) => void = doNothing
12
-
13
- const promise = new Promise<T>((resolve) => {
14
- if (alreadyResolved) {
15
- resolve(resolvedTo)
16
- } else {
17
- resolver = resolve
18
- }
19
- })
20
- const exposedResolver = (value: T) => {
21
- alreadyResolved = true
22
- resolvedTo = value
23
- resolver(resolvedTo)
24
- }
25
- return [promise, exposedResolver]
26
- }
@@ -1,68 +0,0 @@
1
- /* eslint-disable import-x/no-internal-modules */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
3
- import type { SerializedError } from './types/messages'
4
-
5
- export interface Serializer<Msg = JsonSerializable, Input = any> {
6
- deserialize(message: Msg): Input
7
- serialize(input: Input): Msg
8
- }
9
-
10
- export interface SerializerImplementation<Msg = JsonSerializable, Input = any> {
11
- deserialize(message: Msg, defaultDeserialize: (msg: Msg) => Input): Input
12
- serialize(input: Input, defaultSerialize: (inp: Input) => Msg): Msg
13
- }
14
-
15
- export function extendSerializer<MessageType, InputType = any>(
16
- extend: Serializer<MessageType, InputType>,
17
- implementation: SerializerImplementation<MessageType, InputType>,
18
- ): Serializer<MessageType, InputType> {
19
- const fallbackDeserializer = extend.deserialize.bind(extend)
20
- const fallbackSerializer = extend.serialize.bind(extend)
21
-
22
- return {
23
- deserialize(message: MessageType): InputType {
24
- return implementation.deserialize(message, fallbackDeserializer)
25
- },
26
-
27
- serialize(input: InputType): MessageType {
28
- return implementation.serialize(input, fallbackSerializer)
29
- },
30
- }
31
- }
32
-
33
- type JsonSerializablePrimitive = string | number | boolean | null
34
-
35
- type JsonSerializableObject = {
36
- [key: string]: JsonSerializablePrimitive | JsonSerializablePrimitive[] | JsonSerializableObject | JsonSerializableObject[] | undefined
37
- }
38
-
39
- export type JsonSerializable = JsonSerializablePrimitive | JsonSerializablePrimitive[] | JsonSerializableObject | JsonSerializableObject[]
40
-
41
- const DefaultErrorSerializer: Serializer<SerializedError, Error> = {
42
- deserialize(message: SerializedError): Error {
43
- return Object.assign(new Error(message.message), {
44
- name: message.name,
45
- stack: message.stack,
46
- })
47
- },
48
- serialize(error: Error): SerializedError {
49
- return {
50
- __error_marker: '$$error',
51
- message: error.message,
52
- name: error.name,
53
- stack: error.stack,
54
- }
55
- },
56
- }
57
-
58
- const isSerializedError = (thing: any): thing is SerializedError =>
59
- thing && typeof thing === 'object' && '__error_marker' in thing && thing.__error_marker === '$$error'
60
-
61
- export const DefaultSerializer: Serializer<JsonSerializable> = {
62
- deserialize(message: JsonSerializable): any {
63
- return isSerializedError(message) ? DefaultErrorSerializer.deserialize(message) : message
64
- },
65
- serialize(input: any): JsonSerializable {
66
- return input instanceof Error ? (DefaultErrorSerializer.serialize(input) as any as JsonSerializable) : input
67
- },
68
- }
package/src/symbols.ts DELETED
@@ -1,5 +0,0 @@
1
- export const $errors = Symbol('thread.errors')
2
- export const $events = Symbol('thread.events')
3
- export const $terminate = Symbol('thread.terminate')
4
- export const $transferable = Symbol('thread.transferable')
5
- export const $worker = Symbol('thread.worker')
@@ -1,132 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
- /// <reference lib="dom" />
3
- // tslint:disable max-classes-per-file
4
-
5
- // Cannot use `compilerOptions.esModuleInterop` and default import syntax
6
- // See <https://github.com/microsoft/TypeScript/issues/28009>
7
- import type { Observable } from 'observable-fns'
8
-
9
- import type { ObservablePromise } from '../observable-promise'
10
- import type {
11
- $errors, $events, $terminate, $worker,
12
- } from '../symbols'
13
- import type { TransferDescriptor } from '../transferable'
14
-
15
- interface ObservableLikeSubscription {
16
- unsubscribe(): any
17
- }
18
- interface ObservableLike<T> {
19
- subscribe(onNext: (value: T) => any, onError?: (error: any) => any, onComplete?: () => any): ObservableLikeSubscription
20
- subscribe(listeners: { complete?(): any; error?(error: any): any; next?(value: T): any }): ObservableLikeSubscription
21
- }
22
-
23
- export type StripAsync<Type> =
24
- Type extends Promise<infer PromiseBaseType> ? PromiseBaseType
25
- : Type extends ObservableLike<infer ObservableBaseType> ? ObservableBaseType
26
- : Type
27
-
28
- type StripTransfer<Type> = Type extends TransferDescriptor<infer BaseType> ? BaseType : Type
29
-
30
- export type ModuleMethods = { [methodName: string]: (...args: any) => any }
31
-
32
- type ProxyableArgs<Args extends any[]> =
33
- Args extends [arg0: infer Arg0, ...rest: infer RestArgs] ? [Arg0 extends Transferable ? Arg0 | TransferDescriptor<Arg0> : Arg0, ...RestArgs] : Args
34
-
35
- export type ProxyableFunction<Args extends any[], ReturnType> =
36
- Args extends [] ? () => ObservablePromise<StripTransfer<StripAsync<ReturnType>>>
37
- : (...args: ProxyableArgs<Args>) => ObservablePromise<StripTransfer<StripAsync<ReturnType>>>
38
-
39
- export type ModuleProxy<Methods extends ModuleMethods> = {
40
- [method in keyof Methods]: ProxyableFunction<Parameters<Methods[method]>, ReturnType<Methods[method]>>
41
- }
42
-
43
- export interface PrivateThreadProps {
44
- [$errors]: Observable<Error>
45
- [$events]: Observable<WorkerEvent>
46
- [$terminate]: () => Promise<void>
47
- [$worker]: Worker
48
- }
49
-
50
- export type FunctionThread<Args extends any[] = any[], ReturnType = any> = ProxyableFunction<Args, ReturnType> & PrivateThreadProps
51
- export type ModuleThread<Methods extends ModuleMethods = any> = ModuleProxy<Methods> & PrivateThreadProps
52
-
53
- // We have those extra interfaces to keep the general non-specific `Thread` type
54
- // as an interface, so it's displayed concisely in any TypeScript compiler output.
55
- interface AnyFunctionThread extends PrivateThreadProps {
56
- (...args: any[]): ObservablePromise<any>
57
- }
58
-
59
- // tslint:disable-next-line no-empty-interface
60
- interface AnyModuleThread extends PrivateThreadProps {
61
- // Not specifying an index signature here as that would make `ModuleThread` incompatible
62
- }
63
-
64
- /** Worker thread. Either a `FunctionThread` or a `ModuleThread`. */
65
- export type Thread = AnyFunctionThread | AnyModuleThread
66
-
67
- export type TransferList = Transferable[]
68
-
69
- /** Worker instance. Either a web worker or a node.js Worker provided by `worker_threads` or `tiny-worker`. */
70
- export interface Worker extends EventTarget {
71
- postMessage(value: any, transferList?: TransferList): void
72
- /** In nodejs 10+ return type is Promise while with tiny-worker and in browser return type is void */
73
- terminate(callback?: (error?: Error, exitCode?: number) => void): void | Promise<number>
74
- }
75
- export interface ThreadsWorkerOptions extends WorkerOptions {
76
- /** Whether to apply CORS protection workaround. Defaults to true. */
77
- CORSWorkaround?: boolean
78
- /** Prefix for the path passed to the Worker constructor. Web worker only. */
79
- _baseURL?: string
80
- /** Resource limits passed on to Node worker_threads */
81
- resourceLimits?: {
82
- /** The size of a pre-allocated memory range used for generated code. */
83
- codeRangeSizeMb?: number
84
- /** The maximum size of the main heap in MB. */
85
- maxOldGenerationSizeMb?: number
86
- /** The maximum size of a heap space for recently created objects. */
87
- maxYoungGenerationSizeMb?: number
88
- }
89
- /** Data passed on to node.js worker_threads. */
90
- workerData?: any
91
- }
92
-
93
- /** Worker implementation. Either web worker or a node.js Worker class. */
94
- export declare class WorkerImplementation extends EventTarget implements Worker {
95
- constructor(path: string, options?: ThreadsWorkerOptions)
96
- postMessage(value: any, transferList?: TransferList): void
97
- terminate(): void | Promise<number>
98
- }
99
-
100
- /** Class to spawn workers from a blob or source string. */
101
- export declare class BlobWorker extends WorkerImplementation {
102
- constructor(blob: Blob, options?: ThreadsWorkerOptions)
103
- static fromText(source: string, options?: ThreadsWorkerOptions): WorkerImplementation
104
- }
105
-
106
- export interface ImplementationExport {
107
- blob: typeof BlobWorker
108
- default: typeof WorkerImplementation
109
- }
110
-
111
- /** Event as emitted by worker thread. Subscribe to using `Thread.events(thread)`. */
112
- export enum WorkerEventType {
113
- internalError = 'internalError',
114
- message = 'message',
115
- termination = 'termination',
116
- }
117
-
118
- export interface WorkerInternalErrorEvent {
119
- error: Error
120
- type: WorkerEventType.internalError
121
- }
122
-
123
- export interface WorkerMessageEvent<Data> {
124
- data: Data
125
- type: WorkerEventType.message
126
- }
127
-
128
- export interface WorkerTerminationEvent {
129
- type: WorkerEventType.termination
130
- }
131
-
132
- export type WorkerEvent = WorkerInternalErrorEvent | WorkerMessageEvent<any> | WorkerTerminationEvent
@@ -1,72 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
- /* eslint-disable @typescript-eslint/member-ordering */
3
- export interface SerializedError {
4
- __error_marker: '$$error'
5
- message: string
6
- name: string
7
- stack?: string
8
- }
9
-
10
- /////////////////////////////
11
- // Messages sent by master:
12
-
13
- export enum MasterMessageType {
14
- cancel = 'cancel',
15
- run = 'run',
16
- }
17
-
18
- export type MasterJobCancelMessage = {
19
- type: MasterMessageType.cancel
20
- uid: number
21
- }
22
-
23
- export type MasterJobRunMessage = {
24
- type: MasterMessageType.run
25
- uid: number
26
- method?: string
27
- args: any[]
28
- }
29
-
30
- ////////////////////////////
31
- // Messages sent by worker:
32
-
33
- export enum WorkerMessageType {
34
- error = 'error',
35
- init = 'init',
36
- result = 'result',
37
- running = 'running',
38
- uncaughtError = 'uncaughtError',
39
- }
40
-
41
- export type WorkerUncaughtErrorMessage = {
42
- type: WorkerMessageType.uncaughtError
43
- error: {
44
- message: string
45
- name: string
46
- stack?: string
47
- }
48
- }
49
-
50
- export type WorkerInitMessage = {
51
- type: WorkerMessageType.init
52
- exposed: { type: 'function' } | { type: 'module'; methods: string[] }
53
- }
54
-
55
- export type WorkerJobErrorMessage = {
56
- type: WorkerMessageType.error
57
- uid: number
58
- error: SerializedError
59
- }
60
-
61
- export type WorkerJobResultMessage = {
62
- type: WorkerMessageType.result
63
- uid: number
64
- complete?: true
65
- payload?: any
66
- }
67
-
68
- export type WorkerJobStartMessage = {
69
- type: WorkerMessageType.running
70
- uid: number
71
- resultType: 'observable' | 'promise'
72
- }
@@ -1,14 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
- type UnsubscribeFn = () => void
3
-
4
- export interface AbstractedWorkerAPI {
5
- isWorkerRuntime(): boolean
6
- postMessageToMaster(message: any, transferList?: Transferable[]): void
7
- subscribeToMasterMessages(onMessage: (data: any) => void): UnsubscribeFn
8
- }
9
-
10
- export type WorkerFunction = ((...args: any[]) => any) | (() => any)
11
-
12
- export type WorkerModule<Keys extends string> = {
13
- [key in Keys]: WorkerFunction
14
- }
@@ -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,40 +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
-
16
- const isWorkerRuntime: AbstractedWorkerAPI['isWorkerRuntime'] = function isWorkerRuntime() {
17
- const isWindowContext = self !== undefined && typeof Window !== 'undefined' && self instanceof Window
18
- return self !== undefined && self['postMessage'] && !isWindowContext ? true : false
19
- }
20
-
21
- const postMessageToMaster: AbstractedWorkerAPI['postMessageToMaster'] = function postMessageToMaster(data, transferList?) {
22
- self.postMessage(data, transferList)
23
- }
24
-
25
- const subscribeToMasterMessages: AbstractedWorkerAPI['subscribeToMasterMessages'] = function subscribeToMasterMessages(onMessage) {
26
- const messageHandler = (messageEvent: MessageEvent) => {
27
- onMessage(messageEvent.data)
28
- }
29
- const unsubscribe = () => {
30
- self.removeEventListener('message', messageHandler as EventListener)
31
- }
32
- self.addEventListener('message', messageHandler as EventListener)
33
- return unsubscribe
34
- }
35
-
36
- export default {
37
- isWorkerRuntime,
38
- postMessageToMaster,
39
- subscribeToMasterMessages,
40
- }
@@ -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
- }