@crawlee/core 3.17.1-beta.20 → 3.17.1-beta.22

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crawlee/core",
3
- "version": "3.17.1-beta.20",
3
+ "version": "3.17.1-beta.22",
4
4
  "description": "The scalable web crawling and scraping library for JavaScript/Node.js. Enables development of data extraction and web automation jobs (not only) with headless Chrome and Puppeteer.",
5
5
  "engines": {
6
6
  "node": ">=16.0.0"
@@ -59,9 +59,9 @@
59
59
  "@apify/pseudo_url": "^2.0.30",
60
60
  "@apify/timeout": "^0.3.0",
61
61
  "@apify/utilities": "^2.7.10",
62
- "@crawlee/memory-storage": "3.17.1-beta.20",
63
- "@crawlee/types": "3.17.1-beta.20",
64
- "@crawlee/utils": "3.17.1-beta.20",
62
+ "@crawlee/memory-storage": "3.17.1-beta.22",
63
+ "@crawlee/types": "3.17.1-beta.22",
64
+ "@crawlee/utils": "3.17.1-beta.22",
65
65
  "@sapphire/async-queue": "^1.5.1",
66
66
  "@vladfrangu/async_event_emitter": "^2.2.2",
67
67
  "csv-stringify": "^6.2.0",
@@ -83,5 +83,5 @@
83
83
  }
84
84
  }
85
85
  },
86
- "gitHead": "0eefe28197a47cd2d969a068b7a9c0f1a065aa95"
86
+ "gitHead": "913fa8ac27d9a04e8a8b87df05d1c6c9ab7f3a87"
87
87
  }
@@ -13,6 +13,11 @@ const request_1 = require("../request");
13
13
  const access_checking_1 = require("./access_checking");
14
14
  const storage_manager_1 = require("./storage_manager");
15
15
  const utils_2 = require("./utils");
16
+ /**
17
+ * Maximum number of consecutive batch-add attempts that make no progress before the remaining
18
+ * unprocessed requests are skipped, so permanently rejected requests don't retry forever.
19
+ */
20
+ const MAX_UNPROCESSED_REQUESTS_RETRIES = 3;
16
21
  class RequestProvider {
17
22
  constructor(options, config = configuration_1.Configuration.getGlobalConfig()) {
18
23
  Object.defineProperty(this, "config", {
@@ -385,13 +390,20 @@ class RequestProvider {
385
390
  const requestIterator = generateRequests();
386
391
  const chunks = (0, utils_1.peekableAsyncIterable)((0, utils_1.chunkedAsyncIterable)(requestIterator, effectiveChunkSize));
387
392
  const chunksIterator = chunks[Symbol.asyncIterator]();
388
- const attemptToAddToQueueAndAddAnyUnprocessed = async (providedRequests, cache = true) => {
393
+ const attemptToAddToQueueAndAddAnyUnprocessed = async (providedRequests, cache = true, unsuccessfulAttempts = 0) => {
389
394
  const resultsToReturn = [];
390
395
  const apiResult = await this.addRequests(providedRequests, { forefront: options.forefront, cache });
391
396
  resultsToReturn.push(...apiResult.processedRequests);
392
397
  if (apiResult.unprocessedRequests.length) {
398
+ // Count attempts that make no progress, so permanently rejected requests (e.g. a malformed
399
+ // `userData` shape causing a 400) don't loop forever. Any progress resets the counter.
400
+ const attempts = apiResult.processedRequests.length ? 0 : unsuccessfulAttempts + 1;
401
+ if (attempts >= MAX_UNPROCESSED_REQUESTS_RETRIES) {
402
+ this.log.warning(`Some requests were consistently rejected by the request queue and will be skipped after ${MAX_UNPROCESSED_REQUESTS_RETRIES} attempts. This usually means the request data is malformed (e.g. an invalid 'userData' shape).`, { unprocessedRequests: apiResult.unprocessedRequests });
403
+ return resultsToReturn;
404
+ }
393
405
  await (0, utils_1.sleep)(waitBetweenBatchesMillis);
394
- resultsToReturn.push(...(await attemptToAddToQueueAndAddAnyUnprocessed(providedRequests.filter((r) => !apiResult.processedRequests.some((pr) => pr.uniqueKey === r.uniqueKey)), false)));
406
+ resultsToReturn.push(...(await attemptToAddToQueueAndAddAnyUnprocessed(providedRequests.filter((r) => !apiResult.processedRequests.some((pr) => pr.uniqueKey === r.uniqueKey)), false, attempts)));
395
407
  }
396
408
  return resultsToReturn;
397
409
  };