@skrillex1224/playwright-toolkit 2.1.10 → 2.1.11

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/dist/index.cjs CHANGED
@@ -1235,6 +1235,14 @@ var import_got_scraping = require("got-scraping");
1235
1235
  var import_http = require("http");
1236
1236
  var import_https2 = require("https");
1237
1237
  var logger9 = createLogger("Interception");
1238
+ var SHARED_HTTP_AGENT = new import_http.Agent({ keepAlive: false });
1239
+ var SHARED_HTTPS_AGENT = new import_https2.Agent({ keepAlive: false, rejectUnauthorized: false });
1240
+ var DirectConfig = {
1241
+ /** 直连请求超时时间(秒) */
1242
+ directTimeout: 12,
1243
+ /** 静默扩展名:这些扩展名的直连成功日志用 debug 级别 */
1244
+ silentExtensions: [".js"]
1245
+ };
1238
1246
  var ARCHIVE_EXTENSIONS = [".7z", ".zip", ".rar", ".gz", ".bz2", ".tar", ".zst"];
1239
1247
  var EXECUTABLE_EXTENSIONS = [".exe", ".apk", ".bin", ".dmg", ".jar", ".class"];
1240
1248
  var DOCUMENT_EXTENSIONS = [".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".csv"];
@@ -1359,14 +1367,17 @@ var Interception = {
1359
1367
  if (mergedBlockingConfig.blockOther) enabledCategories.push("\u5176\u4ED6");
1360
1368
  logger9.start("setup", hasDirectDomains ? `\u76F4\u8FDE\u57DF\u540D: [${directDomains.length} \u4E2A] | \u5C4F\u853D: [${enabledCategories.join(", ")}]` : `\u4EC5\u8D44\u6E90\u5C4F\u853D\u6A21\u5F0F | \u5C4F\u853D: [${enabledCategories.join(", ")}]`);
1361
1369
  await page.route("**/*", async (route) => {
1370
+ let handled = false;
1362
1371
  try {
1363
1372
  const request = route.request();
1364
1373
  const url = request.url();
1365
1374
  const urlLower = url.toLowerCase();
1366
1375
  const urlPath = urlLower.split("?")[0];
1376
+ const isSilent = DirectConfig.silentExtensions.some((ext) => urlPath.endsWith(ext));
1367
1377
  const shouldBlock = blockedExtensions.some((ext) => urlPath.endsWith(ext));
1368
1378
  if (shouldBlock) {
1369
1379
  await route.abort();
1380
+ handled = true;
1370
1381
  return;
1371
1382
  }
1372
1383
  if (hasDirectDomains && directDomains.some((domain) => url.includes(domain))) {
@@ -1387,18 +1398,13 @@ var Interception = {
1387
1398
  // 强制获取 Buffer
1388
1399
  // 模拟浏览器 TLS 指纹
1389
1400
  headerGeneratorOptions: Stealth.getTlsFingerprintOptions(userAgent),
1390
- // 【核心修复 1】: keepAlive 设置为 false
1391
- // 每一个拦截请求都是独立的,使用 keepAlive 会导致 Agent 池耗尽,
1392
- // 从而导致后续请求一直 Pending。
1401
+ // 使用共享的 Agent 单例(keepAlive: false,不会池化连接)
1393
1402
  agent: {
1394
- http: new import_http.Agent({ keepAlive: false }),
1395
- https: new import_https2.Agent({ keepAlive: false, rejectUnauthorized: false })
1403
+ http: SHARED_HTTP_AGENT,
1404
+ https: SHARED_HTTPS_AGENT
1396
1405
  },
1397
- // 设置较短的超时时间,给回退代理留出机会
1398
- timeout: {
1399
- request: 12 * 1e3
1400
- // 12秒超时
1401
- }
1406
+ // 超时时间
1407
+ timeout: { request: DirectConfig.directTimeout * 1e3 }
1402
1408
  });
1403
1409
  const resHeaders = {};
1404
1410
  for (const [key, value] of Object.entries(response.headers)) {
@@ -1413,32 +1419,37 @@ var Interception = {
1413
1419
  delete resHeaders["transfer-encoding"];
1414
1420
  delete resHeaders["connection"];
1415
1421
  delete resHeaders["keep-alive"];
1416
- logger9.info(`\u76F4\u8FDE\u6210\u529F: ${url}`);
1422
+ isSilent ? logger9.debug(`\u76F4\u8FDE\u6210\u529F: ${url}`) : logger9.info(`\u76F4\u8FDE\u6210\u529F: ${url}`);
1417
1423
  await safeFulfill(route, {
1418
1424
  status: response.statusCode,
1419
1425
  headers: resHeaders,
1420
1426
  body: response.body
1421
1427
  });
1428
+ handled = true;
1422
1429
  return;
1423
1430
  } catch (e) {
1431
+ const isTimeout = e.code === "ETIMEDOUT" || e.message.toLowerCase().includes("timeout");
1432
+ const action = fallbackToProxy ? "\u56DE\u9000\u4EE3\u7406" : "\u5DF2\u653E\u5F03";
1433
+ const reason = isTimeout ? `\u8D85\u65F6(${DirectConfig.directTimeout}s)` : `\u5F02\u5E38: ${e.message}`;
1434
+ logger9.warn(`\u76F4\u8FDE${reason}\uFF0C${action}: ${url}`);
1424
1435
  if (fallbackToProxy) {
1425
- logger9.warn(`\u76F4\u8FDE\u5F02\u5E38\uFF0C\u56DE\u9000\u4EE3\u7406: ${url} | Err: ${e.message}`);
1426
1436
  await safeContinue(route);
1427
- return;
1428
1437
  } else {
1429
- logger9.warn(`\u76F4\u8FDE\u5931\u8D25: ${url} | Err: ${e.message}`);
1430
1438
  await route.abort();
1431
- return;
1432
1439
  }
1440
+ handled = true;
1441
+ return;
1433
1442
  }
1434
1443
  }
1435
1444
  await safeContinue(route);
1445
+ handled = true;
1436
1446
  } catch (err) {
1437
- try {
1438
- if (!route.request().failure()) {
1447
+ logger9.warn(`\u8DEF\u7531\u5904\u7406\u5F02\u5E38: ${err.message}`);
1448
+ if (!handled) {
1449
+ try {
1439
1450
  await route.continue();
1451
+ } catch (_) {
1440
1452
  }
1441
- } catch (_) {
1442
1453
  }
1443
1454
  }
1444
1455
  });