@loaders.gl/worker-utils 3.1.0-alpha.3 → 3.1.0-beta.2

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 (198) hide show
  1. package/dist/es5/index.js +160 -0
  2. package/dist/es5/index.js.map +1 -0
  3. package/dist/es5/lib/async-queue/async-queue.js +106 -0
  4. package/dist/es5/lib/async-queue/async-queue.js.map +1 -0
  5. package/dist/es5/lib/env-utils/assert.js +13 -0
  6. package/dist/es5/lib/env-utils/assert.js.map +1 -0
  7. package/dist/es5/lib/env-utils/globals.js +30 -0
  8. package/dist/es5/lib/env-utils/globals.js.map +1 -0
  9. package/dist/es5/lib/env-utils/version.js +14 -0
  10. package/dist/es5/lib/env-utils/version.js.map +1 -0
  11. package/dist/es5/lib/library-utils/library-utils.js +102 -0
  12. package/dist/es5/lib/library-utils/library-utils.js.map +1 -0
  13. package/dist/es5/lib/node/require-utils.node.js +56 -0
  14. package/dist/es5/lib/node/require-utils.node.js.map +1 -0
  15. package/dist/es5/lib/process-utils/child-process-proxy.js +136 -0
  16. package/dist/es5/lib/process-utils/child-process-proxy.js.map +1 -0
  17. package/dist/es5/lib/process-utils/process-utils.js +39 -0
  18. package/dist/es5/lib/process-utils/process-utils.js.map +1 -0
  19. package/dist/es5/lib/worker-api/create-worker.js +119 -0
  20. package/dist/es5/lib/worker-api/create-worker.js.map +1 -0
  21. package/dist/es5/lib/worker-api/get-worker-url.js +44 -0
  22. package/dist/es5/lib/worker-api/get-worker-url.js.map +1 -0
  23. package/dist/es5/lib/worker-api/process-on-worker.js +91 -0
  24. package/dist/es5/lib/worker-api/process-on-worker.js.map +1 -0
  25. package/dist/es5/lib/worker-api/validate-worker-version.js +30 -0
  26. package/dist/es5/lib/worker-api/validate-worker-version.js.map +1 -0
  27. package/dist/es5/lib/worker-farm/worker-body.js +76 -0
  28. package/dist/es5/lib/worker-farm/worker-body.js.map +1 -0
  29. package/dist/es5/lib/worker-farm/worker-farm.js +95 -0
  30. package/dist/es5/lib/worker-farm/worker-farm.js.map +1 -0
  31. package/dist/es5/lib/worker-farm/worker-job.js +61 -0
  32. package/dist/es5/lib/worker-farm/worker-job.js.map +1 -0
  33. package/dist/es5/lib/worker-farm/worker-pool.js +160 -0
  34. package/dist/es5/lib/worker-farm/worker-pool.js.map +1 -0
  35. package/dist/es5/lib/worker-farm/worker-thread.js +111 -0
  36. package/dist/es5/lib/worker-farm/worker-thread.js.map +1 -0
  37. package/dist/es5/lib/worker-utils/get-loadable-worker-url.js +51 -0
  38. package/dist/es5/lib/worker-utils/get-loadable-worker-url.js.map +1 -0
  39. package/dist/es5/lib/worker-utils/get-transfer-list.js +47 -0
  40. package/dist/es5/lib/worker-utils/get-transfer-list.js.map +1 -0
  41. package/dist/es5/lib/worker-utils/remove-nontransferable-options.js +30 -0
  42. package/dist/es5/lib/worker-utils/remove-nontransferable-options.js.map +1 -0
  43. package/dist/es5/types.js +2 -0
  44. package/dist/{types.js.map → es5/types.js.map} +0 -0
  45. package/dist/es5/workers/null-worker.js +8 -0
  46. package/dist/es5/workers/null-worker.js.map +1 -0
  47. package/dist/esm/index.js +26 -0
  48. package/dist/esm/index.js.map +1 -0
  49. package/dist/esm/lib/async-queue/async-queue.js +97 -0
  50. package/dist/esm/lib/async-queue/async-queue.js.map +1 -0
  51. package/dist/esm/lib/env-utils/assert.js +6 -0
  52. package/dist/esm/lib/env-utils/assert.js.map +1 -0
  53. package/dist/esm/lib/env-utils/globals.js +17 -0
  54. package/dist/esm/lib/env-utils/globals.js.map +1 -0
  55. package/dist/esm/lib/env-utils/version.js +7 -0
  56. package/dist/esm/lib/env-utils/version.js.map +1 -0
  57. package/dist/esm/lib/library-utils/library-utils.js +84 -0
  58. package/dist/esm/lib/library-utils/library-utils.js.map +1 -0
  59. package/dist/esm/lib/node/require-utils.node.js +43 -0
  60. package/dist/esm/lib/node/require-utils.node.js.map +1 -0
  61. package/dist/esm/lib/process-utils/child-process-proxy.js +122 -0
  62. package/dist/esm/lib/process-utils/child-process-proxy.js.map +1 -0
  63. package/dist/esm/lib/process-utils/process-utils.js +29 -0
  64. package/dist/esm/lib/process-utils/process-utils.js.map +1 -0
  65. package/dist/esm/lib/worker-api/create-worker.js +99 -0
  66. package/dist/esm/lib/worker-api/create-worker.js.map +1 -0
  67. package/dist/esm/lib/worker-api/get-worker-url.js +32 -0
  68. package/dist/esm/lib/worker-api/get-worker-url.js.map +1 -0
  69. package/dist/esm/lib/worker-api/process-on-worker.js +75 -0
  70. package/dist/esm/lib/worker-api/process-on-worker.js.map +1 -0
  71. package/dist/esm/lib/worker-api/validate-worker-version.js +21 -0
  72. package/dist/esm/lib/worker-api/validate-worker-version.js.map +1 -0
  73. package/dist/esm/lib/worker-farm/worker-body.js +65 -0
  74. package/dist/esm/lib/worker-farm/worker-body.js.map +1 -0
  75. package/dist/esm/lib/worker-farm/worker-farm.js +83 -0
  76. package/dist/esm/lib/worker-farm/worker-farm.js.map +1 -0
  77. package/dist/esm/lib/worker-farm/worker-job.js +54 -0
  78. package/dist/esm/lib/worker-farm/worker-job.js.map +1 -0
  79. package/dist/esm/lib/worker-farm/worker-pool.js +157 -0
  80. package/dist/esm/lib/worker-farm/worker-pool.js.map +1 -0
  81. package/dist/esm/lib/worker-farm/worker-thread.js +105 -0
  82. package/dist/esm/lib/worker-farm/worker-thread.js.map +1 -0
  83. package/dist/esm/lib/worker-utils/get-loadable-worker-url.js +42 -0
  84. package/dist/esm/lib/worker-utils/get-loadable-worker-url.js.map +1 -0
  85. package/dist/esm/lib/worker-utils/get-transfer-list.js +40 -0
  86. package/dist/esm/lib/worker-utils/get-transfer-list.js.map +1 -0
  87. package/dist/esm/lib/worker-utils/remove-nontransferable-options.js +23 -0
  88. package/dist/esm/lib/worker-utils/remove-nontransferable-options.js.map +1 -0
  89. package/dist/esm/types.js +2 -0
  90. package/dist/esm/types.js.map +1 -0
  91. package/dist/esm/workers/null-worker.js +5 -0
  92. package/dist/esm/workers/null-worker.js.map +1 -0
  93. package/dist/index.d.ts +20 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +57 -25
  96. package/dist/lib/async-queue/async-queue.d.ts +32 -0
  97. package/dist/lib/async-queue/async-queue.d.ts.map +1 -0
  98. package/dist/lib/async-queue/async-queue.js +81 -91
  99. package/dist/lib/env-utils/assert.d.ts +3 -0
  100. package/dist/lib/env-utils/assert.d.ts.map +1 -0
  101. package/dist/lib/env-utils/assert.js +12 -5
  102. package/dist/lib/env-utils/globals.d.ts +22 -0
  103. package/dist/lib/env-utils/globals.d.ts.map +1 -0
  104. package/dist/lib/env-utils/globals.js +25 -10
  105. package/dist/lib/env-utils/version.d.ts +2 -0
  106. package/dist/lib/env-utils/version.d.ts.map +1 -0
  107. package/dist/lib/env-utils/version.js +10 -5
  108. package/dist/lib/library-utils/library-utils.d.ts +18 -0
  109. package/dist/lib/library-utils/library-utils.d.ts.map +1 -0
  110. package/dist/lib/library-utils/library-utils.js +149 -75
  111. package/dist/lib/node/require-utils.node.d.ts +6 -0
  112. package/dist/lib/node/require-utils.node.d.ts.map +1 -0
  113. package/dist/lib/node/require-utils.node.js +58 -45
  114. package/dist/lib/process-utils/child-process-proxy.d.ts +43 -0
  115. package/dist/lib/process-utils/child-process-proxy.d.ts.map +1 -0
  116. package/dist/lib/process-utils/child-process-proxy.js +122 -113
  117. package/dist/lib/process-utils/process-utils.d.ts +2 -0
  118. package/dist/lib/process-utils/process-utils.d.ts.map +1 -0
  119. package/dist/lib/process-utils/process-utils.js +33 -27
  120. package/dist/lib/worker-api/create-worker.d.ts +9 -0
  121. package/dist/lib/worker-api/create-worker.d.ts.map +1 -0
  122. package/dist/lib/worker-api/create-worker.js +85 -92
  123. package/dist/lib/worker-api/get-worker-url.d.ts +14 -0
  124. package/dist/lib/worker-api/get-worker-url.d.ts.map +1 -0
  125. package/dist/lib/worker-api/get-worker-url.js +45 -29
  126. package/dist/lib/worker-api/process-on-worker.d.ts +20 -0
  127. package/dist/lib/worker-api/process-on-worker.d.ts.map +1 -0
  128. package/dist/lib/worker-api/process-on-worker.js +75 -71
  129. package/dist/lib/worker-api/validate-worker-version.d.ts +9 -0
  130. package/dist/lib/worker-api/validate-worker-version.d.ts.map +1 -0
  131. package/dist/lib/worker-api/validate-worker-version.js +32 -18
  132. package/dist/lib/worker-farm/worker-body.d.ts +16 -0
  133. package/dist/lib/worker-farm/worker-body.d.ts.map +1 -0
  134. package/dist/lib/worker-farm/worker-body.js +60 -58
  135. package/dist/lib/worker-farm/worker-farm.d.ts +55 -0
  136. package/dist/lib/worker-farm/worker-farm.d.ts.map +1 -0
  137. package/dist/lib/worker-farm/worker-farm.js +82 -77
  138. package/dist/lib/worker-farm/worker-job.d.ts +29 -0
  139. package/dist/lib/worker-farm/worker-job.d.ts.map +1 -0
  140. package/dist/lib/worker-farm/worker-job.js +46 -53
  141. package/dist/lib/worker-farm/worker-pool.d.ts +75 -0
  142. package/dist/lib/worker-farm/worker-pool.d.ts.map +1 -0
  143. package/dist/lib/worker-farm/worker-pool.js +142 -148
  144. package/dist/lib/worker-farm/worker-thread.d.ts +42 -0
  145. package/dist/lib/worker-farm/worker-thread.d.ts.map +1 -0
  146. package/dist/lib/worker-farm/worker-thread.js +92 -102
  147. package/dist/lib/worker-utils/get-loadable-worker-url.d.ts +14 -0
  148. package/dist/lib/worker-utils/get-loadable-worker-url.d.ts.map +1 -0
  149. package/dist/lib/worker-utils/get-loadable-worker-url.js +59 -33
  150. package/dist/lib/worker-utils/get-transfer-list.d.ts +10 -0
  151. package/dist/lib/worker-utils/get-transfer-list.d.ts.map +1 -0
  152. package/dist/lib/worker-utils/get-transfer-list.js +57 -36
  153. package/dist/lib/worker-utils/remove-nontransferable-options.d.ts +6 -0
  154. package/dist/lib/worker-utils/remove-nontransferable-options.d.ts.map +1 -0
  155. package/dist/lib/worker-utils/remove-nontransferable-options.js +31 -19
  156. package/dist/null-worker.js +189 -550
  157. package/dist/null-worker.js.map +7 -1
  158. package/dist/types.d.ts +56 -0
  159. package/dist/types.d.ts.map +1 -0
  160. package/dist/types.js +2 -2
  161. package/dist/workers/null-worker.d.ts +2 -0
  162. package/dist/workers/null-worker.d.ts.map +1 -0
  163. package/dist/workers/null-worker.js +6 -4
  164. package/package.json +8 -8
  165. package/src/lib/env-utils/version.ts +1 -1
  166. package/src/lib/library-utils/library-utils.ts +6 -4
  167. package/src/lib/node/{require-utils.node.js → require-utils.node.ts} +13 -9
  168. package/src/lib/process-utils/child-process-proxy.ts +1 -1
  169. package/src/lib/worker-api/create-worker.ts +11 -7
  170. package/src/lib/worker-api/process-on-worker.ts +1 -1
  171. package/src/lib/worker-farm/worker-body.ts +2 -2
  172. package/src/lib/worker-farm/worker-job.ts +2 -2
  173. package/src/lib/worker-farm/worker-thread.ts +2 -2
  174. package/src/lib/worker-utils/get-transfer-list.ts +1 -1
  175. package/src/lib/worker-utils/remove-nontransferable-options.ts +1 -1
  176. package/src/types.ts +1 -1
  177. package/dist/index.js.map +0 -1
  178. package/dist/lib/async-queue/async-queue.js.map +0 -1
  179. package/dist/lib/env-utils/assert.js.map +0 -1
  180. package/dist/lib/env-utils/globals.js.map +0 -1
  181. package/dist/lib/env-utils/version.js.map +0 -1
  182. package/dist/lib/library-utils/library-utils.js.map +0 -1
  183. package/dist/lib/node/require-utils.node.js.map +0 -1
  184. package/dist/lib/process-utils/child-process-proxy.js.map +0 -1
  185. package/dist/lib/process-utils/process-utils.js.map +0 -1
  186. package/dist/lib/worker-api/create-worker.js.map +0 -1
  187. package/dist/lib/worker-api/get-worker-url.js.map +0 -1
  188. package/dist/lib/worker-api/process-on-worker.js.map +0 -1
  189. package/dist/lib/worker-api/validate-worker-version.js.map +0 -1
  190. package/dist/lib/worker-farm/worker-body.js.map +0 -1
  191. package/dist/lib/worker-farm/worker-farm.js.map +0 -1
  192. package/dist/lib/worker-farm/worker-job.js.map +0 -1
  193. package/dist/lib/worker-farm/worker-pool.js.map +0 -1
  194. package/dist/lib/worker-farm/worker-thread.js.map +0 -1
  195. package/dist/lib/worker-utils/get-loadable-worker-url.js.map +0 -1
  196. package/dist/lib/worker-utils/get-transfer-list.js.map +0 -1
  197. package/dist/lib/worker-utils/remove-nontransferable-options.js.map +0 -1
  198. package/dist/workers/null-worker.js.map +0 -1
@@ -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.name = jobName;
10
+ this.workerThread = workerThread;
11
+ this.isRunning = true;
12
+ this._resolve = () => { };
13
+ this._reject = () => { };
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,75 @@
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
+ declare 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 declare 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
+ declare type OnMessage = (job: WorkerJob, type: WorkerMessageType, payload: WorkerMessagePayload) => void;
25
+ declare 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
+ /**
43
+ * @param processor - worker function
44
+ * @param maxConcurrency - max count of workers
45
+ */
46
+ constructor(props: WorkerPoolProps);
47
+ /**
48
+ * Terminates all workers in the pool
49
+ * @note Can free up significant memory
50
+ */
51
+ destroy(): void;
52
+ setProps(props: WorkerPoolProps): void;
53
+ startJob(name: string, onMessage?: OnMessage, onError?: OnError): Promise<WorkerJob>;
54
+ /**
55
+ * Starts first queued job if worker is available or can be created
56
+ * Called when job is started and whenever a worker returns to the idleQueue
57
+ */
58
+ _startQueuedJob(): Promise<void>;
59
+ /**
60
+ * Returns a worker to the idle queue
61
+ * Destroys the worker if
62
+ * - pool is destroyed
63
+ * - if this pool doesn't reuse workers
64
+ * - if maxConcurrency has been lowered
65
+ * @param worker
66
+ */
67
+ returnWorkerToQueue(worker: WorkerThread): void;
68
+ /**
69
+ * Returns idle worker or creates new worker if maxConcurrency has not been reached
70
+ */
71
+ _getAvailableWorker(): WorkerThread | null;
72
+ _getMaxConcurrency(): number;
73
+ }
74
+ export {};
75
+ //# 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,aAAK,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,oBAAY,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,aAAK,SAAS,GAAG,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAC;AAClG,aAAK,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;;;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,151 @@
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
+ /**
14
+ * @param processor - worker function
15
+ * @param maxConcurrency - max count of workers
16
+ */
17
+ constructor(props) {
18
+ this.name = 'unnamed';
19
+ this.maxConcurrency = 1;
20
+ this.maxMobileConcurrency = 1;
21
+ this.onDebug = () => { };
22
+ this.reuseWorkers = true;
23
+ this.props = {};
24
+ this.jobQueue = [];
25
+ this.idleQueue = [];
26
+ this.count = 0;
27
+ this.isDestroyed = false;
28
+ this.source = props.source;
29
+ this.url = props.url;
30
+ this.setProps(props);
48
31
  }
49
-
50
- if (props.maxConcurrency !== undefined) {
51
- this.maxConcurrency = props.maxConcurrency;
32
+ /**
33
+ * Terminates all workers in the pool
34
+ * @note Can free up significant memory
35
+ */
36
+ destroy() {
37
+ // Destroy idle workers, active Workers will be destroyed on completion
38
+ this.idleQueue.forEach((worker) => worker.destroy());
39
+ this.isDestroyed = true;
52
40
  }
53
-
54
- if (props.maxMobileConcurrency !== undefined) {
55
- this.maxMobileConcurrency = props.maxMobileConcurrency;
41
+ setProps(props) {
42
+ this.props = { ...this.props, ...props };
43
+ if (props.name !== undefined) {
44
+ this.name = props.name;
45
+ }
46
+ if (props.maxConcurrency !== undefined) {
47
+ this.maxConcurrency = props.maxConcurrency;
48
+ }
49
+ if (props.maxMobileConcurrency !== undefined) {
50
+ this.maxMobileConcurrency = props.maxMobileConcurrency;
51
+ }
52
+ if (props.reuseWorkers !== undefined) {
53
+ this.reuseWorkers = props.reuseWorkers;
54
+ }
55
+ if (props.onDebug !== undefined) {
56
+ this.onDebug = props.onDebug;
57
+ }
56
58
  }
57
-
58
- if (props.reuseWorkers !== undefined) {
59
- this.reuseWorkers = props.reuseWorkers;
59
+ async startJob(name, onMessage = (job, type, data) => job.done(data), onError = (job, error) => job.error(error)) {
60
+ // Promise resolves when thread starts working on this job
61
+ const startPromise = new Promise((onStart) => {
62
+ // Promise resolves when thread completes or fails working on this job
63
+ this.jobQueue.push({ name, onMessage, onError, onStart });
64
+ return this;
65
+ });
66
+ this._startQueuedJob(); // eslint-disable-line @typescript-eslint/no-floating-promises
67
+ return await startPromise;
60
68
  }
61
-
62
- if (props.onDebug !== undefined) {
63
- this.onDebug = props.onDebug;
69
+ // PRIVATE
70
+ /**
71
+ * Starts first queued job if worker is available or can be created
72
+ * Called when job is started and whenever a worker returns to the idleQueue
73
+ */
74
+ async _startQueuedJob() {
75
+ if (!this.jobQueue.length) {
76
+ return;
77
+ }
78
+ const workerThread = this._getAvailableWorker();
79
+ if (!workerThread) {
80
+ return;
81
+ }
82
+ // We have a worker, dequeue and start the job
83
+ const queuedJob = this.jobQueue.shift();
84
+ if (queuedJob) {
85
+ // Emit a debug event
86
+ // @ts-ignore
87
+ this.onDebug({
88
+ message: 'Starting job',
89
+ name: queuedJob.name,
90
+ workerThread,
91
+ backlog: this.jobQueue.length
92
+ });
93
+ // Create a worker job to let the app access thread and manage job completion
94
+ const job = new worker_job_1.default(queuedJob.name, workerThread);
95
+ // Set the worker thread's message handlers
96
+ workerThread.onMessage = (data) => queuedJob.onMessage(job, data.type, data.payload);
97
+ workerThread.onError = (error) => queuedJob.onError(job, error);
98
+ // Resolve the start promise so that the app can start sending messages to worker
99
+ queuedJob.onStart(job);
100
+ // Wait for the app to signal that the job is complete, then return worker to queue
101
+ try {
102
+ await job.result;
103
+ }
104
+ finally {
105
+ this.returnWorkerToQueue(workerThread);
106
+ }
107
+ }
64
108
  }
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;
109
+ /**
110
+ * Returns a worker to the idle queue
111
+ * Destroys the worker if
112
+ * - pool is destroyed
113
+ * - if this pool doesn't reuse workers
114
+ * - if maxConcurrency has been lowered
115
+ * @param worker
116
+ */
117
+ returnWorkerToQueue(worker) {
118
+ const shouldDestroyWorker = this.isDestroyed || !this.reuseWorkers || this.count > this._getMaxConcurrency();
119
+ if (shouldDestroyWorker) {
120
+ worker.destroy();
121
+ this.count--;
122
+ }
123
+ else {
124
+ this.idleQueue.push(worker);
125
+ }
126
+ if (!this.isDestroyed) {
127
+ this._startQueuedJob(); // eslint-disable-line @typescript-eslint/no-floating-promises
128
+ }
86
129
  }
87
-
88
- const workerThread = this._getAvailableWorker();
89
-
90
- if (!workerThread) {
91
- return;
130
+ /**
131
+ * Returns idle worker or creates new worker if maxConcurrency has not been reached
132
+ */
133
+ _getAvailableWorker() {
134
+ // If a worker has completed and returned to the queue, it can be used
135
+ if (this.idleQueue.length > 0) {
136
+ return this.idleQueue.shift() || null;
137
+ }
138
+ // Create fresh worker if we haven't yet created the max amount of worker threads for this worker source
139
+ if (this.count < this._getMaxConcurrency()) {
140
+ this.count++;
141
+ const name = `${this.name.toLowerCase()} (#${this.count} of ${this.maxConcurrency})`;
142
+ return new worker_thread_1.default({ name, source: this.source, url: this.url });
143
+ }
144
+ // No worker available, have to wait
145
+ return null;
92
146
  }
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
- }
147
+ _getMaxConcurrency() {
148
+ return globals_1.isMobile ? this.maxMobileConcurrency : this.maxConcurrency;
116
149
  }
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);
127
- }
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 = `${this.name.toLowerCase()} (#${this.count} of ${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
150
  }
157
- //# sourceMappingURL=worker-pool.js.map
151
+ exports.default = WorkerPool;
@@ -0,0 +1,42 @@
1
+ export declare type WorkerThreadProps = {
2
+ name: string;
3
+ source?: string;
4
+ url?: string;
5
+ };
6
+ /**
7
+ * Represents one worker thread
8
+ */
9
+ export default class WorkerThread {
10
+ readonly name: string;
11
+ readonly source: string | undefined;
12
+ readonly url: string | undefined;
13
+ terminated: boolean;
14
+ worker: Worker;
15
+ onMessage: (message: any) => void;
16
+ onError: (error: Error) => void;
17
+ private _loadableURL;
18
+ static isSupported(): boolean;
19
+ constructor(props: WorkerThreadProps);
20
+ /**
21
+ * Terminate this worker thread
22
+ * @note Can free up significant memory
23
+ */
24
+ destroy(): void;
25
+ get isRunning(): boolean;
26
+ /**
27
+ * Send a message to this worker thread
28
+ * @param data any data structure, ideally consisting mostly of transferrable objects
29
+ * @param transferList If not supplied, calculated automatically by traversing data
30
+ */
31
+ postMessage(data: any, transferList?: any[]): void;
32
+ /**
33
+ * Generate a standard Error from an ErrorEvent
34
+ * @param {ErrorEvent} event
35
+ */
36
+ _getErrorFromErrorEvent(event: ErrorEvent): Error;
37
+ /**
38
+ * Creates a worker thread on the browser
39
+ */
40
+ _createBrowserWorker(): Worker;
41
+ }
42
+ //# 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":"AAMA,oBAAY,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,CAAC;IACf,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,MAAM,CAAC,WAAW,IAAI,OAAO;gBAIjB,KAAK,EAAE,iBAAiB;IAYpC;;;OAGG;IACH,OAAO,IAAI,IAAI;IAQf,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;CAqBrB"}