@crawlee/core 4.0.0-beta.28 → 4.0.0-beta.280

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 (266) hide show
  1. package/README.md +15 -15
  2. package/byte-utils.d.ts +17 -0
  3. package/byte-utils.js +42 -0
  4. package/configuration.d.ts +75 -167
  5. package/configuration.js +164 -140
  6. package/debug.d.ts +36 -0
  7. package/debug.js +70 -0
  8. package/errors.d.ts +40 -19
  9. package/errors.js +52 -30
  10. package/events/{event_manager.d.ts → event-manager.d.ts} +29 -6
  11. package/events/{event_manager.js → event-manager.js} +10 -9
  12. package/events/index.d.ts +3 -3
  13. package/events/index.js +2 -3
  14. package/events/{local_event_manager.d.ts → local-event-manager.d.ts} +3 -10
  15. package/events/local-event-manager.js +101 -0
  16. package/events/system-info.d.ts +38 -0
  17. package/events/system-info.js +1 -0
  18. package/index.d.ts +9 -13
  19. package/index.js +10 -12
  20. package/internal.d.ts +8 -0
  21. package/internal.js +9 -0
  22. package/iterables.d.ts +79 -0
  23. package/iterables.js +134 -0
  24. package/log.d.ts +77 -1
  25. package/log.js +134 -1
  26. package/memory-storage/consts.d.ts +4 -0
  27. package/memory-storage/consts.js +4 -0
  28. package/memory-storage/index.d.ts +1 -0
  29. package/memory-storage/index.js +1 -0
  30. package/memory-storage/memory-storage.d.ts +43 -0
  31. package/memory-storage/memory-storage.js +158 -0
  32. package/memory-storage/resource-clients/common/base-client.d.ts +4 -0
  33. package/memory-storage/resource-clients/common/base-client.js +6 -0
  34. package/memory-storage/resource-clients/dataset.d.ts +35 -0
  35. package/memory-storage/resource-clients/dataset.js +108 -0
  36. package/memory-storage/resource-clients/key-value-store.d.ts +54 -0
  37. package/memory-storage/resource-clients/key-value-store.js +179 -0
  38. package/memory-storage/resource-clients/request-queue.d.ts +55 -0
  39. package/memory-storage/resource-clients/request-queue.js +413 -0
  40. package/memory-storage/utils.d.ts +16 -0
  41. package/memory-storage/utils.js +41 -0
  42. package/owned-or-injected.d.ts +58 -0
  43. package/owned-or-injected.js +98 -0
  44. package/package.json +23 -23
  45. package/proxy-configuration.d.ts +118 -0
  46. package/proxy-configuration.js +141 -0
  47. package/recoverable-state.d.ts +177 -0
  48. package/recoverable-state.js +268 -0
  49. package/request.d.ts +48 -101
  50. package/request.js +139 -249
  51. package/serialization.d.ts +0 -1
  52. package/serialization.js +18 -18
  53. package/{service_locator.d.ts → service-locator.d.ts} +66 -37
  54. package/service-locator.js +255 -0
  55. package/storages/batched-adds.d.ts +39 -0
  56. package/storages/batched-adds.js +81 -0
  57. package/storages/dataset.d.ts +105 -58
  58. package/storages/dataset.js +292 -151
  59. package/storages/index.d.ts +11 -12
  60. package/storages/index.js +7 -12
  61. package/storages/key-value-store-codec.d.ts +32 -0
  62. package/storages/key-value-store-codec.js +108 -0
  63. package/storages/{key_value_store.d.ts → key-value-store.d.ts} +169 -72
  64. package/storages/key-value-store.js +767 -0
  65. package/storages/request-dedup-cache.d.ts +20 -0
  66. package/storages/request-dedup-cache.js +48 -0
  67. package/storages/{request_list.d.ts → request-list.d.ts} +32 -171
  68. package/storages/{request_list.js → request-list.js} +276 -253
  69. package/storages/request-loader.d.ts +127 -0
  70. package/storages/request-loader.js +34 -0
  71. package/storages/request-manager-tandem.d.ts +82 -0
  72. package/storages/request-manager-tandem.js +200 -0
  73. package/storages/request-manager.d.ts +119 -0
  74. package/storages/request-manager.js +1 -0
  75. package/storages/{request_provider.d.ts → request-queue.d.ts} +127 -161
  76. package/storages/request-queue.js +871 -0
  77. package/storages/storage-instance-manager.d.ts +86 -0
  78. package/storages/storage-instance-manager.js +256 -0
  79. package/storages/storage-stats.d.ts +48 -0
  80. package/storages/storage-stats.js +29 -0
  81. package/storages/transaction.d.ts +270 -0
  82. package/storages/transaction.js +296 -0
  83. package/storages/utils.d.ts +59 -11
  84. package/storages/utils.js +76 -17
  85. package/system-info/cpu-info.d.ts +67 -0
  86. package/system-info/cpu-info.js +216 -0
  87. package/system-info/memory-info.d.ts +31 -0
  88. package/system-info/memory-info.js +115 -0
  89. package/system-info/ps-tree.d.ts +17 -0
  90. package/system-info/ps-tree.js +144 -0
  91. package/system-info/runtime.d.ts +14 -0
  92. package/system-info/runtime.js +80 -0
  93. package/typedefs.d.ts +0 -6
  94. package/typedefs.js +0 -1
  95. package/url.d.ts +9 -0
  96. package/url.js +11 -0
  97. package/validators.d.ts +23 -18
  98. package/validators.js +14 -18
  99. package/autoscaling/autoscaled_pool.d.ts +0 -298
  100. package/autoscaling/autoscaled_pool.d.ts.map +0 -1
  101. package/autoscaling/autoscaled_pool.js +0 -527
  102. package/autoscaling/autoscaled_pool.js.map +0 -1
  103. package/autoscaling/index.d.ts +0 -4
  104. package/autoscaling/index.d.ts.map +0 -1
  105. package/autoscaling/index.js +0 -4
  106. package/autoscaling/index.js.map +0 -1
  107. package/autoscaling/snapshotter.d.ts +0 -179
  108. package/autoscaling/snapshotter.d.ts.map +0 -1
  109. package/autoscaling/snapshotter.js +0 -279
  110. package/autoscaling/snapshotter.js.map +0 -1
  111. package/autoscaling/system_status.d.ts +0 -178
  112. package/autoscaling/system_status.d.ts.map +0 -1
  113. package/autoscaling/system_status.js +0 -168
  114. package/autoscaling/system_status.js.map +0 -1
  115. package/configuration.d.ts.map +0 -1
  116. package/configuration.js.map +0 -1
  117. package/cookie_utils.d.ts +0 -43
  118. package/cookie_utils.d.ts.map +0 -1
  119. package/cookie_utils.js +0 -111
  120. package/cookie_utils.js.map +0 -1
  121. package/crawlers/context_pipeline.d.ts +0 -61
  122. package/crawlers/context_pipeline.d.ts.map +0 -1
  123. package/crawlers/context_pipeline.js +0 -99
  124. package/crawlers/context_pipeline.js.map +0 -1
  125. package/crawlers/crawler_commons.d.ts +0 -191
  126. package/crawlers/crawler_commons.d.ts.map +0 -1
  127. package/crawlers/crawler_commons.js +0 -108
  128. package/crawlers/crawler_commons.js.map +0 -1
  129. package/crawlers/crawler_utils.d.ts +0 -10
  130. package/crawlers/crawler_utils.d.ts.map +0 -1
  131. package/crawlers/crawler_utils.js +0 -12
  132. package/crawlers/crawler_utils.js.map +0 -1
  133. package/crawlers/error_snapshotter.d.ts +0 -60
  134. package/crawlers/error_snapshotter.d.ts.map +0 -1
  135. package/crawlers/error_snapshotter.js +0 -118
  136. package/crawlers/error_snapshotter.js.map +0 -1
  137. package/crawlers/error_tracker.d.ts +0 -55
  138. package/crawlers/error_tracker.d.ts.map +0 -1
  139. package/crawlers/error_tracker.js +0 -309
  140. package/crawlers/error_tracker.js.map +0 -1
  141. package/crawlers/index.d.ts +0 -7
  142. package/crawlers/index.d.ts.map +0 -1
  143. package/crawlers/index.js +0 -7
  144. package/crawlers/index.js.map +0 -1
  145. package/crawlers/internals/types.d.ts +0 -8
  146. package/crawlers/internals/types.d.ts.map +0 -1
  147. package/crawlers/internals/types.js +0 -2
  148. package/crawlers/internals/types.js.map +0 -1
  149. package/crawlers/statistics.d.ts +0 -204
  150. package/crawlers/statistics.d.ts.map +0 -1
  151. package/crawlers/statistics.js +0 -350
  152. package/crawlers/statistics.js.map +0 -1
  153. package/enqueue_links/enqueue_links.d.ts +0 -254
  154. package/enqueue_links/enqueue_links.d.ts.map +0 -1
  155. package/enqueue_links/enqueue_links.js +0 -268
  156. package/enqueue_links/enqueue_links.js.map +0 -1
  157. package/enqueue_links/index.d.ts +0 -3
  158. package/enqueue_links/index.d.ts.map +0 -1
  159. package/enqueue_links/index.js +0 -3
  160. package/enqueue_links/index.js.map +0 -1
  161. package/enqueue_links/shared.d.ts +0 -84
  162. package/enqueue_links/shared.d.ts.map +0 -1
  163. package/enqueue_links/shared.js +0 -219
  164. package/enqueue_links/shared.js.map +0 -1
  165. package/errors.d.ts.map +0 -1
  166. package/errors.js.map +0 -1
  167. package/events/event_manager.d.ts.map +0 -1
  168. package/events/event_manager.js.map +0 -1
  169. package/events/index.d.ts.map +0 -1
  170. package/events/index.js.map +0 -1
  171. package/events/local_event_manager.d.ts.map +0 -1
  172. package/events/local_event_manager.js +0 -93
  173. package/events/local_event_manager.js.map +0 -1
  174. package/index.d.ts.map +0 -1
  175. package/index.js.map +0 -1
  176. package/log.d.ts.map +0 -1
  177. package/log.js.map +0 -1
  178. package/proxy_configuration.d.ts +0 -169
  179. package/proxy_configuration.d.ts.map +0 -1
  180. package/proxy_configuration.js +0 -247
  181. package/proxy_configuration.js.map +0 -1
  182. package/recoverable_state.d.ts +0 -122
  183. package/recoverable_state.d.ts.map +0 -1
  184. package/recoverable_state.js +0 -138
  185. package/recoverable_state.js.map +0 -1
  186. package/request.d.ts.map +0 -1
  187. package/request.js.map +0 -1
  188. package/router.d.ts +0 -134
  189. package/router.d.ts.map +0 -1
  190. package/router.js +0 -164
  191. package/router.js.map +0 -1
  192. package/serialization.d.ts.map +0 -1
  193. package/serialization.js.map +0 -1
  194. package/service_locator.d.ts.map +0 -1
  195. package/service_locator.js +0 -252
  196. package/service_locator.js.map +0 -1
  197. package/session_pool/consts.d.ts +0 -4
  198. package/session_pool/consts.d.ts.map +0 -1
  199. package/session_pool/consts.js +0 -4
  200. package/session_pool/consts.js.map +0 -1
  201. package/session_pool/errors.d.ts +0 -8
  202. package/session_pool/errors.d.ts.map +0 -1
  203. package/session_pool/errors.js +0 -12
  204. package/session_pool/errors.js.map +0 -1
  205. package/session_pool/events.d.ts +0 -3
  206. package/session_pool/events.d.ts.map +0 -1
  207. package/session_pool/events.js +0 -3
  208. package/session_pool/events.js.map +0 -1
  209. package/session_pool/index.d.ts +0 -6
  210. package/session_pool/index.d.ts.map +0 -1
  211. package/session_pool/index.js +0 -6
  212. package/session_pool/index.js.map +0 -1
  213. package/session_pool/session.d.ts +0 -186
  214. package/session_pool/session.d.ts.map +0 -1
  215. package/session_pool/session.js +0 -278
  216. package/session_pool/session.js.map +0 -1
  217. package/session_pool/session_pool.d.ts +0 -256
  218. package/session_pool/session_pool.d.ts.map +0 -1
  219. package/session_pool/session_pool.js +0 -386
  220. package/session_pool/session_pool.js.map +0 -1
  221. package/storages/access_checking.d.ts +0 -13
  222. package/storages/access_checking.d.ts.map +0 -1
  223. package/storages/access_checking.js +0 -14
  224. package/storages/access_checking.js.map +0 -1
  225. package/storages/dataset.d.ts.map +0 -1
  226. package/storages/dataset.js.map +0 -1
  227. package/storages/index.d.ts.map +0 -1
  228. package/storages/index.js.map +0 -1
  229. package/storages/key_value_store.d.ts.map +0 -1
  230. package/storages/key_value_store.js +0 -513
  231. package/storages/key_value_store.js.map +0 -1
  232. package/storages/request_list.d.ts.map +0 -1
  233. package/storages/request_list.js.map +0 -1
  234. package/storages/request_list_adapter.d.ts +0 -58
  235. package/storages/request_list_adapter.d.ts.map +0 -1
  236. package/storages/request_list_adapter.js +0 -81
  237. package/storages/request_list_adapter.js.map +0 -1
  238. package/storages/request_manager_tandem.d.ts +0 -68
  239. package/storages/request_manager_tandem.d.ts.map +0 -1
  240. package/storages/request_manager_tandem.js +0 -124
  241. package/storages/request_manager_tandem.js.map +0 -1
  242. package/storages/request_provider.d.ts.map +0 -1
  243. package/storages/request_provider.js +0 -592
  244. package/storages/request_provider.js.map +0 -1
  245. package/storages/request_queue.d.ts +0 -128
  246. package/storages/request_queue.d.ts.map +0 -1
  247. package/storages/request_queue.js +0 -320
  248. package/storages/request_queue.js.map +0 -1
  249. package/storages/request_queue_v2.d.ts +0 -87
  250. package/storages/request_queue_v2.d.ts.map +0 -1
  251. package/storages/request_queue_v2.js +0 -437
  252. package/storages/request_queue_v2.js.map +0 -1
  253. package/storages/sitemap_request_list.d.ts +0 -245
  254. package/storages/sitemap_request_list.d.ts.map +0 -1
  255. package/storages/sitemap_request_list.js +0 -431
  256. package/storages/sitemap_request_list.js.map +0 -1
  257. package/storages/storage_manager.d.ts +0 -60
  258. package/storages/storage_manager.d.ts.map +0 -1
  259. package/storages/storage_manager.js +0 -95
  260. package/storages/storage_manager.js.map +0 -1
  261. package/storages/utils.d.ts.map +0 -1
  262. package/storages/utils.js.map +0 -1
  263. package/typedefs.d.ts.map +0 -1
  264. package/typedefs.js.map +0 -1
  265. package/validators.d.ts.map +0 -1
  266. package/validators.js.map +0 -1
@@ -1,101 +1,76 @@
1
- import type { BaseHttpClient, BatchAddRequestsResult, Dictionary, ProcessedRequest, QueueOperationInfo, RequestQueueClient, RequestQueueInfo, StorageClient } from '@crawlee/types';
1
+ import type { BatchAddRequestsResult, Dictionary, ProcessedRequest, QueueOperationInfo, RequestQueueBackend, RequestQueueInfo } from '@crawlee/types';
2
2
  import type { ReadonlyDeep } from 'type-fest';
3
- import { ListDictionary, LruCache } from '@apify/datastructures';
4
- import type { Log } from '@apify/log';
5
- import { Configuration } from '../configuration.js';
6
- import type { EventManager } from '../events/event_manager.js';
7
- import type { ProxyConfiguration } from '../proxy_configuration.js';
8
- import type { InternalSource, RequestOptions, Source } from '../request.js';
3
+ import type { CrawleeLogger } from '../log.js';
4
+ import type { IProxyConfiguration } from '../proxy-configuration.js';
5
+ import type { Source } from '../request.js';
9
6
  import { Request } from '../request.js';
10
- import type { IStorage, StorageManagerOptions } from './storage_manager.js';
11
- export type RequestsLike = AsyncIterable<Source | string> | Iterable<Source | string> | (Source | string)[];
7
+ import type { JournalEntry } from './transaction.js';
8
+ import type { RequestLoaderStatus } from './request-loader.js';
9
+ import type { IRequestManager, PacingSignal, RequestsLike } from './request-manager.js';
10
+ import type { RequestQueueStats } from './storage-stats.js';
11
+ import type { IStorage, StorageIdentifier } from './storage-instance-manager.js';
12
+ import type { StorageOpenOptions } from './utils.js';
12
13
  /**
13
- * Represents a provider of requests/URLs to crawl.
14
+ * Represents a queue of URLs to crawl, which is used for deep crawling of websites
15
+ * where you start with several URLs and then recursively
16
+ * follow links to other pages. The data structure supports both breadth-first and depth-first crawling orders.
17
+ *
18
+ * Each URL is represented using an instance of the {@link Request} class.
19
+ * The queue can only contain unique URLs. More precisely, it can only contain {@link Request} instances
20
+ * with distinct `uniqueKey` properties. By default, `uniqueKey` is generated from the URL, but it can also be overridden.
21
+ * To add a single URL multiple times to the queue,
22
+ * corresponding {@link Request} objects will need to have different `uniqueKey` properties.
23
+ *
24
+ * Do not instantiate this class directly, use the {@link RequestQueue.open} function instead.
25
+ *
26
+ * `RequestQueue` is used by {@link BasicCrawler}, {@link CheerioCrawler}, {@link PuppeteerCrawler}
27
+ * and {@link PlaywrightCrawler} as a source of URLs to crawl.
28
+ * Unlike {@link RequestList}, `RequestQueue` supports dynamic adding and removing of requests.
29
+ * On the other hand, the queue is not optimized for operations that add or remove a large number of URLs in a batch.
30
+ *
31
+ * **Example usage:**
32
+ *
33
+ * ```javascript
34
+ * // Open the default request queue associated with the crawler run
35
+ * const queue = await RequestQueue.open();
36
+ *
37
+ * // Open a named request queue
38
+ * const queueWithName = await RequestQueue.open('some-name');
39
+ *
40
+ * // Enqueue few requests
41
+ * await queue.addRequest({ url: 'http://example.com/aaa' });
42
+ * await queue.addRequest({ url: 'http://example.com/bbb' });
43
+ * await queue.addRequest({ url: 'http://example.com/foo/bar' }, { forefront: true });
44
+ * ```
45
+ * @category Sources
14
46
  */
15
- export interface IRequestManager {
47
+ export declare class RequestQueue implements IStorage, IRequestManager {
48
+ #private;
49
+ readonly id: string;
50
+ readonly name?: string;
51
+ readonly backend: RequestQueueBackend;
52
+ readonly log: CrawleeLogger;
16
53
  /**
17
- * Returns `true` if all requests were already handled and there are no more left.
54
+ * Backend-independent usage counters tracked for this request queue (write operations and
55
+ * queue-head reads issued to the underlying storage backend). Counted per backend call.
18
56
  */
19
- isFinished(): Promise<boolean>;
57
+ get stats(): RequestQueueStats;
20
58
  /**
21
- * Resolves to `true` if the next call to {@link IRequestManager.fetchNextRequest} function
22
- * would return `null`, otherwise it resolves to `false`.
23
- * Note that even if the provider is empty, there might be some pending requests currently being processed.
24
- */
25
- isEmpty(): Promise<boolean>;
26
- /**
27
- * Returns number of handled requests.
28
- */
29
- handledCount(): Promise<number>;
30
- /**
31
- * Get the total number of requests known to the request manager.
32
- */
33
- getTotalCount(): number;
34
- /**
35
- * Get an offline approximation of the number of pending requests.
36
- */
37
- getPendingCount(): number;
38
- /**
39
- * Gets the next {@link Request} to process.
40
- *
41
- * The function's `Promise` resolves to `null` if there are no more
42
- * requests to process.
43
- */
44
- fetchNextRequest<T extends Dictionary = Dictionary>(): Promise<Request<T> | null>;
45
- /**
46
- * Can be used to iterate over the `RequestManager` instance in a `for await .. of` loop.
47
- * Provides an alternative for the repeated use of `fetchNextRequest`.
48
- */
49
- [Symbol.asyncIterator](): AsyncGenerator<Request>;
50
- /**
51
- * Marks request as handled after successful processing.
52
- */
53
- markRequestHandled(request: Request): Promise<RequestQueueOperationInfo | void | null>;
54
- /**
55
- * Reclaims request to the provider if its processing failed.
56
- * The request will become available in the next `fetchNextRequest()`.
59
+ * @internal
57
60
  */
58
- reclaimRequest(request: Request, options?: RequestQueueOperationOptions): Promise<RequestQueueOperationInfo | null>;
59
- addRequest(requestLike: Source, options?: RequestQueueOperationOptions): Promise<RequestQueueOperationInfo>;
60
- addRequestsBatched(requests: RequestsLike, options?: AddRequestsBatchedOptions): Promise<AddRequestsBatchedResult>;
61
- }
62
- export declare abstract class RequestProvider implements IStorage, IRequestManager {
63
- protected readonly config: Configuration;
64
- id: string;
65
- name?: string;
66
- timeoutSecs: number;
67
- clientKey: string;
68
- client: RequestQueueClient;
69
- protected proxyConfiguration?: ProxyConfiguration;
70
- log: Log;
71
- internalTimeoutMillis: number;
72
- requestLockSecs: number;
73
- assumedTotalCount: number;
74
- assumedHandledCount: number;
75
- private initialCount;
76
- private initialHandledCount;
77
- protected queueHeadIds: ListDictionary<string>;
78
- protected requestCache: LruCache<RequestLruItem>;
79
- protected recentlyHandledRequestsCache: LruCache<boolean>;
80
- protected queuePausedForMigration: boolean;
81
- protected lastActivity: Date;
82
- protected isFinishedCalledWhileHeadWasNotEmpty: number;
83
- protected inProgressRequestBatchCount: number;
84
- protected httpClient?: BaseHttpClient;
85
- protected readonly events: EventManager;
86
- constructor(options: InternalRequestProviderOptions, config: Configuration);
61
+ constructor(options: RequestQueueOptions);
87
62
  /**
88
- * Returns an offline approximation of the total number of requests in the queue (i.e. pending + handled).
63
+ * Returns the total number of requests in the queue (i.e. pending + handled).
89
64
  *
90
65
  * Survives restarts and actor migrations.
91
66
  */
92
- getTotalCount(): number;
67
+ getTotalCount(): Promise<number>;
93
68
  /**
94
- * Returns an offline approximation of the total number of pending requests in the queue.
69
+ * Returns the total number of pending requests in the queue.
95
70
  *
96
71
  * Survives restarts and Actor migrations.
97
72
  */
98
- getPendingCount(): number;
73
+ getPendingCount(): Promise<number>;
99
74
  /**
100
75
  * Adds a request to the queue.
101
76
  *
@@ -111,6 +86,8 @@ export declare abstract class RequestProvider implements IStorage, IRequestManag
111
86
  * @param [options] Request queue operation options.
112
87
  */
113
88
  addRequest(requestLike: Source, options?: RequestQueueOperationOptions): Promise<RequestQueueOperationInfo>;
89
+ /** @internal */
90
+ commitJournalEntries(entries: JournalEntry[]): Promise<void>;
114
91
  /**
115
92
  * Adds requests to the queue in batches of 25. This method will wait till all the requests are added
116
93
  * to the queue before resolving. You should prefer using `queue.addRequestsBatched()` or `crawler.addRequests()`
@@ -137,17 +114,17 @@ export declare abstract class RequestProvider implements IStorage, IRequestManag
137
114
  */
138
115
  addRequestsBatched(requests: ReadonlyDeep<RequestsLike>, options?: AddRequestsBatchedOptions): Promise<AddRequestsBatchedResult>;
139
116
  /**
140
- * Gets the request from the queue specified by ID.
117
+ * Gets the request from the queue specified by its `uniqueKey`.
141
118
  *
142
- * @param id ID of the request.
119
+ * @param uniqueKey Unique key of the request.
143
120
  * @returns Returns the request object, or `null` if it was not found.
144
121
  */
145
- getRequest<T extends Dictionary = Dictionary>(id: string): Promise<Request<T> | null>;
122
+ getRequest<T extends Dictionary = Dictionary>(uniqueKey: string): Promise<Request<T> | null>;
146
123
  /**
147
124
  * Returns a next request in the queue to be processed, or `null` if there are no more pending requests.
148
125
  *
149
126
  * Once you successfully finish processing of the request, you need to call
150
- * {@link RequestQueue.markRequestHandled}
127
+ * {@link RequestQueue.markRequestAsHandled}
151
128
  * to mark the request as handled in the queue. If there was some error in processing the request,
152
129
  * call {@link RequestQueue.reclaimRequest} instead,
153
130
  * so that the queue will give the request to some other consumer in another call to the `fetchNextRequest` function.
@@ -155,19 +132,19 @@ export declare abstract class RequestProvider implements IStorage, IRequestManag
155
132
  * Note that the `null` return value doesn't mean the queue processing finished,
156
133
  * it means there are currently no pending requests.
157
134
  * To check whether all requests in queue were finished,
158
- * use {@link RequestQueue.isFinished} instead.
135
+ * use {@link RequestQueue.checkReadiness} instead.
159
136
  *
160
137
  * @returns
161
138
  * Returns the request object or `null` if there are no more pending requests.
162
139
  */
163
- abstract fetchNextRequest<T extends Dictionary = Dictionary>(): Promise<Request<T> | null>;
140
+ fetchNextRequest<T extends Dictionary = Dictionary>(): Promise<Request<T> | null>;
164
141
  /**
165
142
  * Marks a request that was previously returned by the
166
143
  * {@link RequestQueue.fetchNextRequest}
167
144
  * function as handled after successful processing.
168
145
  * Handled requests will never again be returned by the `fetchNextRequest` function.
169
146
  */
170
- markRequestHandled(request: Request): Promise<RequestQueueOperationInfo | null>;
147
+ markRequestAsHandled(request: Request): Promise<RequestQueueOperationInfo | null>;
171
148
  /**
172
149
  * Reclaims a failed request back to the queue, so that it can be returned for processing later again
173
150
  * by another call to {@link RequestQueue.fetchNextRequest}.
@@ -175,35 +152,49 @@ export declare abstract class RequestProvider implements IStorage, IRequestManag
175
152
  * For example, this lets you store the number of retries or error messages for the request.
176
153
  */
177
154
  reclaimRequest(request: Request, options?: RequestQueueOperationOptions): Promise<RequestQueueOperationInfo | null>;
178
- protected abstract ensureHeadIsNonEmpty(): Promise<void>;
179
155
  /**
180
- * Resolves to `true` if the next call to {@link RequestQueue.fetchNextRequest}
181
- * would return `null`, otherwise it resolves to `false`.
182
- * Note that even if the queue is empty, there might be some pending requests currently being processed.
183
- * If you need to ensure that there is no activity in the queue, use {@link RequestQueue.isFinished}.
156
+ * A queue hands requests out as fast as they are asked for; pacing is a job for a manager wrapped around it,
157
+ * such as {@link ThrottlingRequestManager}.
158
+ * @inheritdoc
184
159
  */
185
- isEmpty(): Promise<boolean>;
160
+ recordPacingSignal(_signal: PacingSignal): boolean;
186
161
  /**
187
- * Resolves to `true` if all requests were already handled and there are no more left.
188
- * Due to the nature of distributed storage used by the queue,
189
- * the function may occasionally return a false negative,
190
- * but it shall never return a false positive.
162
+ * Reports whether the queue has a request to hand over, is waiting on one, or is done.
163
+ *
164
+ * `waiting` means requests are in progress (fetched but not yet handled or reclaimed, possibly by another
165
+ * client sharing the queue) or a background add is still landing; neither has a clock, so no `readyAt`.
166
+ *
167
+ * Due to the nature of distributed storage used by the queue, `finished` may occasionally arrive a probe or
168
+ * two late, but it is never reported early.
191
169
  */
192
- abstract isFinished(): Promise<boolean>;
193
- protected _reset(): void;
170
+ checkReadiness(): Promise<RequestLoaderStatus>;
194
171
  /**
195
- * Caches information about request to beware of unneeded addRequest() calls.
172
+ * Tells the queue how long a consumer expects to hold a fetched request before marking it handled
173
+ * or reclaiming it (typically the request-handler timeout plus padding), so that a storage backend
174
+ * that reserves requests via locking does not hand the same request out again while it is still
175
+ * being processed.
176
+ *
177
+ * Several consumers may share one queue (and therefore one client) in a single process, so we only
178
+ * ever raise the reservation duration, never lower it — otherwise a short-lived consumer could cut
179
+ * short the reservation of a long-lived one and have its in-flight request stolen.
196
180
  */
197
- protected _cacheRequest(cacheKey: string, queueOperationInfo: RequestQueueOperationInfo): void;
181
+ setExpectedRequestProcessingTime(processingTimeSecs: number): Promise<void>;
198
182
  /**
199
- * Adds a request straight to the queueHeadDict, to improve performance.
183
+ * @inheritdoc
184
+ * Unlike {@link RequestQueue.setExpectedRequestProcessingTime}, which sizes every future lock,
185
+ * this only touches the one request it is given.
200
186
  */
201
- protected _maybeAddRequestToQueueHead(requestId: string, forefront: boolean): void;
187
+ extendRequestProcessingTime(request: Request, extensionSecs: number): Promise<boolean>;
202
188
  /**
203
189
  * Removes the queue either from the Apify Cloud storage or from the local database,
204
190
  * depending on the mode of operation.
205
191
  */
206
192
  drop(): Promise<void>;
193
+ /**
194
+ * Remove all requests from the queue but keep the queue itself, resetting it
195
+ * so it can be reused (e.g. across multiple `crawler.run()` calls).
196
+ */
197
+ purge(): Promise<void>;
207
198
  /**
208
199
  * @inheritdoc
209
200
  */
@@ -218,22 +209,15 @@ export declare abstract class RequestProvider implements IStorage, IRequestManag
218
209
  * ```
219
210
  * @inheritdoc
220
211
  */
221
- handledCount(): Promise<number>;
212
+ getHandledCount(): Promise<number>;
222
213
  /**
223
214
  * Returns an object containing general information about the request queue.
224
215
  *
225
- * The function returns the same object as the Apify API Client's
226
- * [getQueue](https://docs.apify.com/api/apify-client-js/latest#ApifyClient-requestQueues)
227
- * function, which in turn calls the
228
- * [Get request queue](https://apify.com/docs/api/v2#/reference/request-queues/queue/get-request-queue)
229
- * API endpoint.
230
- *
231
216
  * **Example:**
232
217
  * ```
233
218
  * {
234
219
  * id: "WkzbQMuFYuamGv3YF",
235
220
  * name: "my-queue",
236
- * userId: "wRsJZtadYvn4mBZmm",
237
221
  * createdAt: new Date("2015-12-12T07:34:14.202Z"),
238
222
  * modifiedAt: new Date("2015-12-13T08:36:13.202Z"),
239
223
  * accessedAt: new Date("2015-12-14T08:36:13.202Z"),
@@ -242,20 +226,10 @@ export declare abstract class RequestProvider implements IStorage, IRequestManag
242
226
  * pendingRequestCount: 20,
243
227
  * }
244
228
  * ```
229
+ *
230
+ * @throws If the underlying storage no longer exists (e.g. it was deleted externally).
245
231
  */
246
- getInfo(): Promise<RequestQueueInfo | undefined>;
247
- /**
248
- * Fetches URLs from requestsFromUrl and returns them in format of list of requests
249
- */
250
- protected _fetchRequestsFromUrl(source: InternalSource): Promise<RequestOptions[]>;
251
- /**
252
- * Adds all fetched requests from a URL from a remote resource.
253
- */
254
- protected _addFetchedRequests(source: InternalSource, fetchedRequests: RequestOptions[], options: RequestQueueOperationOptions): Promise<ProcessedRequest[]>;
255
- /**
256
- * @internal wraps public utility for mocking purposes
257
- */
258
- private _downloadListOfUrls;
232
+ getInfo(): Promise<RequestQueueInfo>;
259
233
  /**
260
234
  * Opens a request queue and returns a promise resolving to an instance
261
235
  * of the {@link RequestQueue} class.
@@ -267,44 +241,25 @@ export declare abstract class RequestProvider implements IStorage, IRequestManag
267
241
  *
268
242
  * For more details and code examples, see the {@link RequestQueue} class.
269
243
  *
270
- * @param [queueIdOrName]
271
- * ID or name of the request queue to be opened. If `null` or `undefined`,
272
- * the function returns the default request queue associated with the crawler run.
244
+ * @param [identifier]
245
+ * ID or name of the request queue to be opened. If a string is provided, it will first be
246
+ * looked up as an ID; if no such storage exists, it will be treated as a name.
247
+ * If `null` or `undefined`, the function returns the default request queue associated with the crawler run.
273
248
  * @param [options] Open Request Queue options.
274
249
  */
275
- static open(queueIdOrName?: string | null, options?: StorageManagerOptions): Promise<RequestProvider>;
276
- }
277
- interface RequestLruItem {
278
- uniqueKey: string;
279
- isHandled: boolean;
280
- id: string;
281
- hydrated: Request | null;
282
- lockExpiresAt: number | null;
283
- forefront: boolean;
250
+ static open(identifier?: string | StorageIdentifier | null, options?: StorageOpenOptions): Promise<RequestQueue>;
284
251
  }
285
- export interface RequestProviderOptions {
286
- id: string;
287
- name?: string;
288
- client: StorageClient;
252
+ /** @internal */
253
+ export interface RequestQueueOptions {
254
+ /** Resolved metadata for the request queue, as returned by the backend's `getMetadata()`. */
255
+ metadata: RequestQueueInfo;
256
+ backend: RequestQueueBackend;
289
257
  /**
290
258
  * Used to pass the proxy configuration for the `requestsFromUrl` objects.
291
259
  * Takes advantage of the internal address rotation and authentication process.
292
260
  * If undefined, the `requestsFromUrl` requests will be made without proxy.
293
261
  */
294
- proxyConfiguration?: ProxyConfiguration;
295
- }
296
- /**
297
- * @deprecated Use {@link RequestProviderOptions} instead.
298
- */
299
- export interface RequestQueueOptions extends RequestProviderOptions {
300
- }
301
- /**
302
- * @internal
303
- */
304
- export interface InternalRequestProviderOptions extends RequestProviderOptions {
305
- logPrefix: string;
306
- requestCacheMaxSize: number;
307
- recentlyHandledRequestsMaxSize: number;
262
+ proxyConfiguration?: IProxyConfiguration;
308
263
  }
309
264
  export interface RequestQueueOperationOptions {
310
265
  /**
@@ -328,9 +283,6 @@ export interface RequestQueueOperationOptions {
328
283
  */
329
284
  cache?: boolean;
330
285
  }
331
- /**
332
- * @internal
333
- */
334
286
  export interface RequestQueueOperationInfo extends QueueOperationInfo {
335
287
  uniqueKey: string;
336
288
  forefront: boolean;
@@ -349,6 +301,15 @@ export interface AddRequestsBatchedOptions extends RequestQueueOperationOptions
349
301
  * @default 1000
350
302
  */
351
303
  waitBetweenBatchesMillis?: number;
304
+ /**
305
+ * If set, only this many *actually new* requests (i.e. not already present in the queue) will be added.
306
+ * Once the budget is reached, remaining requests from the iterable are left unconsumed, or collected in
307
+ * {@link AddRequestsBatchedResult.requestsOverLimit|`requestsOverLimit`} if
308
+ * {@link AddRequestsBatchedOptions.waitForAllRequestsToBeAdded|`waitForAllRequestsToBeAdded`} is set.
309
+ *
310
+ * This is useful in combination with `maxRequestsPerCrawl` to avoid duplicate URLs consuming the budget.
311
+ */
312
+ maxNewRequests?: number;
352
313
  }
353
314
  export interface AddRequestsBatchedResult {
354
315
  addedRequests: ProcessedRequest[];
@@ -369,6 +330,11 @@ export interface AddRequestsBatchedResult {
369
330
  * ```
370
331
  */
371
332
  waitForAllRequestsToBeAdded: Promise<ProcessedRequest[]>;
333
+ /**
334
+ * Requests from the input that were not added to the queue because the
335
+ * {@link AddRequestsBatchedOptions.maxNewRequests|`maxNewRequests`} budget was reached.
336
+ * `undefined` unless both `maxNewRequests` and
337
+ * {@link AddRequestsBatchedOptions.waitForAllRequestsToBeAdded|`waitForAllRequestsToBeAdded`} are set.
338
+ */
339
+ requestsOverLimit?: Source[];
372
340
  }
373
- export {};
374
- //# sourceMappingURL=request_provider.d.ts.map