apify 2.3.1-beta.4 → 3.0.0-alpha.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 (211) hide show
  1. package/README.md +6 -5
  2. package/package.json +69 -128
  3. package/build/actor.d.ts +0 -113
  4. package/build/actor.d.ts.map +0 -1
  5. package/build/actor.js +0 -582
  6. package/build/actor.js.map +0 -1
  7. package/build/apify.d.ts +0 -752
  8. package/build/apify.d.ts.map +0 -1
  9. package/build/apify.js +0 -877
  10. package/build/apify.js.map +0 -1
  11. package/build/autoscaling/autoscaled_pool.d.ts +0 -384
  12. package/build/autoscaling/autoscaled_pool.d.ts.map +0 -1
  13. package/build/autoscaling/autoscaled_pool.js +0 -557
  14. package/build/autoscaling/autoscaled_pool.js.map +0 -1
  15. package/build/autoscaling/snapshotter.d.ts +0 -278
  16. package/build/autoscaling/snapshotter.d.ts.map +0 -1
  17. package/build/autoscaling/snapshotter.js +0 -447
  18. package/build/autoscaling/snapshotter.js.map +0 -1
  19. package/build/autoscaling/system_status.d.ts +0 -224
  20. package/build/autoscaling/system_status.d.ts.map +0 -1
  21. package/build/autoscaling/system_status.js +0 -228
  22. package/build/autoscaling/system_status.js.map +0 -1
  23. package/build/browser_launchers/browser_launcher.d.ts +0 -154
  24. package/build/browser_launchers/browser_launcher.d.ts.map +0 -1
  25. package/build/browser_launchers/browser_launcher.js +0 -160
  26. package/build/browser_launchers/browser_launcher.js.map +0 -1
  27. package/build/browser_launchers/browser_plugin.d.ts +0 -23
  28. package/build/browser_launchers/browser_plugin.d.ts.map +0 -1
  29. package/build/browser_launchers/browser_plugin.js +0 -25
  30. package/build/browser_launchers/browser_plugin.js.map +0 -1
  31. package/build/browser_launchers/playwright_launcher.d.ts +0 -131
  32. package/build/browser_launchers/playwright_launcher.d.ts.map +0 -1
  33. package/build/browser_launchers/playwright_launcher.js +0 -150
  34. package/build/browser_launchers/playwright_launcher.js.map +0 -1
  35. package/build/browser_launchers/puppeteer_launcher.d.ts +0 -153
  36. package/build/browser_launchers/puppeteer_launcher.d.ts.map +0 -1
  37. package/build/browser_launchers/puppeteer_launcher.js +0 -197
  38. package/build/browser_launchers/puppeteer_launcher.js.map +0 -1
  39. package/build/cache_container.d.ts +0 -31
  40. package/build/cache_container.d.ts.map +0 -1
  41. package/build/cache_container.js +0 -48
  42. package/build/cache_container.js.map +0 -1
  43. package/build/configuration.d.ts +0 -226
  44. package/build/configuration.d.ts.map +0 -1
  45. package/build/configuration.js +0 -325
  46. package/build/configuration.js.map +0 -1
  47. package/build/constants.d.ts +0 -37
  48. package/build/constants.d.ts.map +0 -1
  49. package/build/constants.js +0 -41
  50. package/build/constants.js.map +0 -1
  51. package/build/crawlers/basic_crawler.d.ts +0 -443
  52. package/build/crawlers/basic_crawler.d.ts.map +0 -1
  53. package/build/crawlers/basic_crawler.js +0 -664
  54. package/build/crawlers/basic_crawler.js.map +0 -1
  55. package/build/crawlers/browser_crawler.d.ts +0 -512
  56. package/build/crawlers/browser_crawler.d.ts.map +0 -1
  57. package/build/crawlers/browser_crawler.js +0 -540
  58. package/build/crawlers/browser_crawler.js.map +0 -1
  59. package/build/crawlers/cheerio_crawler.d.ts +0 -931
  60. package/build/crawlers/cheerio_crawler.d.ts.map +0 -1
  61. package/build/crawlers/cheerio_crawler.js +0 -913
  62. package/build/crawlers/cheerio_crawler.js.map +0 -1
  63. package/build/crawlers/crawler_extension.d.ts +0 -10
  64. package/build/crawlers/crawler_extension.d.ts.map +0 -1
  65. package/build/crawlers/crawler_extension.js +0 -19
  66. package/build/crawlers/crawler_extension.js.map +0 -1
  67. package/build/crawlers/crawler_utils.d.ts +0 -34
  68. package/build/crawlers/crawler_utils.d.ts.map +0 -1
  69. package/build/crawlers/crawler_utils.js +0 -87
  70. package/build/crawlers/crawler_utils.js.map +0 -1
  71. package/build/crawlers/playwright_crawler.d.ts +0 -448
  72. package/build/crawlers/playwright_crawler.d.ts.map +0 -1
  73. package/build/crawlers/playwright_crawler.js +0 -299
  74. package/build/crawlers/playwright_crawler.js.map +0 -1
  75. package/build/crawlers/puppeteer_crawler.d.ts +0 -425
  76. package/build/crawlers/puppeteer_crawler.d.ts.map +0 -1
  77. package/build/crawlers/puppeteer_crawler.js +0 -299
  78. package/build/crawlers/puppeteer_crawler.js.map +0 -1
  79. package/build/crawlers/statistics.d.ts +0 -185
  80. package/build/crawlers/statistics.d.ts.map +0 -1
  81. package/build/crawlers/statistics.js +0 -331
  82. package/build/crawlers/statistics.js.map +0 -1
  83. package/build/enqueue_links/click_elements.d.ts +0 -179
  84. package/build/enqueue_links/click_elements.d.ts.map +0 -1
  85. package/build/enqueue_links/click_elements.js +0 -434
  86. package/build/enqueue_links/click_elements.js.map +0 -1
  87. package/build/enqueue_links/enqueue_links.d.ts +0 -117
  88. package/build/enqueue_links/enqueue_links.d.ts.map +0 -1
  89. package/build/enqueue_links/enqueue_links.js +0 -163
  90. package/build/enqueue_links/enqueue_links.js.map +0 -1
  91. package/build/enqueue_links/shared.d.ts +0 -42
  92. package/build/enqueue_links/shared.d.ts.map +0 -1
  93. package/build/enqueue_links/shared.js +0 -121
  94. package/build/enqueue_links/shared.js.map +0 -1
  95. package/build/errors.d.ts +0 -29
  96. package/build/errors.d.ts.map +0 -1
  97. package/build/errors.js +0 -38
  98. package/build/errors.js.map +0 -1
  99. package/build/events.d.ts +0 -11
  100. package/build/events.d.ts.map +0 -1
  101. package/build/events.js +0 -147
  102. package/build/events.js.map +0 -1
  103. package/build/index.d.ts +0 -4
  104. package/build/index.d.ts.map +0 -1
  105. package/build/index.js +0 -7
  106. package/build/index.js.map +0 -1
  107. package/build/main.d.ts +0 -179
  108. package/build/main.d.ts.map +0 -1
  109. package/build/main.js +0 -81
  110. package/build/main.js.map +0 -1
  111. package/build/playwright_utils.d.ts +0 -9
  112. package/build/playwright_utils.d.ts.map +0 -1
  113. package/build/playwright_utils.js +0 -90
  114. package/build/playwright_utils.js.map +0 -1
  115. package/build/proxy_configuration.d.ts +0 -411
  116. package/build/proxy_configuration.d.ts.map +0 -1
  117. package/build/proxy_configuration.js +0 -517
  118. package/build/proxy_configuration.js.map +0 -1
  119. package/build/pseudo_url.d.ts +0 -86
  120. package/build/pseudo_url.d.ts.map +0 -1
  121. package/build/pseudo_url.js +0 -153
  122. package/build/pseudo_url.js.map +0 -1
  123. package/build/puppeteer_request_interception.d.ts +0 -8
  124. package/build/puppeteer_request_interception.d.ts.map +0 -1
  125. package/build/puppeteer_request_interception.js +0 -235
  126. package/build/puppeteer_request_interception.js.map +0 -1
  127. package/build/puppeteer_utils.d.ts +0 -250
  128. package/build/puppeteer_utils.d.ts.map +0 -1
  129. package/build/puppeteer_utils.js +0 -551
  130. package/build/puppeteer_utils.js.map +0 -1
  131. package/build/request.d.ts +0 -180
  132. package/build/request.d.ts.map +0 -1
  133. package/build/request.js +0 -261
  134. package/build/request.js.map +0 -1
  135. package/build/request_list.d.ts +0 -581
  136. package/build/request_list.d.ts.map +0 -1
  137. package/build/request_list.js +0 -826
  138. package/build/request_list.js.map +0 -1
  139. package/build/serialization.d.ts +0 -5
  140. package/build/serialization.d.ts.map +0 -1
  141. package/build/serialization.js +0 -139
  142. package/build/serialization.js.map +0 -1
  143. package/build/session_pool/errors.d.ts +0 -11
  144. package/build/session_pool/errors.d.ts.map +0 -1
  145. package/build/session_pool/errors.js +0 -18
  146. package/build/session_pool/errors.js.map +0 -1
  147. package/build/session_pool/events.d.ts +0 -5
  148. package/build/session_pool/events.d.ts.map +0 -1
  149. package/build/session_pool/events.js +0 -6
  150. package/build/session_pool/events.js.map +0 -1
  151. package/build/session_pool/session.d.ts +0 -286
  152. package/build/session_pool/session.d.ts.map +0 -1
  153. package/build/session_pool/session.js +0 -355
  154. package/build/session_pool/session.js.map +0 -1
  155. package/build/session_pool/session_pool.d.ts +0 -280
  156. package/build/session_pool/session_pool.d.ts.map +0 -1
  157. package/build/session_pool/session_pool.js +0 -393
  158. package/build/session_pool/session_pool.js.map +0 -1
  159. package/build/session_pool/session_utils.d.ts +0 -4
  160. package/build/session_pool/session_utils.d.ts.map +0 -1
  161. package/build/session_pool/session_utils.js +0 -24
  162. package/build/session_pool/session_utils.js.map +0 -1
  163. package/build/stealth/hiding_tricks.d.ts +0 -22
  164. package/build/stealth/hiding_tricks.d.ts.map +0 -1
  165. package/build/stealth/hiding_tricks.js +0 -308
  166. package/build/stealth/hiding_tricks.js.map +0 -1
  167. package/build/stealth/stealth.d.ts +0 -56
  168. package/build/stealth/stealth.d.ts.map +0 -1
  169. package/build/stealth/stealth.js +0 -125
  170. package/build/stealth/stealth.js.map +0 -1
  171. package/build/storages/dataset.d.ts +0 -288
  172. package/build/storages/dataset.d.ts.map +0 -1
  173. package/build/storages/dataset.js +0 -480
  174. package/build/storages/dataset.js.map +0 -1
  175. package/build/storages/key_value_store.d.ts +0 -243
  176. package/build/storages/key_value_store.d.ts.map +0 -1
  177. package/build/storages/key_value_store.js +0 -462
  178. package/build/storages/key_value_store.js.map +0 -1
  179. package/build/storages/request_queue.d.ts +0 -318
  180. package/build/storages/request_queue.d.ts.map +0 -1
  181. package/build/storages/request_queue.js +0 -636
  182. package/build/storages/request_queue.js.map +0 -1
  183. package/build/storages/storage_manager.d.ts +0 -87
  184. package/build/storages/storage_manager.d.ts.map +0 -1
  185. package/build/storages/storage_manager.js +0 -150
  186. package/build/storages/storage_manager.js.map +0 -1
  187. package/build/tsconfig.tsbuildinfo +0 -1
  188. package/build/typedefs.d.ts +0 -146
  189. package/build/typedefs.d.ts.map +0 -1
  190. package/build/typedefs.js +0 -88
  191. package/build/typedefs.js.map +0 -1
  192. package/build/utils.d.ts +0 -175
  193. package/build/utils.d.ts.map +0 -1
  194. package/build/utils.js +0 -731
  195. package/build/utils.js.map +0 -1
  196. package/build/utils_log.d.ts +0 -41
  197. package/build/utils_log.d.ts.map +0 -1
  198. package/build/utils_log.js +0 -192
  199. package/build/utils_log.js.map +0 -1
  200. package/build/utils_request.d.ts +0 -77
  201. package/build/utils_request.d.ts.map +0 -1
  202. package/build/utils_request.js +0 -385
  203. package/build/utils_request.js.map +0 -1
  204. package/build/utils_social.d.ts +0 -210
  205. package/build/utils_social.d.ts.map +0 -1
  206. package/build/utils_social.js +0 -787
  207. package/build/utils_social.js.map +0 -1
  208. package/build/validators.d.ts +0 -23
  209. package/build/validators.d.ts.map +0 -1
  210. package/build/validators.js +0 -29
  211. package/build/validators.js.map +0 -1
@@ -1,557 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("tslib");
4
- const timeout_1 = require("@apify/timeout");
5
- const utilities_1 = require("@apify/utilities");
6
- const ow_1 = (0, tslib_1.__importDefault)(require("ow"));
7
- const snapshotter_1 = (0, tslib_1.__importDefault)(require("./snapshotter")); // eslint-disable-line import/named,no-unused-vars
8
- const system_status_1 = (0, tslib_1.__importDefault)(require("./system_status")); // eslint-disable-line import/named,no-unused-vars
9
- const utils_log_1 = (0, tslib_1.__importDefault)(require("../utils_log")); // eslint-disable-line no-unused-vars
10
- /**
11
- * @typedef AutoscaledPoolOptions
12
- * @property {Function} [runTaskFunction]
13
- * A function that performs an asynchronous resource-intensive task.
14
- * The function must either be labeled `async` or return a promise.
15
- *
16
- * @property {Function} [isTaskReadyFunction]
17
- * A function that indicates whether `runTaskFunction` should be called.
18
- * This function is called every time there is free capacity for a new task and it should
19
- * indicate whether it should start a new task or not by resolving to either `true` or `false`.
20
- * Besides its obvious use, it is also useful for task throttling to save resources.
21
- *
22
- * @property {Function} [isFinishedFunction]
23
- * A function that is called only when there are no tasks to be processed.
24
- * If it resolves to `true` then the pool's run finishes. Being called only
25
- * when there are no tasks being processed means that as long as `isTaskReadyFunction()`
26
- * keeps resolving to `true`, `isFinishedFunction()` will never be called.
27
- * To abort a run, use the {@link AutoscaledPool#abort} method.
28
- *
29
- * @property {number} [minConcurrency=1]
30
- * The minimum number of tasks running in parallel.
31
- *
32
- * *WARNING:* If you set this value too high with respect to the available system memory and CPU, your code might run extremely slow or crash.
33
- * If you're not sure, just keep the default value and the concurrency will scale up automatically.
34
- * @property {number} [maxConcurrency=1000]
35
- * The maximum number of tasks running in parallel.
36
- * @property {number} [desiredConcurrency]
37
- * The desired number of tasks that should be running parallel on the start of the pool,
38
- * if there is a large enough supply of them.
39
- * By default, it is `minConcurrency`.
40
- * @property {number} [desiredConcurrencyRatio=0.95]
41
- * Minimum level of desired concurrency to reach before more scaling up is allowed.
42
- * @property {number} [scaleUpStepRatio=0.05]
43
- * Defines the fractional amount of desired concurrency to be added with each scaling up.
44
- * The minimum scaling step is one.
45
- * @property {number} [scaleDownStepRatio=0.05]
46
- * Defines the amount of desired concurrency to be subtracted with each scaling down.
47
- * The minimum scaling step is one.
48
- * @property {number} [maybeRunIntervalSecs=0.5]
49
- * Indicates how often the pool should call the `runTaskFunction()` to start a new task, in seconds.
50
- * This has no effect on starting new tasks immediately after a task completes.
51
- * @property {number} [loggingIntervalSecs=60]
52
- * Specifies a period in which the instance logs its state, in seconds.
53
- * Set to `null` to disable periodic logging.
54
- * @property {number} [autoscaleIntervalSecs=10]
55
- * Defines in seconds how often the pool should attempt to adjust the desired concurrency
56
- * based on the latest system status. Setting it lower than 1 might have a severe impact on performance.
57
- * We suggest using a value from 5 to 20.
58
- * @property {number} [taskTimeoutSecs=0]
59
- * Timeout in which the `runTaskFunction` needs to finish, given in seconds.
60
- * @property {SnapshotterOptions} [snapshotterOptions]
61
- * Options to be passed down to the {@link Snapshotter} constructor. This is useful for fine-tuning
62
- * the snapshot intervals and history.
63
- * @property {SystemStatusOptions} [systemStatusOptions]
64
- * Options to be passed down to the {@link SystemStatus} constructor. This is useful for fine-tuning
65
- * the system status reports. If a custom snapshotter is set in the options, it will be used
66
- * by the pool.
67
- */
68
- /**
69
- * Manages a pool of asynchronous resource-intensive tasks that are executed in parallel.
70
- * The pool only starts new tasks if there is enough free CPU and memory available
71
- * and the Javascript event loop is not blocked.
72
- *
73
- * The information about the CPU and memory usage is obtained by the {@link Snapshotter} class,
74
- * which makes regular snapshots of system resources that may be either local
75
- * or from the Apify cloud infrastructure in case the process is running on the Apify platform.
76
- * Meaningful data gathered from these snapshots is provided to `AutoscaledPool` by the {@link SystemStatus} class.
77
- *
78
- * Before running the pool, you need to implement the following three functions:
79
- * {@link AutoscaledPoolOptions#runTaskFunction},
80
- * {@link AutoscaledPoolOptions#isTaskReadyFunction} and
81
- * {@link AutoscaledPoolOptions#isFinishedFunction}.
82
- *
83
- * The auto-scaled pool is started by calling the {@link AutoscaledPool#run} function.
84
- * The pool periodically queries the {@link AutoscaledPoolOptions#isTaskReadyFunction} function
85
- * for more tasks, managing optimal concurrency, until the function resolves to `false`. The pool then queries
86
- * the {@link AutoscaledPoolOptions#isFinishedFunction}. If it resolves to `true`, the run finishes after all running tasks complete.
87
- * If it resolves to `false`, it assumes there will be more tasks available later and keeps periodically querying for tasks.
88
- * If any of the tasks throws then the {@link AutoscaledPool#run} function rejects the promise with an error.
89
- *
90
- * The pool evaluates whether it should start a new task every time one of the tasks finishes
91
- * and also in the interval set by the `options.maybeRunIntervalSecs` parameter.
92
- *
93
- * **Example usage:**
94
- *
95
- * ```javascript
96
- * const pool = new Apify.AutoscaledPool({
97
- * maxConcurrency: 50,
98
- * runTaskFunction: async () => {
99
- * // Run some resource-intensive asynchronous operation here.
100
- * },
101
- * isTaskReadyFunction: async () => {
102
- * // Tell the pool whether more tasks are ready to be processed.
103
- * // Return true or false
104
- * },
105
- * isFinishedFunction: async () => {
106
- * // Tell the pool whether it should finish
107
- * // or wait for more tasks to become available.
108
- * // Return true or false
109
- * }
110
- * });
111
- *
112
- * await pool.run();
113
- * ```
114
- */
115
- class AutoscaledPool {
116
- /**
117
- * @param {AutoscaledPoolOptions} options
118
- * All `AutoscaledPool` configuration options.
119
- */
120
- constructor(options) {
121
- (0, ow_1.default)(options, ow_1.default.object.exactShape({
122
- runTaskFunction: ow_1.default.function,
123
- isFinishedFunction: ow_1.default.function,
124
- isTaskReadyFunction: ow_1.default.function,
125
- maxConcurrency: ow_1.default.optional.number,
126
- minConcurrency: ow_1.default.optional.number,
127
- desiredConcurrency: ow_1.default.optional.number,
128
- desiredConcurrencyRatio: ow_1.default.optional.number,
129
- scaleUpStepRatio: ow_1.default.optional.number,
130
- scaleDownStepRatio: ow_1.default.optional.number,
131
- maybeRunIntervalSecs: ow_1.default.optional.number,
132
- loggingIntervalSecs: ow_1.default.any(ow_1.default.number, ow_1.default.nullOrUndefined),
133
- autoscaleIntervalSecs: ow_1.default.optional.number,
134
- taskTimeoutSecs: ow_1.default.optional.number,
135
- systemStatusOptions: ow_1.default.optional.object,
136
- snapshotterOptions: ow_1.default.optional.object,
137
- log: ow_1.default.optional.object,
138
- }));
139
- const { runTaskFunction, isFinishedFunction, isTaskReadyFunction, maxConcurrency = 1000, minConcurrency = 1, desiredConcurrency, desiredConcurrencyRatio = 0.90, scaleUpStepRatio = 0.05, scaleDownStepRatio = 0.05, maybeRunIntervalSecs = 0.5, loggingIntervalSecs = 60, taskTimeoutSecs = 0, autoscaleIntervalSecs = 10, systemStatusOptions, snapshotterOptions, log = utils_log_1.default, } = options;
140
- /**
141
- * @type {Log}
142
- */
143
- this.log = log.child({ prefix: 'AutoscaledPool' });
144
- // Configurable properties.
145
- this.desiredConcurrencyRatio = desiredConcurrencyRatio;
146
- this.scaleUpStepRatio = scaleUpStepRatio;
147
- this.scaleDownStepRatio = scaleDownStepRatio;
148
- this.maybeRunIntervalMillis = maybeRunIntervalSecs * 1000;
149
- this.loggingIntervalMillis = loggingIntervalSecs * 1000;
150
- this.autoscaleIntervalMillis = autoscaleIntervalSecs * 1000;
151
- this.taskTimeoutMillis = taskTimeoutSecs * 1000;
152
- this.runTaskFunction = runTaskFunction;
153
- this.isFinishedFunction = isFinishedFunction;
154
- this.isTaskReadyFunction = isTaskReadyFunction;
155
- // Internal properties.
156
- this._minConcurrency = minConcurrency;
157
- this._maxConcurrency = maxConcurrency;
158
- this._desiredConcurrency = typeof desiredConcurrency === 'number' ? desiredConcurrency : minConcurrency;
159
- this._currentConcurrency = 0;
160
- this.isStopped = false;
161
- this.lastLoggingTime = 0;
162
- this.resolve = null;
163
- this.reject = null;
164
- this._autoscale = this._autoscale.bind(this);
165
- this._maybeRunTask = this._maybeRunTask.bind(this);
166
- // Create instances with correct options.
167
- const ssoCopy = { ...systemStatusOptions };
168
- if (!ssoCopy.snapshotter)
169
- ssoCopy.snapshotter = new snapshotter_1.default({ ...snapshotterOptions, log: this.log });
170
- this.snapshotter = ssoCopy.snapshotter;
171
- this.systemStatus = new system_status_1.default(ssoCopy);
172
- }
173
- /**
174
- * Gets the minimum number of tasks running in parallel.
175
- *
176
- * @return {number}
177
- */
178
- get minConcurrency() {
179
- return this._minConcurrency;
180
- }
181
- /**
182
- * Sets the minimum number of tasks running in parallel.
183
- *
184
- * *WARNING:* If you set this value too high with respect to the available system memory and CPU, your code might run extremely slow or crash.
185
- * If you're not sure, just keep the default value and the concurrency will scale up automatically.
186
- *
187
- * @param {number} value
188
- */
189
- set minConcurrency(value) {
190
- (0, ow_1.default)(value, ow_1.default.number);
191
- this._minConcurrency = value;
192
- }
193
- /**
194
- * Gets the maximum number of tasks running in parallel.
195
- *
196
- * @return {number}
197
- */
198
- get maxConcurrency() {
199
- return this._maxConcurrency;
200
- }
201
- /**
202
- * Sets the maximum number of tasks running in parallel.
203
- *
204
- * @param {number} value
205
- */
206
- set maxConcurrency(value) {
207
- (0, ow_1.default)(value, ow_1.default.number);
208
- this._maxConcurrency = value;
209
- }
210
- /**
211
- * Gets the desired concurrency for the pool,
212
- * which is an estimated number of parallel tasks that the system can currently support.
213
- *
214
- * @return {number}
215
- */
216
- get desiredConcurrency() {
217
- return this._desiredConcurrency;
218
- }
219
- /**
220
- * Sets the desired concurrency for the pool, i.e. the number of tasks that should be running
221
- * in parallel if there's large enough supply of tasks.
222
- *
223
- * @param {number} value
224
- */
225
- set desiredConcurrency(value) {
226
- (0, ow_1.default)(value, ow_1.default.number);
227
- this._desiredConcurrency = value;
228
- }
229
- /**
230
- * Gets the the number of parallel tasks currently running in the pool.
231
- *
232
- * @return {number}
233
- */
234
- get currentConcurrency() {
235
- return this._currentConcurrency;
236
- }
237
- /**
238
- * Runs the auto-scaled pool. Returns a promise that gets resolved or rejected once
239
- * all the tasks are finished or one of them fails.
240
- *
241
- * @return {Promise<void>}
242
- */
243
- async run() {
244
- this.poolPromise = new Promise((resolve, reject) => {
245
- this.resolve = resolve;
246
- this.reject = reject;
247
- });
248
- await this.snapshotter.start();
249
- // This interval checks the system status and updates the desired concurrency accordingly.
250
- this.autoscaleInterval = (0, utilities_1.betterSetInterval)(this._autoscale, this.autoscaleIntervalMillis);
251
- // This is here because if we scale down to let's say 1, then after each promise is finished
252
- // this._maybeRunTask() doesn't trigger another one. So if that 1 instance gets stuck it results
253
- // in the actor getting stuck and even after scaling up it never triggers another promise.
254
- this.maybeRunInterval = (0, utilities_1.betterSetInterval)(this._maybeRunTask, this.maybeRunIntervalMillis);
255
- try {
256
- await this.poolPromise;
257
- }
258
- finally {
259
- // If resolve is null, the pool is already destroyed.
260
- if (this.resolve)
261
- await this._destroy();
262
- }
263
- }
264
- /**
265
- * Aborts the run of the auto-scaled pool and destroys it. The promise returned from
266
- * the {@link AutoscaledPool#run} function will immediately resolve, no more new tasks
267
- * will be spawned and all running tasks will be left in their current state.
268
- *
269
- * Due to the nature of the tasks, auto-scaled pool cannot reliably guarantee abortion
270
- * of all the running tasks, therefore, no abortion is attempted and some of the tasks
271
- * may finish, while others may not. Essentially, auto-scaled pool doesn't care about
272
- * their state after the invocation of `.abort()`, but that does not mean that some
273
- * parts of their asynchronous chains of commands will not execute.
274
- *
275
- * @return {Promise<void>}
276
- */
277
- async abort() {
278
- this.isStopped = true;
279
- if (this.resolve) {
280
- this.resolve();
281
- await this._destroy();
282
- }
283
- }
284
- /**
285
- * Prevents the auto-scaled pool from starting new tasks, but allows the running ones to finish
286
- * (unlike abort, which terminates them). Used together with {@link AutoscaledPool#resume}
287
- *
288
- * The function's promise will resolve once all running tasks have completed and the pool
289
- * is effectively idle. If the `timeoutSecs` argument is provided, the promise will reject
290
- * with a timeout error after the `timeoutSecs` seconds.
291
- *
292
- * The promise returned from the {@link AutoscaledPool#run} function will not resolve
293
- * when `.pause()` is invoked (unlike abort, which resolves it).
294
- *
295
- * @param {number} [timeoutSecs]
296
- * @return {Promise<void>}
297
- */
298
- async pause(timeoutSecs) {
299
- if (this.isStopped)
300
- return;
301
- this.isStopped = true;
302
- return new Promise((resolve, reject) => {
303
- let timeout;
304
- if (timeoutSecs) {
305
- timeout = setTimeout(() => {
306
- const err = new Error('The pool\'s running tasks did not finish'
307
- + `in ${timeoutSecs} secs after pool.pause() invocation.`);
308
- reject(err);
309
- }, timeoutSecs);
310
- }
311
- const interval = setInterval(() => {
312
- if (this._currentConcurrency <= 0) {
313
- // Clean up timeout and interval to prevent process hanging.
314
- if (timeout)
315
- clearTimeout(timeout);
316
- clearInterval(interval);
317
- resolve();
318
- }
319
- }, this.maybeRunIntervalMillis);
320
- });
321
- }
322
- /**
323
- * Resumes the operation of the autoscaled-pool by allowing more tasks to be run.
324
- * Used together with {@link AutoscaledPool#pause}
325
- *
326
- * Tasks will automatically start running again in `options.maybeRunIntervalSecs`.
327
- */
328
- resume() {
329
- this.isStopped = false;
330
- }
331
- /**
332
- * Starts a new task
333
- * if the number of running tasks (current concurrency) is lower than desired concurrency
334
- * and the system is not currently overloaded
335
- * and this.isTaskReadyFunction() returns true.
336
- *
337
- * It doesn't allow multiple concurrent runs of this method.
338
- *
339
- * @ignore
340
- * @protected
341
- * @internal
342
- */
343
- async _maybeRunTask(intervalCallback) {
344
- this.log.perf('Attempting to run a task.');
345
- // Check if the function was invoked by the maybeRunInterval and use an empty function if not.
346
- const done = intervalCallback || (() => { });
347
- // Prevent starting a new task if:
348
- // - the pool is paused or aborted
349
- if (this.isStopped) {
350
- this.log.perf('Task will not run. AutoscaledPool is stopped.');
351
- return done();
352
- }
353
- // - we are already querying for a task.
354
- if (this.queryingIsTaskReady) {
355
- this.log.perf('Task will not run. Waiting for a ready task.');
356
- return done();
357
- }
358
- // - we would exceed desired concurrency.
359
- if (this._currentConcurrency >= this._desiredConcurrency) {
360
- this.log.perf('Task will not run. Desired concurrency achieved.');
361
- return done();
362
- }
363
- // - system is overloaded now and we are at or above minConcurrency
364
- const currentStatus = this.systemStatus.getCurrentStatus();
365
- const { isSystemIdle } = currentStatus;
366
- if (!isSystemIdle && this._currentConcurrency >= this._minConcurrency) {
367
- this.log.perf('Task will not be run. System is overloaded.', currentStatus);
368
- return done();
369
- }
370
- // - a task is ready.
371
- this.queryingIsTaskReady = true;
372
- let isTaskReady;
373
- try {
374
- this.log.perf('Checking for ready tasks.');
375
- isTaskReady = await this.isTaskReadyFunction();
376
- }
377
- catch (err) {
378
- this.log.perf('Checking for ready tasks failed.');
379
- // We might have already rejected this promise.
380
- if (this.reject) {
381
- // No need to log all concurrent errors.
382
- this.log.exception(err, 'isTaskReadyFunction failed');
383
- this.reject(err);
384
- }
385
- }
386
- finally {
387
- this.queryingIsTaskReady = false;
388
- }
389
- if (!isTaskReady) {
390
- this.log.perf('Task will not run. No tasks are ready.');
391
- done();
392
- // No tasks could mean that we're finished with all tasks.
393
- return this._maybeFinish();
394
- }
395
- try {
396
- // Everything's fine. Run task.
397
- this._currentConcurrency++;
398
- // Try to run next task to build up concurrency,
399
- // but defer it so it doesn't create a cycle.
400
- setImmediate(this._maybeRunTask);
401
- // We need to restart interval here, so that it doesn't get blocked by a stalled task.
402
- done();
403
- // Execute the current task.
404
- this.log.perf('Running a task.');
405
- if (this.taskTimeoutMillis > 0) {
406
- await (0, timeout_1.addTimeoutToPromise)(() => this.runTaskFunction(), this.taskTimeoutMillis, `runTaskFunction timed out after ${this.taskTimeoutMillis / 1000} seconds.`);
407
- }
408
- else {
409
- await this.runTaskFunction();
410
- }
411
- this.log.perf('Task finished.');
412
- this._currentConcurrency--;
413
- // Run task after the previous one finished.
414
- setImmediate(this._maybeRunTask);
415
- }
416
- catch (err) {
417
- this.log.perf('Running a task failed.');
418
- // We might have already rejected this promise.
419
- if (this.reject) {
420
- // No need to log all concurrent errors.
421
- this.log.exception(err, 'runTaskFunction failed.');
422
- this.reject(err);
423
- }
424
- }
425
- }
426
- /**
427
- * Gets called every autoScaleIntervalSecs and evaluates the current system status.
428
- * If the system IS NOT overloaded and the settings allow it, it scales up.
429
- * If the system IS overloaded and the settings allow it, it scales down.
430
- *
431
- * @ignore
432
- * @protected
433
- * @internal
434
- */
435
- _autoscale(intervalCallback) {
436
- // Don't scale if paused.
437
- if (this.isStopped)
438
- return intervalCallback();
439
- // Only scale up if:
440
- // - system has not been overloaded lately.
441
- const systemStatus = this.systemStatus.getHistoricalStatus();
442
- const { isSystemIdle } = systemStatus;
443
- // - we're not already at max concurrency.
444
- const weAreNotAtMax = this._desiredConcurrency < this._maxConcurrency;
445
- // - current concurrency reaches at least the given ratio of desired concurrency.
446
- const minCurrentConcurrency = Math.floor(this._desiredConcurrency * this.desiredConcurrencyRatio);
447
- const weAreReachingDesiredConcurrency = this._currentConcurrency >= minCurrentConcurrency;
448
- if (isSystemIdle && weAreNotAtMax && weAreReachingDesiredConcurrency)
449
- this._scaleUp(systemStatus);
450
- // Always scale down if:
451
- // - the system has been overloaded lately.
452
- const isSystemOverloaded = !isSystemIdle;
453
- // - we're over min concurrency.
454
- const weAreNotAtMin = this._desiredConcurrency > this._minConcurrency;
455
- if (isSystemOverloaded && weAreNotAtMin)
456
- this._scaleDown(systemStatus);
457
- // On periodic intervals, print comprehensive log information
458
- if (this.loggingIntervalMillis > 0) {
459
- const now = Date.now();
460
- if (now > this.lastLoggingTime + this.loggingIntervalMillis) {
461
- this.lastLoggingTime = now;
462
- this.log.info('state', {
463
- currentConcurrency: this._currentConcurrency,
464
- desiredConcurrency: this._desiredConcurrency,
465
- systemStatus,
466
- });
467
- }
468
- }
469
- // Start a new interval cycle.
470
- intervalCallback();
471
- }
472
- /**
473
- * Scales the pool up by increasing
474
- * the desired concurrency by the scaleUpStepRatio.
475
- *
476
- * @param {Object} systemStatus for logging
477
- * @ignore
478
- * @protected
479
- * @internal
480
- */
481
- _scaleUp(systemStatus) {
482
- const step = Math.ceil(this._desiredConcurrency * this.scaleUpStepRatio);
483
- this._desiredConcurrency = Math.min(this._maxConcurrency, this._desiredConcurrency + step);
484
- this.log.debug('scaling up', {
485
- oldConcurrency: this._desiredConcurrency - step,
486
- newConcurrency: this._desiredConcurrency,
487
- systemStatus,
488
- });
489
- }
490
- /**
491
- * Scales the pool down by decreasing
492
- * the desired concurrency by the scaleDownStepRatio.
493
- *
494
- * @param {Object} systemStatus for logging
495
- * @ignore
496
- * @protected
497
- * @internal
498
- */
499
- _scaleDown(systemStatus) {
500
- const step = Math.ceil(this._desiredConcurrency * this.scaleUpStepRatio);
501
- this._desiredConcurrency = Math.max(this._minConcurrency, this._desiredConcurrency - step);
502
- this.log.debug('scaling down', {
503
- oldConcurrency: this._desiredConcurrency + step,
504
- newConcurrency: this._desiredConcurrency,
505
- systemStatus,
506
- });
507
- }
508
- /**
509
- * If there are no running tasks and this.isFinishedFunction() returns true then closes
510
- * the pool and resolves the pool's promise returned by the run() method.
511
- *
512
- * It doesn't allow multiple concurrent runs of this method.
513
- *
514
- * @ignore
515
- * @protected
516
- * @internal
517
- */
518
- async _maybeFinish() {
519
- if (this.queryingIsFinished)
520
- return;
521
- if (this._currentConcurrency > 0)
522
- return;
523
- this.queryingIsFinished = true;
524
- try {
525
- const isFinished = await this.isFinishedFunction();
526
- if (isFinished && this.resolve)
527
- this.resolve();
528
- }
529
- catch (err) {
530
- if (this.reject) {
531
- // No need to log all concurrent errors.
532
- this.log.exception(err, 'isFinishedFunction failed.');
533
- this.reject(err);
534
- }
535
- }
536
- finally {
537
- this.queryingIsFinished = false;
538
- }
539
- }
540
- /**
541
- * Cleans up resources.
542
- *
543
- * @ignore
544
- * @protected
545
- * @internal
546
- */
547
- async _destroy() {
548
- this.resolve = null;
549
- this.reject = null;
550
- (0, utilities_1.betterClearInterval)(this.autoscaleInterval);
551
- (0, utilities_1.betterClearInterval)(this.maybeRunInterval);
552
- if (this.snapshotter)
553
- await this.snapshotter.stop();
554
- }
555
- }
556
- exports.default = AutoscaledPool;
557
- //# sourceMappingURL=autoscaled_pool.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"autoscaled_pool.js","sourceRoot":"","sources":["../../src/autoscaling/autoscaled_pool.js"],"names":[],"mappings":"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"}