@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 +29 -18
- package/dist/index.cjs.map +2 -2
- package/dist/index.js +29 -18
- package/dist/index.js.map +2 -2
- package/package.json +1 -1
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
|
-
//
|
|
1391
|
-
// 每一个拦截请求都是独立的,使用 keepAlive 会导致 Agent 池耗尽,
|
|
1392
|
-
// 从而导致后续请求一直 Pending。
|
|
1401
|
+
// 使用共享的 Agent 单例(keepAlive: false,不会池化连接)
|
|
1393
1402
|
agent: {
|
|
1394
|
-
http:
|
|
1395
|
-
https:
|
|
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
|
-
|
|
1438
|
-
|
|
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
|
});
|