@loaders.gl/worker-utils 4.0.0-alpha.4 → 4.0.0-alpha.6

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 (217) hide show
  1. package/dist/es5/index.js +148 -0
  2. package/dist/es5/index.js.map +1 -0
  3. package/dist/es5/lib/async-queue/async-queue.js +100 -0
  4. package/dist/es5/lib/async-queue/async-queue.js.map +1 -0
  5. package/dist/es5/lib/env-utils/assert.js +12 -0
  6. package/dist/es5/lib/env-utils/assert.js.map +1 -0
  7. package/dist/es5/lib/env-utils/globals.js +32 -0
  8. package/dist/es5/lib/env-utils/globals.js.map +1 -0
  9. package/dist/es5/lib/env-utils/version.js +13 -0
  10. package/dist/es5/lib/env-utils/version.js.map +1 -0
  11. package/dist/es5/lib/library-utils/library-utils.js +154 -0
  12. package/dist/es5/lib/library-utils/library-utils.js.map +1 -0
  13. package/dist/es5/lib/node/require-utils.node.js +71 -0
  14. package/dist/es5/lib/node/require-utils.node.js.map +1 -0
  15. package/dist/es5/lib/node/worker_threads-browser.js +23 -0
  16. package/dist/es5/lib/node/worker_threads-browser.js.map +1 -0
  17. package/dist/es5/lib/node/worker_threads.js +27 -0
  18. package/dist/es5/lib/node/worker_threads.js.map +1 -0
  19. package/dist/es5/lib/process-utils/child-process-proxy.js +193 -0
  20. package/dist/es5/lib/process-utils/child-process-proxy.js.map +1 -0
  21. package/dist/es5/lib/process-utils/process-utils.js +33 -0
  22. package/dist/es5/lib/process-utils/process-utils.js.map +1 -0
  23. package/dist/es5/lib/worker-api/create-worker.js +166 -0
  24. package/dist/es5/lib/worker-api/create-worker.js.map +1 -0
  25. package/dist/es5/lib/worker-api/get-worker-url.js +38 -0
  26. package/dist/es5/lib/worker-api/get-worker-url.js.map +1 -0
  27. package/dist/es5/lib/worker-api/process-on-worker.js +137 -0
  28. package/dist/es5/lib/worker-api/process-on-worker.js.map +1 -0
  29. package/dist/es5/lib/worker-api/validate-worker-version.js +25 -0
  30. package/dist/es5/lib/worker-api/validate-worker-version.js.map +1 -0
  31. package/dist/es5/lib/worker-farm/worker-body.js +109 -0
  32. package/dist/es5/lib/worker-farm/worker-body.js.map +1 -0
  33. package/dist/es5/lib/worker-farm/worker-farm.js +113 -0
  34. package/dist/es5/lib/worker-farm/worker-farm.js.map +1 -0
  35. package/dist/es5/lib/worker-farm/worker-job.js +56 -0
  36. package/dist/es5/lib/worker-farm/worker-job.js.map +1 -0
  37. package/dist/es5/lib/worker-farm/worker-pool.js +211 -0
  38. package/dist/es5/lib/worker-farm/worker-pool.js.map +1 -0
  39. package/dist/es5/lib/worker-farm/worker-thread.js +136 -0
  40. package/dist/es5/lib/worker-farm/worker-thread.js.map +1 -0
  41. package/dist/es5/lib/worker-utils/get-loadable-worker-url.js +41 -0
  42. package/dist/es5/lib/worker-utils/get-loadable-worker-url.js.map +1 -0
  43. package/dist/es5/lib/worker-utils/get-transfer-list.js +59 -0
  44. package/dist/es5/lib/worker-utils/get-transfer-list.js.map +1 -0
  45. package/dist/es5/lib/worker-utils/remove-nontransferable-options.js +25 -0
  46. package/dist/es5/lib/worker-utils/remove-nontransferable-options.js.map +1 -0
  47. package/dist/es5/types.js +2 -0
  48. package/dist/es5/types.js.map +1 -0
  49. package/dist/es5/workers/null-worker.js +23 -0
  50. package/dist/es5/workers/null-worker.js.map +1 -0
  51. package/dist/esm/index.js +26 -0
  52. package/dist/esm/index.js.map +1 -0
  53. package/dist/esm/lib/async-queue/async-queue.js +76 -0
  54. package/dist/esm/lib/async-queue/async-queue.js.map +1 -0
  55. package/dist/esm/lib/env-utils/assert.js +6 -0
  56. package/dist/esm/lib/env-utils/assert.js.map +1 -0
  57. package/dist/esm/lib/env-utils/globals.js +17 -0
  58. package/dist/esm/lib/env-utils/globals.js.map +1 -0
  59. package/dist/esm/lib/env-utils/version.js +6 -0
  60. package/dist/esm/lib/env-utils/version.js.map +1 -0
  61. package/dist/esm/lib/library-utils/library-utils.js +74 -0
  62. package/dist/esm/lib/library-utils/library-utils.js.map +1 -0
  63. package/dist/esm/lib/node/require-utils.node.js +36 -0
  64. package/dist/esm/lib/node/require-utils.node.js.map +1 -0
  65. package/dist/esm/lib/node/worker_threads-browser.js +7 -0
  66. package/dist/esm/lib/node/worker_threads-browser.js.map +1 -0
  67. package/dist/esm/lib/node/worker_threads.js +4 -0
  68. package/dist/esm/lib/node/worker_threads.js.map +1 -0
  69. package/dist/esm/lib/process-utils/child-process-proxy.js +104 -0
  70. package/dist/esm/lib/process-utils/child-process-proxy.js.map +1 -0
  71. package/dist/esm/lib/process-utils/process-utils.js +26 -0
  72. package/dist/esm/lib/process-utils/process-utils.js.map +1 -0
  73. package/dist/esm/lib/worker-api/create-worker.js +84 -0
  74. package/dist/esm/lib/worker-api/create-worker.js.map +1 -0
  75. package/dist/esm/lib/worker-api/get-worker-url.js +31 -0
  76. package/dist/esm/lib/worker-api/get-worker-url.js.map +1 -0
  77. package/dist/esm/lib/worker-api/process-on-worker.js +75 -0
  78. package/dist/esm/lib/worker-api/process-on-worker.js.map +1 -0
  79. package/dist/esm/lib/worker-api/validate-worker-version.js +19 -0
  80. package/dist/esm/lib/worker-api/validate-worker-version.js.map +1 -0
  81. package/dist/esm/lib/worker-farm/worker-body.js +86 -0
  82. package/dist/esm/lib/worker-farm/worker-body.js.map +1 -0
  83. package/dist/esm/lib/worker-farm/worker-farm.js +72 -0
  84. package/dist/esm/lib/worker-farm/worker-farm.js.map +1 -0
  85. package/dist/esm/lib/worker-farm/worker-job.js +36 -0
  86. package/dist/esm/lib/worker-farm/worker-job.js.map +1 -0
  87. package/dist/esm/lib/worker-farm/worker-pool.js +124 -0
  88. package/dist/esm/lib/worker-farm/worker-pool.js.map +1 -0
  89. package/dist/esm/lib/worker-farm/worker-thread.js +105 -0
  90. package/dist/esm/lib/worker-farm/worker-thread.js.map +1 -0
  91. package/dist/esm/lib/worker-utils/get-loadable-worker-url.js +35 -0
  92. package/dist/esm/lib/worker-utils/get-loadable-worker-url.js.map +1 -0
  93. package/dist/esm/lib/worker-utils/get-transfer-list.js +50 -0
  94. package/dist/esm/lib/worker-utils/get-transfer-list.js.map +1 -0
  95. package/dist/esm/lib/worker-utils/remove-nontransferable-options.js +17 -0
  96. package/dist/esm/lib/worker-utils/remove-nontransferable-options.js.map +1 -0
  97. package/dist/esm/types.js +2 -0
  98. package/dist/esm/types.js.map +1 -0
  99. package/dist/esm/workers/null-worker.js +5 -0
  100. package/dist/esm/workers/null-worker.js.map +1 -0
  101. package/dist/index.d.ts +20 -0
  102. package/dist/index.d.ts.map +1 -0
  103. package/dist/index.js +58 -25
  104. package/dist/lib/async-queue/async-queue.d.ts +32 -0
  105. package/dist/lib/async-queue/async-queue.d.ts.map +1 -0
  106. package/dist/lib/async-queue/async-queue.js +81 -91
  107. package/dist/lib/env-utils/assert.d.ts +3 -0
  108. package/dist/lib/env-utils/assert.d.ts.map +1 -0
  109. package/dist/lib/env-utils/assert.js +12 -5
  110. package/dist/lib/env-utils/globals.d.ts +22 -0
  111. package/dist/lib/env-utils/globals.d.ts.map +1 -0
  112. package/dist/lib/env-utils/globals.js +25 -10
  113. package/dist/lib/env-utils/version.d.ts +2 -0
  114. package/dist/lib/env-utils/version.d.ts.map +1 -0
  115. package/dist/lib/env-utils/version.js +10 -5
  116. package/dist/lib/library-utils/library-utils.d.ts +18 -0
  117. package/dist/lib/library-utils/library-utils.d.ts.map +1 -0
  118. package/dist/lib/library-utils/library-utils.js +161 -75
  119. package/dist/lib/node/require-utils.node.d.ts +6 -0
  120. package/dist/lib/node/require-utils.node.d.ts.map +1 -0
  121. package/dist/lib/node/require-utils.node.js +58 -41
  122. package/dist/lib/node/worker_threads-browser.d.ts +7 -0
  123. package/dist/lib/node/worker_threads-browser.d.ts.map +1 -0
  124. package/dist/lib/node/worker_threads-browser.js +15 -0
  125. package/dist/lib/node/worker_threads.d.ts +6 -0
  126. package/dist/lib/node/worker_threads.d.ts.map +1 -0
  127. package/dist/lib/node/worker_threads.js +33 -0
  128. package/dist/lib/process-utils/child-process-proxy.d.ts +43 -0
  129. package/dist/lib/process-utils/child-process-proxy.d.ts.map +1 -0
  130. package/dist/lib/process-utils/child-process-proxy.js +126 -113
  131. package/dist/lib/process-utils/process-utils.d.ts +2 -0
  132. package/dist/lib/process-utils/process-utils.d.ts.map +1 -0
  133. package/dist/lib/process-utils/process-utils.js +33 -27
  134. package/dist/lib/worker-api/create-worker.d.ts +9 -0
  135. package/dist/lib/worker-api/create-worker.d.ts.map +1 -0
  136. package/dist/lib/worker-api/create-worker.js +84 -92
  137. package/dist/lib/worker-api/get-worker-url.d.ts +14 -0
  138. package/dist/lib/worker-api/get-worker-url.d.ts.map +1 -0
  139. package/dist/lib/worker-api/get-worker-url.js +55 -29
  140. package/dist/lib/worker-api/process-on-worker.d.ts +20 -0
  141. package/dist/lib/worker-api/process-on-worker.d.ts.map +1 -0
  142. package/dist/lib/worker-api/process-on-worker.js +79 -71
  143. package/dist/lib/worker-api/validate-worker-version.d.ts +9 -0
  144. package/dist/lib/worker-api/validate-worker-version.d.ts.map +1 -0
  145. package/dist/lib/worker-api/validate-worker-version.js +32 -18
  146. package/dist/lib/worker-farm/worker-body.d.ts +18 -0
  147. package/dist/lib/worker-farm/worker-body.d.ts.map +1 -0
  148. package/dist/lib/worker-farm/worker-body.js +104 -58
  149. package/dist/lib/worker-farm/worker-farm.d.ts +59 -0
  150. package/dist/lib/worker-farm/worker-farm.d.ts.map +1 -0
  151. package/dist/lib/worker-farm/worker-farm.js +83 -77
  152. package/dist/lib/worker-farm/worker-job.d.ts +29 -0
  153. package/dist/lib/worker-farm/worker-job.d.ts.map +1 -0
  154. package/dist/lib/worker-farm/worker-job.js +46 -53
  155. package/dist/lib/worker-farm/worker-pool.d.ts +77 -0
  156. package/dist/lib/worker-farm/worker-pool.d.ts.map +1 -0
  157. package/dist/lib/worker-farm/worker-pool.js +145 -147
  158. package/dist/lib/worker-farm/worker-thread.d.ts +49 -0
  159. package/dist/lib/worker-farm/worker-thread.d.ts.map +1 -0
  160. package/dist/lib/worker-farm/worker-thread.js +128 -102
  161. package/dist/lib/worker-utils/get-loadable-worker-url.d.ts +14 -0
  162. package/dist/lib/worker-utils/get-loadable-worker-url.d.ts.map +1 -0
  163. package/dist/lib/worker-utils/get-loadable-worker-url.js +63 -33
  164. package/dist/lib/worker-utils/get-transfer-list.d.ts +15 -0
  165. package/dist/lib/worker-utils/get-transfer-list.d.ts.map +1 -0
  166. package/dist/lib/worker-utils/get-transfer-list.js +83 -36
  167. package/dist/lib/worker-utils/remove-nontransferable-options.d.ts +6 -0
  168. package/dist/lib/worker-utils/remove-nontransferable-options.d.ts.map +1 -0
  169. package/dist/lib/worker-utils/remove-nontransferable-options.js +25 -21
  170. package/dist/null-worker.js +219 -549
  171. package/dist/null-worker.js.map +7 -1
  172. package/dist/types.d.ts +62 -0
  173. package/dist/types.d.ts.map +1 -0
  174. package/dist/types.js +2 -2
  175. package/dist/workers/null-worker.d.ts +2 -0
  176. package/dist/workers/null-worker.d.ts.map +1 -0
  177. package/dist/workers/null-worker.js +6 -4
  178. package/package.json +13 -7
  179. package/src/index.ts +1 -1
  180. package/src/lib/library-utils/library-utils.ts +9 -2
  181. package/src/lib/node/worker_threads-browser.ts +13 -0
  182. package/src/lib/node/worker_threads.ts +6 -0
  183. package/src/lib/worker-api/create-worker.ts +1 -2
  184. package/src/lib/worker-api/get-worker-url.ts +13 -1
  185. package/src/lib/worker-api/process-on-worker.ts +8 -4
  186. package/src/lib/worker-farm/worker-body.ts +61 -19
  187. package/src/lib/worker-farm/worker-farm.ts +10 -5
  188. package/src/lib/worker-farm/worker-job.ts +3 -6
  189. package/src/lib/worker-farm/worker-pool.ts +5 -0
  190. package/src/lib/worker-farm/worker-thread.ts +45 -7
  191. package/src/lib/worker-utils/get-loadable-worker-url.ts +0 -2
  192. package/src/lib/worker-utils/get-transfer-list.ts +28 -0
  193. package/src/lib/worker-utils/remove-nontransferable-options.ts +17 -25
  194. package/src/types.ts +4 -2
  195. package/dist/index.js.map +0 -1
  196. package/dist/lib/async-queue/async-queue.js.map +0 -1
  197. package/dist/lib/env-utils/assert.js.map +0 -1
  198. package/dist/lib/env-utils/globals.js.map +0 -1
  199. package/dist/lib/env-utils/version.js.map +0 -1
  200. package/dist/lib/library-utils/library-utils.js.map +0 -1
  201. package/dist/lib/node/require-utils.node.js.map +0 -1
  202. package/dist/lib/process-utils/child-process-proxy.js.map +0 -1
  203. package/dist/lib/process-utils/process-utils.js.map +0 -1
  204. package/dist/lib/worker-api/create-worker.js.map +0 -1
  205. package/dist/lib/worker-api/get-worker-url.js.map +0 -1
  206. package/dist/lib/worker-api/process-on-worker.js.map +0 -1
  207. package/dist/lib/worker-api/validate-worker-version.js.map +0 -1
  208. package/dist/lib/worker-farm/worker-body.js.map +0 -1
  209. package/dist/lib/worker-farm/worker-farm.js.map +0 -1
  210. package/dist/lib/worker-farm/worker-job.js.map +0 -1
  211. package/dist/lib/worker-farm/worker-pool.js.map +0 -1
  212. package/dist/lib/worker-farm/worker-thread.js.map +0 -1
  213. package/dist/lib/worker-utils/get-loadable-worker-url.js.map +0 -1
  214. package/dist/lib/worker-utils/get-transfer-list.js.map +0 -1
  215. package/dist/lib/worker-utils/remove-nontransferable-options.js.map +0 -1
  216. package/dist/types.js.map +0 -1
  217. package/dist/workers/null-worker.js.map +0 -1
@@ -0,0 +1,29 @@
1
+ import type { WorkerMessageType, WorkerMessagePayload } from '../../types';
2
+ import WorkerThread from './worker-thread';
3
+ /**
4
+ * Represents one Job handled by a WorkerPool or WorkerFarm
5
+ */
6
+ export default class WorkerJob {
7
+ readonly name: string;
8
+ readonly workerThread: WorkerThread;
9
+ isRunning: boolean;
10
+ /** Promise that resolves when Job is done */
11
+ readonly result: Promise<any>;
12
+ private _resolve;
13
+ private _reject;
14
+ constructor(jobName: string, workerThread: WorkerThread);
15
+ /**
16
+ * Send a message to the job's worker thread
17
+ * @param data any data structure, ideally consisting mostly of transferrable objects
18
+ */
19
+ postMessage(type: WorkerMessageType, payload: WorkerMessagePayload): void;
20
+ /**
21
+ * Call to resolve the `result` Promise with the supplied value
22
+ */
23
+ done(value: any): void;
24
+ /**
25
+ * Call to reject the `result` Promise with the supplied error
26
+ */
27
+ error(error: Error): void;
28
+ }
29
+ //# sourceMappingURL=worker-job.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-job.d.ts","sourceRoot":"","sources":["../../../src/lib/worker-farm/worker-job.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,iBAAiB,EAAE,oBAAoB,EAAC,MAAM,aAAa,CAAC;AACzE,OAAO,YAAY,MAAM,iBAAiB,CAAC;AAG3C;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,SAAS;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,SAAS,EAAE,OAAO,CAAQ;IAC1B,6CAA6C;IAC7C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAE9B,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,OAAO,CAAoC;gBAEvC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY;IASvD;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,oBAAoB,GAAG,IAAI;IAQzE;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAMtB;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;CAK1B"}
@@ -1,54 +1,47 @@
1
- import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
- import { assert } from '../env-utils/assert';
3
- export default class WorkerJob {
4
- constructor(jobName, workerThread) {
5
- _defineProperty(this, "name", void 0);
6
-
7
- _defineProperty(this, "workerThread", void 0);
8
-
9
- _defineProperty(this, "isRunning", void 0);
10
-
11
- _defineProperty(this, "result", void 0);
12
-
13
- _defineProperty(this, "_resolve", void 0);
14
-
15
- _defineProperty(this, "_reject", void 0);
16
-
17
- this.name = jobName;
18
- this.workerThread = workerThread;
19
- this.isRunning = true;
20
-
21
- this._resolve = () => {};
22
-
23
- this._reject = () => {};
24
-
25
- this.result = new Promise((resolve, reject) => {
26
- this._resolve = resolve;
27
- this._reject = reject;
28
- });
29
- }
30
-
31
- postMessage(type, payload) {
32
- this.workerThread.postMessage({
33
- source: 'loaders.gl',
34
- type,
35
- payload
36
- });
37
- }
38
-
39
- done(value) {
40
- assert(this.isRunning);
41
- this.isRunning = false;
42
-
43
- this._resolve(value);
44
- }
45
-
46
- error(error) {
47
- assert(this.isRunning);
48
- this.isRunning = false;
49
-
50
- this._reject(error);
51
- }
52
-
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const assert_1 = require("../env-utils/assert");
4
+ /**
5
+ * Represents one Job handled by a WorkerPool or WorkerFarm
6
+ */
7
+ class WorkerJob {
8
+ constructor(jobName, workerThread) {
9
+ this.isRunning = true;
10
+ this._resolve = () => { };
11
+ this._reject = () => { };
12
+ this.name = jobName;
13
+ this.workerThread = workerThread;
14
+ this.result = new Promise((resolve, reject) => {
15
+ this._resolve = resolve;
16
+ this._reject = reject;
17
+ });
18
+ }
19
+ /**
20
+ * Send a message to the job's worker thread
21
+ * @param data any data structure, ideally consisting mostly of transferrable objects
22
+ */
23
+ postMessage(type, payload) {
24
+ this.workerThread.postMessage({
25
+ source: 'loaders.gl',
26
+ type,
27
+ payload
28
+ });
29
+ }
30
+ /**
31
+ * Call to resolve the `result` Promise with the supplied value
32
+ */
33
+ done(value) {
34
+ (0, assert_1.assert)(this.isRunning);
35
+ this.isRunning = false;
36
+ this._resolve(value);
37
+ }
38
+ /**
39
+ * Call to reject the `result` Promise with the supplied error
40
+ */
41
+ error(error) {
42
+ (0, assert_1.assert)(this.isRunning);
43
+ this.isRunning = false;
44
+ this._reject(error);
45
+ }
53
46
  }
54
- //# sourceMappingURL=worker-job.js.map
47
+ exports.default = WorkerJob;
@@ -0,0 +1,77 @@
1
+ import type { WorkerMessageType, WorkerMessagePayload } from '../../types';
2
+ import WorkerThread from './worker-thread';
3
+ import WorkerJob from './worker-job';
4
+ /** WorkerPool onDebug Callback Parameters */
5
+ type OnDebugParameters = {
6
+ message: string;
7
+ worker: string;
8
+ name: string;
9
+ job: string;
10
+ backlog: number;
11
+ workerThread: WorkerThread;
12
+ };
13
+ /** WorkerPool Properties */
14
+ export type WorkerPoolProps = {
15
+ name?: string;
16
+ source?: string;
17
+ url?: string;
18
+ maxConcurrency?: number;
19
+ maxMobileConcurrency?: number;
20
+ onDebug?: (options: OnDebugParameters) => any;
21
+ reuseWorkers?: boolean;
22
+ };
23
+ /** Private helper types */
24
+ type OnMessage = (job: WorkerJob, type: WorkerMessageType, payload: WorkerMessagePayload) => void;
25
+ type OnError = (job: WorkerJob, error: Error) => void;
26
+ /**
27
+ * Process multiple data messages with small pool of identical workers
28
+ */
29
+ export default class WorkerPool {
30
+ name: string;
31
+ source?: string;
32
+ url?: string;
33
+ maxConcurrency: number;
34
+ maxMobileConcurrency: number;
35
+ onDebug: (options: OnDebugParameters) => any;
36
+ reuseWorkers: boolean;
37
+ private props;
38
+ private jobQueue;
39
+ private idleQueue;
40
+ private count;
41
+ private isDestroyed;
42
+ /** Checks if workers are supported on this platform */
43
+ static isSupported(): boolean;
44
+ /**
45
+ * @param processor - worker function
46
+ * @param maxConcurrency - max count of workers
47
+ */
48
+ constructor(props: WorkerPoolProps);
49
+ /**
50
+ * Terminates all workers in the pool
51
+ * @note Can free up significant memory
52
+ */
53
+ destroy(): void;
54
+ setProps(props: WorkerPoolProps): void;
55
+ startJob(name: string, onMessage?: OnMessage, onError?: OnError): Promise<WorkerJob>;
56
+ /**
57
+ * Starts first queued job if worker is available or can be created
58
+ * Called when job is started and whenever a worker returns to the idleQueue
59
+ */
60
+ _startQueuedJob(): Promise<void>;
61
+ /**
62
+ * Returns a worker to the idle queue
63
+ * Destroys the worker if
64
+ * - pool is destroyed
65
+ * - if this pool doesn't reuse workers
66
+ * - if maxConcurrency has been lowered
67
+ * @param worker
68
+ */
69
+ returnWorkerToQueue(worker: WorkerThread): void;
70
+ /**
71
+ * Returns idle worker or creates new worker if maxConcurrency has not been reached
72
+ */
73
+ _getAvailableWorker(): WorkerThread | null;
74
+ _getMaxConcurrency(): number;
75
+ }
76
+ export {};
77
+ //# sourceMappingURL=worker-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-pool.d.ts","sourceRoot":"","sources":["../../../src/lib/worker-farm/worker-pool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,iBAAiB,EAAE,oBAAoB,EAAC,MAAM,aAAa,CAAC;AAEzE,OAAO,YAAY,MAAM,iBAAiB,CAAC;AAC3C,OAAO,SAAS,MAAM,cAAc,CAAC;AAErC,6CAA6C;AAC7C,KAAK,iBAAiB,GAAG;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,YAAY,CAAC;CAC5B,CAAC;AAEF,4BAA4B;AAC5B,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,GAAG,CAAC;IAC9C,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,2BAA2B;AAC3B,KAAK,SAAS,GAAG,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAC;AAClG,KAAK,OAAO,GAAG,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;AAStD;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B,IAAI,EAAE,MAAM,CAAa;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAK;IAC3B,oBAAoB,EAAE,MAAM,CAAK;IACjC,OAAO,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,GAAG,CAAY;IACxD,YAAY,EAAE,OAAO,CAAQ;IAE7B,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,WAAW,CAAS;IAE5B,uDAAuD;IACvD,MAAM,CAAC,WAAW,IAAI,OAAO;IAI7B;;;OAGG;gBACS,KAAK,EAAE,eAAe;IAMlC;;;OAGG;IACH,OAAO,IAAI,IAAI;IAMf,QAAQ,CAAC,KAAK,EAAE,eAAe;IAoBzB,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,SAAS,GAAE,SAA+C,EAC1D,OAAO,GAAE,OAA0C,GAClD,OAAO,CAAC,SAAS,CAAC;IAarB;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAyCtC;;;;;;;OAOG;IACH,mBAAmB,CAAC,MAAM,EAAE,YAAY;IAgBxC;;OAEG;IACH,mBAAmB,IAAI,YAAY,GAAG,IAAI;IAiB1C,kBAAkB;CAGnB"}
@@ -1,157 +1,155 @@
1
- import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
- import { isMobile } from '../env-utils/globals';
3
- import WorkerThread from './worker-thread';
4
- import WorkerJob from './worker-job';
5
- export default class WorkerPool {
6
- constructor(props) {
7
- _defineProperty(this, "name", 'unnamed');
8
-
9
- _defineProperty(this, "source", void 0);
10
-
11
- _defineProperty(this, "url", void 0);
12
-
13
- _defineProperty(this, "maxConcurrency", 1);
14
-
15
- _defineProperty(this, "maxMobileConcurrency", 1);
16
-
17
- _defineProperty(this, "onDebug", () => {});
18
-
19
- _defineProperty(this, "reuseWorkers", true);
20
-
21
- _defineProperty(this, "props", {});
22
-
23
- _defineProperty(this, "jobQueue", []);
24
-
25
- _defineProperty(this, "idleQueue", []);
26
-
27
- _defineProperty(this, "count", 0);
28
-
29
- _defineProperty(this, "isDestroyed", false);
30
-
31
- this.source = props.source;
32
- this.url = props.url;
33
- this.setProps(props);
34
- }
35
-
36
- destroy() {
37
- this.idleQueue.forEach(worker => worker.destroy());
38
- this.isDestroyed = true;
39
- }
40
-
41
- setProps(props) {
42
- this.props = { ...this.props,
43
- ...props
44
- };
45
-
46
- if (props.name !== undefined) {
47
- this.name = props.name;
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const globals_1 = require("../env-utils/globals");
7
+ const worker_thread_1 = __importDefault(require("./worker-thread"));
8
+ const worker_job_1 = __importDefault(require("./worker-job"));
9
+ /**
10
+ * Process multiple data messages with small pool of identical workers
11
+ */
12
+ class WorkerPool {
13
+ /** Checks if workers are supported on this platform */
14
+ static isSupported() {
15
+ return worker_thread_1.default.isSupported();
48
16
  }
49
-
50
- if (props.maxConcurrency !== undefined) {
51
- this.maxConcurrency = props.maxConcurrency;
17
+ /**
18
+ * @param processor - worker function
19
+ * @param maxConcurrency - max count of workers
20
+ */
21
+ constructor(props) {
22
+ this.name = 'unnamed';
23
+ this.maxConcurrency = 1;
24
+ this.maxMobileConcurrency = 1;
25
+ this.onDebug = () => { };
26
+ this.reuseWorkers = true;
27
+ this.props = {};
28
+ this.jobQueue = [];
29
+ this.idleQueue = [];
30
+ this.count = 0;
31
+ this.isDestroyed = false;
32
+ this.source = props.source;
33
+ this.url = props.url;
34
+ this.setProps(props);
52
35
  }
53
-
54
- if (props.maxMobileConcurrency !== undefined) {
55
- this.maxMobileConcurrency = props.maxMobileConcurrency;
36
+ /**
37
+ * Terminates all workers in the pool
38
+ * @note Can free up significant memory
39
+ */
40
+ destroy() {
41
+ // Destroy idle workers, active Workers will be destroyed on completion
42
+ this.idleQueue.forEach((worker) => worker.destroy());
43
+ this.isDestroyed = true;
56
44
  }
57
-
58
- if (props.reuseWorkers !== undefined) {
59
- this.reuseWorkers = props.reuseWorkers;
45
+ setProps(props) {
46
+ this.props = { ...this.props, ...props };
47
+ if (props.name !== undefined) {
48
+ this.name = props.name;
49
+ }
50
+ if (props.maxConcurrency !== undefined) {
51
+ this.maxConcurrency = props.maxConcurrency;
52
+ }
53
+ if (props.maxMobileConcurrency !== undefined) {
54
+ this.maxMobileConcurrency = props.maxMobileConcurrency;
55
+ }
56
+ if (props.reuseWorkers !== undefined) {
57
+ this.reuseWorkers = props.reuseWorkers;
58
+ }
59
+ if (props.onDebug !== undefined) {
60
+ this.onDebug = props.onDebug;
61
+ }
60
62
  }
61
-
62
- if (props.onDebug !== undefined) {
63
- this.onDebug = props.onDebug;
63
+ async startJob(name, onMessage = (job, type, data) => job.done(data), onError = (job, error) => job.error(error)) {
64
+ // Promise resolves when thread starts working on this job
65
+ const startPromise = new Promise((onStart) => {
66
+ // Promise resolves when thread completes or fails working on this job
67
+ this.jobQueue.push({ name, onMessage, onError, onStart });
68
+ return this;
69
+ });
70
+ this._startQueuedJob(); // eslint-disable-line @typescript-eslint/no-floating-promises
71
+ return await startPromise;
64
72
  }
65
- }
66
-
67
- async startJob(name, onMessage = (job, type, data) => job.done(data), onError = (job, error) => job.error(error)) {
68
- const startPromise = new Promise(onStart => {
69
- this.jobQueue.push({
70
- name,
71
- onMessage,
72
- onError,
73
- onStart
74
- });
75
- return this;
76
- });
77
-
78
- this._startQueuedJob();
79
-
80
- return await startPromise;
81
- }
82
-
83
- async _startQueuedJob() {
84
- if (!this.jobQueue.length) {
85
- return;
73
+ // PRIVATE
74
+ /**
75
+ * Starts first queued job if worker is available or can be created
76
+ * Called when job is started and whenever a worker returns to the idleQueue
77
+ */
78
+ async _startQueuedJob() {
79
+ if (!this.jobQueue.length) {
80
+ return;
81
+ }
82
+ const workerThread = this._getAvailableWorker();
83
+ if (!workerThread) {
84
+ return;
85
+ }
86
+ // We have a worker, dequeue and start the job
87
+ const queuedJob = this.jobQueue.shift();
88
+ if (queuedJob) {
89
+ // Emit a debug event
90
+ // @ts-ignore
91
+ this.onDebug({
92
+ message: 'Starting job',
93
+ name: queuedJob.name,
94
+ workerThread,
95
+ backlog: this.jobQueue.length
96
+ });
97
+ // Create a worker job to let the app access thread and manage job completion
98
+ const job = new worker_job_1.default(queuedJob.name, workerThread);
99
+ // Set the worker thread's message handlers
100
+ workerThread.onMessage = (data) => queuedJob.onMessage(job, data.type, data.payload);
101
+ workerThread.onError = (error) => queuedJob.onError(job, error);
102
+ // Resolve the start promise so that the app can start sending messages to worker
103
+ queuedJob.onStart(job);
104
+ // Wait for the app to signal that the job is complete, then return worker to queue
105
+ try {
106
+ await job.result;
107
+ }
108
+ finally {
109
+ this.returnWorkerToQueue(workerThread);
110
+ }
111
+ }
86
112
  }
87
-
88
- const workerThread = this._getAvailableWorker();
89
-
90
- if (!workerThread) {
91
- return;
113
+ /**
114
+ * Returns a worker to the idle queue
115
+ * Destroys the worker if
116
+ * - pool is destroyed
117
+ * - if this pool doesn't reuse workers
118
+ * - if maxConcurrency has been lowered
119
+ * @param worker
120
+ */
121
+ returnWorkerToQueue(worker) {
122
+ const shouldDestroyWorker = this.isDestroyed || !this.reuseWorkers || this.count > this._getMaxConcurrency();
123
+ if (shouldDestroyWorker) {
124
+ worker.destroy();
125
+ this.count--;
126
+ }
127
+ else {
128
+ this.idleQueue.push(worker);
129
+ }
130
+ if (!this.isDestroyed) {
131
+ this._startQueuedJob(); // eslint-disable-line @typescript-eslint/no-floating-promises
132
+ }
92
133
  }
93
-
94
- const queuedJob = this.jobQueue.shift();
95
-
96
- if (queuedJob) {
97
- this.onDebug({
98
- message: 'Starting job',
99
- name: queuedJob.name,
100
- workerThread,
101
- backlog: this.jobQueue.length
102
- });
103
- const job = new WorkerJob(queuedJob.name, workerThread);
104
-
105
- workerThread.onMessage = data => queuedJob.onMessage(job, data.type, data.payload);
106
-
107
- workerThread.onError = error => queuedJob.onError(job, error);
108
-
109
- queuedJob.onStart(job);
110
-
111
- try {
112
- await job.result;
113
- } finally {
114
- this.returnWorkerToQueue(workerThread);
115
- }
134
+ /**
135
+ * Returns idle worker or creates new worker if maxConcurrency has not been reached
136
+ */
137
+ _getAvailableWorker() {
138
+ // If a worker has completed and returned to the queue, it can be used
139
+ if (this.idleQueue.length > 0) {
140
+ return this.idleQueue.shift() || null;
141
+ }
142
+ // Create fresh worker if we haven't yet created the max amount of worker threads for this worker source
143
+ if (this.count < this._getMaxConcurrency()) {
144
+ this.count++;
145
+ const name = `${this.name.toLowerCase()} (#${this.count} of ${this.maxConcurrency})`;
146
+ return new worker_thread_1.default({ name, source: this.source, url: this.url });
147
+ }
148
+ // No worker available, have to wait
149
+ return null;
116
150
  }
117
- }
118
-
119
- returnWorkerToQueue(worker) {
120
- const shouldDestroyWorker = this.isDestroyed || !this.reuseWorkers || this.count > this._getMaxConcurrency();
121
-
122
- if (shouldDestroyWorker) {
123
- worker.destroy();
124
- this.count--;
125
- } else {
126
- this.idleQueue.push(worker);
151
+ _getMaxConcurrency() {
152
+ return globals_1.isMobile ? this.maxMobileConcurrency : this.maxConcurrency;
127
153
  }
128
-
129
- if (!this.isDestroyed) {
130
- this._startQueuedJob();
131
- }
132
- }
133
-
134
- _getAvailableWorker() {
135
- if (this.idleQueue.length > 0) {
136
- return this.idleQueue.shift() || null;
137
- }
138
-
139
- if (this.count < this._getMaxConcurrency()) {
140
- this.count++;
141
- const name = "".concat(this.name.toLowerCase(), " (#").concat(this.count, " of ").concat(this.maxConcurrency, ")");
142
- return new WorkerThread({
143
- name,
144
- source: this.source,
145
- url: this.url
146
- });
147
- }
148
-
149
- return null;
150
- }
151
-
152
- _getMaxConcurrency() {
153
- return isMobile ? this.maxMobileConcurrency : this.maxConcurrency;
154
- }
155
-
156
154
  }
157
- //# sourceMappingURL=worker-pool.js.map
155
+ exports.default = WorkerPool;
@@ -0,0 +1,49 @@
1
+ import { NodeWorkerType } from '../node/worker_threads';
2
+ export type WorkerThreadProps = {
3
+ name: string;
4
+ source?: string;
5
+ url?: string;
6
+ };
7
+ /**
8
+ * Represents one worker thread
9
+ */
10
+ export default class WorkerThread {
11
+ readonly name: string;
12
+ readonly source: string | undefined;
13
+ readonly url: string | undefined;
14
+ terminated: boolean;
15
+ worker: Worker | NodeWorkerType;
16
+ onMessage: (message: any) => void;
17
+ onError: (error: Error) => void;
18
+ private _loadableURL;
19
+ /** Checks if workers are supported on this platform */
20
+ static isSupported(): boolean;
21
+ constructor(props: WorkerThreadProps);
22
+ /**
23
+ * Terminate this worker thread
24
+ * @note Can free up significant memory
25
+ */
26
+ destroy(): void;
27
+ get isRunning(): boolean;
28
+ /**
29
+ * Send a message to this worker thread
30
+ * @param data any data structure, ideally consisting mostly of transferrable objects
31
+ * @param transferList If not supplied, calculated automatically by traversing data
32
+ */
33
+ postMessage(data: any, transferList?: any[]): void;
34
+ /**
35
+ * Generate a standard Error from an ErrorEvent
36
+ * @param event
37
+ */
38
+ _getErrorFromErrorEvent(event: ErrorEvent): Error;
39
+ /**
40
+ * Creates a worker thread on the browser
41
+ */
42
+ _createBrowserWorker(): Worker;
43
+ /**
44
+ * Creates a worker thread in node.js
45
+ * @todo https://nodejs.org/api/async_hooks.html#async-resource-worker-pool
46
+ */
47
+ _createNodeWorker(): NodeWorkerType;
48
+ }
49
+ //# sourceMappingURL=worker-thread.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-thread.d.ts","sourceRoot":"","sources":["../../../src/lib/worker-farm/worker-thread.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,cAAc,EAAC,MAAM,wBAAwB,CAAC;AAQlE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,YAAY;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,UAAU,EAAE,OAAO,CAAS;IAC5B,MAAM,EAAE,MAAM,GAAG,cAAc,CAAC;IAChC,SAAS,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IAClC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAEhC,OAAO,CAAC,YAAY,CAAc;IAElC,uDAAuD;IACvD,MAAM,CAAC,WAAW,IAAI,OAAO;gBAOjB,KAAK,EAAE,iBAAiB;IAYpC;;;OAGG;IACH,OAAO,IAAI,IAAI;IAOf,IAAI,SAAS,YAEZ;IAED;;;;OAIG;IACH,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,YAAY,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI;IAQlD;;;OAGG;IACH,uBAAuB,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK;IAiBjD;;OAEG;IACH,oBAAoB,IAAI,MAAM;IAsB9B;;;OAGG;IACH,iBAAiB,IAAI,cAAc;CA0BpC"}