@crawlee/core 4.0.0-beta.27 → 4.0.0-beta.270

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 (265) 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 +77 -235
  5. package/configuration.js +159 -227
  6. package/debug.d.ts +36 -0
  7. package/debug.js +70 -0
  8. package/errors.d.ts +45 -18
  9. package/errors.js +58 -27
  10. package/events/event-manager.d.ts +78 -0
  11. package/events/{event_manager.js → event-manager.js} +12 -13
  12. package/events/index.d.ts +3 -3
  13. package/events/index.js +2 -3
  14. package/events/local-event-manager.d.ts +32 -0
  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 -12
  19. package/index.js +10 -11
  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 +168 -0
  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 -150
  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} +33 -173
  68. package/storages/{request_list.js → request-list.js} +276 -255
  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 -159
  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 -16
  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 -300
  100. package/autoscaling/autoscaled_pool.d.ts.map +0 -1
  101. package/autoscaling/autoscaled_pool.js +0 -533
  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 -189
  108. package/autoscaling/snapshotter.d.ts.map +0 -1
  109. package/autoscaling/snapshotter.js +0 -285
  110. package/autoscaling/snapshotter.js.map +0 -1
  111. package/autoscaling/system_status.d.ts +0 -181
  112. package/autoscaling/system_status.d.ts.map +0 -1
  113. package/autoscaling/system_status.js +0 -169
  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 -213
  150. package/crawlers/statistics.d.ts.map +0 -1
  151. package/crawlers/statistics.js +0 -349
  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 +0 -52
  168. package/events/event_manager.d.ts.map +0 -1
  169. package/events/event_manager.js.map +0 -1
  170. package/events/index.d.ts.map +0 -1
  171. package/events/index.js.map +0 -1
  172. package/events/local_event_manager.d.ts +0 -27
  173. package/events/local_event_manager.d.ts.map +0 -1
  174. package/events/local_event_manager.js +0 -75
  175. package/events/local_event_manager.js.map +0 -1
  176. package/index.d.ts.map +0 -1
  177. package/index.js.map +0 -1
  178. package/log.d.ts.map +0 -1
  179. package/log.js.map +0 -1
  180. package/proxy_configuration.d.ts +0 -169
  181. package/proxy_configuration.d.ts.map +0 -1
  182. package/proxy_configuration.js +0 -247
  183. package/proxy_configuration.js.map +0 -1
  184. package/recoverable_state.d.ts +0 -123
  185. package/recoverable_state.d.ts.map +0 -1
  186. package/recoverable_state.js +0 -140
  187. package/recoverable_state.js.map +0 -1
  188. package/request.d.ts.map +0 -1
  189. package/request.js.map +0 -1
  190. package/router.d.ts +0 -134
  191. package/router.d.ts.map +0 -1
  192. package/router.js +0 -164
  193. package/router.js.map +0 -1
  194. package/serialization.d.ts.map +0 -1
  195. package/serialization.js.map +0 -1
  196. package/session_pool/consts.d.ts +0 -4
  197. package/session_pool/consts.d.ts.map +0 -1
  198. package/session_pool/consts.js +0 -4
  199. package/session_pool/consts.js.map +0 -1
  200. package/session_pool/errors.d.ts +0 -8
  201. package/session_pool/errors.d.ts.map +0 -1
  202. package/session_pool/errors.js +0 -12
  203. package/session_pool/errors.js.map +0 -1
  204. package/session_pool/events.d.ts +0 -3
  205. package/session_pool/events.d.ts.map +0 -1
  206. package/session_pool/events.js +0 -3
  207. package/session_pool/events.js.map +0 -1
  208. package/session_pool/index.d.ts +0 -6
  209. package/session_pool/index.d.ts.map +0 -1
  210. package/session_pool/index.js +0 -6
  211. package/session_pool/index.js.map +0 -1
  212. package/session_pool/session.d.ts +0 -186
  213. package/session_pool/session.d.ts.map +0 -1
  214. package/session_pool/session.js +0 -278
  215. package/session_pool/session.js.map +0 -1
  216. package/session_pool/session_pool.d.ts +0 -258
  217. package/session_pool/session_pool.d.ts.map +0 -1
  218. package/session_pool/session_pool.js +0 -387
  219. package/session_pool/session_pool.js.map +0 -1
  220. package/storages/access_checking.d.ts +0 -13
  221. package/storages/access_checking.d.ts.map +0 -1
  222. package/storages/access_checking.js +0 -14
  223. package/storages/access_checking.js.map +0 -1
  224. package/storages/dataset.d.ts.map +0 -1
  225. package/storages/dataset.js.map +0 -1
  226. package/storages/index.d.ts.map +0 -1
  227. package/storages/index.js.map +0 -1
  228. package/storages/key_value_store.d.ts.map +0 -1
  229. package/storages/key_value_store.js +0 -512
  230. package/storages/key_value_store.js.map +0 -1
  231. package/storages/request_list.d.ts.map +0 -1
  232. package/storages/request_list.js.map +0 -1
  233. package/storages/request_list_adapter.d.ts +0 -58
  234. package/storages/request_list_adapter.d.ts.map +0 -1
  235. package/storages/request_list_adapter.js +0 -81
  236. package/storages/request_list_adapter.js.map +0 -1
  237. package/storages/request_manager_tandem.d.ts +0 -68
  238. package/storages/request_manager_tandem.d.ts.map +0 -1
  239. package/storages/request_manager_tandem.js +0 -124
  240. package/storages/request_manager_tandem.js.map +0 -1
  241. package/storages/request_provider.d.ts.map +0 -1
  242. package/storages/request_provider.js +0 -591
  243. package/storages/request_provider.js.map +0 -1
  244. package/storages/request_queue.d.ts +0 -128
  245. package/storages/request_queue.d.ts.map +0 -1
  246. package/storages/request_queue.js +0 -320
  247. package/storages/request_queue.js.map +0 -1
  248. package/storages/request_queue_v2.d.ts +0 -87
  249. package/storages/request_queue_v2.d.ts.map +0 -1
  250. package/storages/request_queue_v2.js +0 -438
  251. package/storages/request_queue_v2.js.map +0 -1
  252. package/storages/sitemap_request_list.d.ts +0 -250
  253. package/storages/sitemap_request_list.d.ts.map +0 -1
  254. package/storages/sitemap_request_list.js +0 -431
  255. package/storages/sitemap_request_list.js.map +0 -1
  256. package/storages/storage_manager.d.ts +0 -62
  257. package/storages/storage_manager.d.ts.map +0 -1
  258. package/storages/storage_manager.js +0 -105
  259. package/storages/storage_manager.js.map +0 -1
  260. package/storages/utils.d.ts.map +0 -1
  261. package/storages/utils.js.map +0 -1
  262. package/typedefs.d.ts.map +0 -1
  263. package/typedefs.js.map +0 -1
  264. package/validators.d.ts.map +0 -1
  265. package/validators.js.map +0 -1
@@ -1,99 +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 { ProxyConfiguration } from '../proxy_configuration.js';
7
- 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';
8
6
  import { Request } from '../request.js';
9
- import type { IStorage, StorageManagerOptions } from './storage_manager.js';
10
- 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';
11
13
  /**
12
- * 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
13
46
  */
14
- 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;
15
53
  /**
16
- * 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.
17
56
  */
18
- isFinished(): Promise<boolean>;
57
+ get stats(): RequestQueueStats;
19
58
  /**
20
- * Resolves to `true` if the next call to {@link IRequestManager.fetchNextRequest} function
21
- * would return `null`, otherwise it resolves to `false`.
22
- * Note that even if the provider is empty, there might be some pending requests currently being processed.
23
- */
24
- isEmpty(): Promise<boolean>;
25
- /**
26
- * Returns number of handled requests.
27
- */
28
- handledCount(): Promise<number>;
29
- /**
30
- * Get the total number of requests known to the request manager.
31
- */
32
- getTotalCount(): number;
33
- /**
34
- * Get an offline approximation of the number of pending requests.
35
- */
36
- getPendingCount(): number;
37
- /**
38
- * Gets the next {@link Request} to process.
39
- *
40
- * The function's `Promise` resolves to `null` if there are no more
41
- * requests to process.
42
- */
43
- fetchNextRequest<T extends Dictionary = Dictionary>(): Promise<Request<T> | null>;
44
- /**
45
- * Can be used to iterate over the `RequestManager` instance in a `for await .. of` loop.
46
- * Provides an alternative for the repeated use of `fetchNextRequest`.
47
- */
48
- [Symbol.asyncIterator](): AsyncGenerator<Request>;
49
- /**
50
- * Marks request as handled after successful processing.
51
- */
52
- markRequestHandled(request: Request): Promise<RequestQueueOperationInfo | void | null>;
53
- /**
54
- * Reclaims request to the provider if its processing failed.
55
- * The request will become available in the next `fetchNextRequest()`.
59
+ * @internal
56
60
  */
57
- reclaimRequest(request: Request, options?: RequestQueueOperationOptions): Promise<RequestQueueOperationInfo | null>;
58
- addRequest(requestLike: Source, options?: RequestQueueOperationOptions): Promise<RequestQueueOperationInfo>;
59
- addRequestsBatched(requests: RequestsLike, options?: AddRequestsBatchedOptions): Promise<AddRequestsBatchedResult>;
60
- }
61
- export declare abstract class RequestProvider implements IStorage, IRequestManager {
62
- readonly config: Configuration;
63
- id: string;
64
- name?: string;
65
- timeoutSecs: number;
66
- clientKey: string;
67
- client: RequestQueueClient;
68
- protected proxyConfiguration?: ProxyConfiguration;
69
- log: Log;
70
- internalTimeoutMillis: number;
71
- requestLockSecs: number;
72
- assumedTotalCount: number;
73
- assumedHandledCount: number;
74
- private initialCount;
75
- private initialHandledCount;
76
- protected queueHeadIds: ListDictionary<string>;
77
- protected requestCache: LruCache<RequestLruItem>;
78
- protected recentlyHandledRequestsCache: LruCache<boolean>;
79
- protected queuePausedForMigration: boolean;
80
- protected lastActivity: Date;
81
- protected isFinishedCalledWhileHeadWasNotEmpty: number;
82
- protected inProgressRequestBatchCount: number;
83
- protected httpClient?: BaseHttpClient;
84
- constructor(options: InternalRequestProviderOptions, config?: Configuration);
61
+ constructor(options: RequestQueueOptions);
85
62
  /**
86
- * 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).
87
64
  *
88
65
  * Survives restarts and actor migrations.
89
66
  */
90
- getTotalCount(): number;
67
+ getTotalCount(): Promise<number>;
91
68
  /**
92
- * 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.
93
70
  *
94
71
  * Survives restarts and Actor migrations.
95
72
  */
96
- getPendingCount(): number;
73
+ getPendingCount(): Promise<number>;
97
74
  /**
98
75
  * Adds a request to the queue.
99
76
  *
@@ -109,6 +86,8 @@ export declare abstract class RequestProvider implements IStorage, IRequestManag
109
86
  * @param [options] Request queue operation options.
110
87
  */
111
88
  addRequest(requestLike: Source, options?: RequestQueueOperationOptions): Promise<RequestQueueOperationInfo>;
89
+ /** @internal */
90
+ commitJournalEntries(entries: JournalEntry[]): Promise<void>;
112
91
  /**
113
92
  * Adds requests to the queue in batches of 25. This method will wait till all the requests are added
114
93
  * to the queue before resolving. You should prefer using `queue.addRequestsBatched()` or `crawler.addRequests()`
@@ -135,17 +114,17 @@ export declare abstract class RequestProvider implements IStorage, IRequestManag
135
114
  */
136
115
  addRequestsBatched(requests: ReadonlyDeep<RequestsLike>, options?: AddRequestsBatchedOptions): Promise<AddRequestsBatchedResult>;
137
116
  /**
138
- * Gets the request from the queue specified by ID.
117
+ * Gets the request from the queue specified by its `uniqueKey`.
139
118
  *
140
- * @param id ID of the request.
119
+ * @param uniqueKey Unique key of the request.
141
120
  * @returns Returns the request object, or `null` if it was not found.
142
121
  */
143
- getRequest<T extends Dictionary = Dictionary>(id: string): Promise<Request<T> | null>;
122
+ getRequest<T extends Dictionary = Dictionary>(uniqueKey: string): Promise<Request<T> | null>;
144
123
  /**
145
124
  * Returns a next request in the queue to be processed, or `null` if there are no more pending requests.
146
125
  *
147
126
  * Once you successfully finish processing of the request, you need to call
148
- * {@link RequestQueue.markRequestHandled}
127
+ * {@link RequestQueue.markRequestAsHandled}
149
128
  * to mark the request as handled in the queue. If there was some error in processing the request,
150
129
  * call {@link RequestQueue.reclaimRequest} instead,
151
130
  * so that the queue will give the request to some other consumer in another call to the `fetchNextRequest` function.
@@ -153,19 +132,19 @@ export declare abstract class RequestProvider implements IStorage, IRequestManag
153
132
  * Note that the `null` return value doesn't mean the queue processing finished,
154
133
  * it means there are currently no pending requests.
155
134
  * To check whether all requests in queue were finished,
156
- * use {@link RequestQueue.isFinished} instead.
135
+ * use {@link RequestQueue.checkReadiness} instead.
157
136
  *
158
137
  * @returns
159
138
  * Returns the request object or `null` if there are no more pending requests.
160
139
  */
161
- abstract fetchNextRequest<T extends Dictionary = Dictionary>(): Promise<Request<T> | null>;
140
+ fetchNextRequest<T extends Dictionary = Dictionary>(): Promise<Request<T> | null>;
162
141
  /**
163
142
  * Marks a request that was previously returned by the
164
143
  * {@link RequestQueue.fetchNextRequest}
165
144
  * function as handled after successful processing.
166
145
  * Handled requests will never again be returned by the `fetchNextRequest` function.
167
146
  */
168
- markRequestHandled(request: Request): Promise<RequestQueueOperationInfo | null>;
147
+ markRequestAsHandled(request: Request): Promise<RequestQueueOperationInfo | null>;
169
148
  /**
170
149
  * Reclaims a failed request back to the queue, so that it can be returned for processing later again
171
150
  * by another call to {@link RequestQueue.fetchNextRequest}.
@@ -173,35 +152,49 @@ export declare abstract class RequestProvider implements IStorage, IRequestManag
173
152
  * For example, this lets you store the number of retries or error messages for the request.
174
153
  */
175
154
  reclaimRequest(request: Request, options?: RequestQueueOperationOptions): Promise<RequestQueueOperationInfo | null>;
176
- protected abstract ensureHeadIsNonEmpty(): Promise<void>;
177
155
  /**
178
- * Resolves to `true` if the next call to {@link RequestQueue.fetchNextRequest}
179
- * would return `null`, otherwise it resolves to `false`.
180
- * Note that even if the queue is empty, there might be some pending requests currently being processed.
181
- * 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
182
159
  */
183
- isEmpty(): Promise<boolean>;
160
+ recordPacingSignal(_signal: PacingSignal): boolean;
184
161
  /**
185
- * Resolves to `true` if all requests were already handled and there are no more left.
186
- * Due to the nature of distributed storage used by the queue,
187
- * the function may occasionally return a false negative,
188
- * 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.
189
169
  */
190
- abstract isFinished(): Promise<boolean>;
191
- protected _reset(): void;
170
+ checkReadiness(): Promise<RequestLoaderStatus>;
192
171
  /**
193
- * 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.
194
180
  */
195
- protected _cacheRequest(cacheKey: string, queueOperationInfo: RequestQueueOperationInfo): void;
181
+ setExpectedRequestProcessingTimeSecs(secs: number): Promise<void>;
196
182
  /**
197
- * Adds a request straight to the queueHeadDict, to improve performance.
183
+ * @inheritdoc
184
+ * Unlike {@link RequestQueue.setExpectedRequestProcessingTimeSecs}, which sizes every future lock,
185
+ * this only touches the one request it is given.
198
186
  */
199
- protected _maybeAddRequestToQueueHead(requestId: string, forefront: boolean): void;
187
+ extendRequestProcessingTimeSecs(request: Request, secs: number): Promise<boolean>;
200
188
  /**
201
189
  * Removes the queue either from the Apify Cloud storage or from the local database,
202
190
  * depending on the mode of operation.
203
191
  */
204
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>;
205
198
  /**
206
199
  * @inheritdoc
207
200
  */
@@ -216,22 +209,15 @@ export declare abstract class RequestProvider implements IStorage, IRequestManag
216
209
  * ```
217
210
  * @inheritdoc
218
211
  */
219
- handledCount(): Promise<number>;
212
+ getHandledCount(): Promise<number>;
220
213
  /**
221
214
  * Returns an object containing general information about the request queue.
222
215
  *
223
- * The function returns the same object as the Apify API Client's
224
- * [getQueue](https://docs.apify.com/api/apify-client-js/latest#ApifyClient-requestQueues)
225
- * function, which in turn calls the
226
- * [Get request queue](https://apify.com/docs/api/v2#/reference/request-queues/queue/get-request-queue)
227
- * API endpoint.
228
- *
229
216
  * **Example:**
230
217
  * ```
231
218
  * {
232
219
  * id: "WkzbQMuFYuamGv3YF",
233
220
  * name: "my-queue",
234
- * userId: "wRsJZtadYvn4mBZmm",
235
221
  * createdAt: new Date("2015-12-12T07:34:14.202Z"),
236
222
  * modifiedAt: new Date("2015-12-13T08:36:13.202Z"),
237
223
  * accessedAt: new Date("2015-12-14T08:36:13.202Z"),
@@ -240,20 +226,10 @@ export declare abstract class RequestProvider implements IStorage, IRequestManag
240
226
  * pendingRequestCount: 20,
241
227
  * }
242
228
  * ```
229
+ *
230
+ * @throws If the underlying storage no longer exists (e.g. it was deleted externally).
243
231
  */
244
- getInfo(): Promise<RequestQueueInfo | undefined>;
245
- /**
246
- * Fetches URLs from requestsFromUrl and returns them in format of list of requests
247
- */
248
- protected _fetchRequestsFromUrl(source: InternalSource): Promise<RequestOptions[]>;
249
- /**
250
- * Adds all fetched requests from a URL from a remote resource.
251
- */
252
- protected _addFetchedRequests(source: InternalSource, fetchedRequests: RequestOptions[], options: RequestQueueOperationOptions): Promise<ProcessedRequest[]>;
253
- /**
254
- * @internal wraps public utility for mocking purposes
255
- */
256
- private _downloadListOfUrls;
232
+ getInfo(): Promise<RequestQueueInfo>;
257
233
  /**
258
234
  * Opens a request queue and returns a promise resolving to an instance
259
235
  * of the {@link RequestQueue} class.
@@ -265,44 +241,25 @@ export declare abstract class RequestProvider implements IStorage, IRequestManag
265
241
  *
266
242
  * For more details and code examples, see the {@link RequestQueue} class.
267
243
  *
268
- * @param [queueIdOrName]
269
- * ID or name of the request queue to be opened. If `null` or `undefined`,
270
- * 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.
271
248
  * @param [options] Open Request Queue options.
272
249
  */
273
- static open(queueIdOrName?: string | null, options?: StorageManagerOptions): Promise<RequestProvider>;
274
- }
275
- interface RequestLruItem {
276
- uniqueKey: string;
277
- isHandled: boolean;
278
- id: string;
279
- hydrated: Request | null;
280
- lockExpiresAt: number | null;
281
- forefront: boolean;
250
+ static open(identifier?: string | StorageIdentifier | null, options?: StorageOpenOptions): Promise<RequestQueue>;
282
251
  }
283
- export interface RequestProviderOptions {
284
- id: string;
285
- name?: string;
286
- 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;
287
257
  /**
288
258
  * Used to pass the proxy configuration for the `requestsFromUrl` objects.
289
259
  * Takes advantage of the internal address rotation and authentication process.
290
260
  * If undefined, the `requestsFromUrl` requests will be made without proxy.
291
261
  */
292
- proxyConfiguration?: ProxyConfiguration;
293
- }
294
- /**
295
- * @deprecated Use {@link RequestProviderOptions} instead.
296
- */
297
- export interface RequestQueueOptions extends RequestProviderOptions {
298
- }
299
- /**
300
- * @internal
301
- */
302
- export interface InternalRequestProviderOptions extends RequestProviderOptions {
303
- logPrefix: string;
304
- requestCacheMaxSize: number;
305
- recentlyHandledRequestsMaxSize: number;
262
+ proxyConfiguration?: IProxyConfiguration;
306
263
  }
307
264
  export interface RequestQueueOperationOptions {
308
265
  /**
@@ -326,9 +283,6 @@ export interface RequestQueueOperationOptions {
326
283
  */
327
284
  cache?: boolean;
328
285
  }
329
- /**
330
- * @internal
331
- */
332
286
  export interface RequestQueueOperationInfo extends QueueOperationInfo {
333
287
  uniqueKey: string;
334
288
  forefront: boolean;
@@ -347,6 +301,15 @@ export interface AddRequestsBatchedOptions extends RequestQueueOperationOptions
347
301
  * @default 1000
348
302
  */
349
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;
350
313
  }
351
314
  export interface AddRequestsBatchedResult {
352
315
  addedRequests: ProcessedRequest[];
@@ -367,6 +330,11 @@ export interface AddRequestsBatchedResult {
367
330
  * ```
368
331
  */
369
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[];
370
340
  }
371
- export {};
372
- //# sourceMappingURL=request_provider.d.ts.map