@skrillex1224/playwright-toolkit 2.1.96 → 2.1.98

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
@@ -1331,15 +1331,19 @@ var Sse = {
1331
1331
  * @param {function(Error, function): void} [options.onTimeout] - (error, reject) => void
1332
1332
  * @param {number} [options.initialTimeout=90000] - 初始数据接收超时 (ms),默认 90s
1333
1333
  * @param {number} [options.timeout=180000] - 整体请求超时时间 (ms),默认 180s
1334
- * @returns {[Promise<any>, function(): void]} - 返回 [promise, cancel] 元组,promise 为流数据,cancel 为取消监听的函数
1334
+ * @param {boolean} [options.autoUnroute=true] - resolve/reject 后是否自动取消拦截
1335
+ * @param {boolean} [options.firstMatchOnly=false] - 只拦截第一个命中的请求,后续请求全部放行
1336
+ * @returns {Promise<any>} - 返回 Promise,当流满足条件时 resolve
1335
1337
  */
1336
- intercept(page, urlPattern, options = {}) {
1338
+ async intercept(page, urlPattern, options = {}) {
1337
1339
  const {
1338
1340
  onData,
1339
1341
  onEnd,
1340
1342
  onTimeout,
1341
1343
  initialTimeout = 9e4,
1342
- overallTimeout = 18e4
1344
+ overallTimeout = 18e4,
1345
+ autoUnroute = true,
1346
+ firstMatchOnly = false
1343
1347
  } = options;
1344
1348
  let initialTimer = null;
1345
1349
  let overallTimer = null;
@@ -1350,15 +1354,42 @@ var Sse = {
1350
1354
  initialTimer = null;
1351
1355
  overallTimer = null;
1352
1356
  };
1353
- let routeHandler = null;
1354
- let isCancelled = false;
1355
1357
  const workPromise = new Promise((resolve, reject) => {
1356
- routeHandler = async (route) => {
1357
- if (isCancelled) {
1358
+ let finished = false;
1359
+ let unrouteRequested = false;
1360
+ let hasMatchedOnce = false;
1361
+ const safeUnroute = () => {
1362
+ if (!autoUnroute) return;
1363
+ if (unrouteRequested) return;
1364
+ unrouteRequested = true;
1365
+ page.unroute(urlPattern, routeHandler).catch(() => {
1366
+ });
1367
+ };
1368
+ const safeResolve = (value) => {
1369
+ if (finished) return;
1370
+ finished = true;
1371
+ clearAllTimers();
1372
+ safeUnroute();
1373
+ resolve(value);
1374
+ };
1375
+ const safeReject2 = (error) => {
1376
+ if (finished) return;
1377
+ finished = true;
1378
+ clearAllTimers();
1379
+ safeUnroute();
1380
+ reject(error);
1381
+ };
1382
+ const routeHandler = async (route) => {
1383
+ if (firstMatchOnly && hasMatchedOnce) {
1358
1384
  route.continue().catch(() => {
1359
1385
  });
1360
1386
  return;
1361
1387
  }
1388
+ if (firstMatchOnly && !hasMatchedOnce) {
1389
+ hasMatchedOnce = true;
1390
+ page.unroute(urlPattern, routeHandler).catch(() => {
1391
+ });
1392
+ }
1362
1393
  const request = route.request();
1363
1394
  logger8.info(`[MITM] \u5DF2\u62E6\u622A\u8BF7\u6C42: ${request.url()}`);
1364
1395
  try {
@@ -1392,7 +1423,7 @@ var Sse = {
1392
1423
  accumulatedText += textChunk;
1393
1424
  if (onData) {
1394
1425
  try {
1395
- onData(textChunk, resolve, accumulatedText);
1426
+ onData(textChunk, safeResolve, accumulatedText);
1396
1427
  } catch (e) {
1397
1428
  logger8.fail(`onData \u9519\u8BEF`, e);
1398
1429
  }
@@ -1403,12 +1434,12 @@ var Sse = {
1403
1434
  clearAllTimers();
1404
1435
  if (onEnd) {
1405
1436
  try {
1406
- onEnd(accumulatedText, resolve);
1437
+ onEnd(accumulatedText, safeResolve);
1407
1438
  } catch (e) {
1408
1439
  logger8.fail(`onEnd \u9519\u8BEF`, e);
1409
1440
  }
1410
1441
  } else if (!onData) {
1411
- resolve(accumulatedText);
1442
+ safeResolve(accumulatedText);
1412
1443
  }
1413
1444
  route.fulfill({
1414
1445
  status: res.statusCode,
@@ -1422,7 +1453,7 @@ var Sse = {
1422
1453
  clearAllTimers();
1423
1454
  route.abort().catch(() => {
1424
1455
  });
1425
- reject(e);
1456
+ safeReject2(e);
1426
1457
  });
1427
1458
  if (postData) req.write(postData);
1428
1459
  req.end();
@@ -1430,10 +1461,10 @@ var Sse = {
1430
1461
  clearAllTimers();
1431
1462
  route.continue().catch(() => {
1432
1463
  });
1433
- reject(e);
1464
+ safeReject2(e);
1434
1465
  }
1435
1466
  };
1436
- page.route(urlPattern, routeHandler).catch(reject);
1467
+ page.route(urlPattern, routeHandler).catch(safeReject2);
1437
1468
  });
1438
1469
  const timeoutPromise = new Promise((_, reject) => {
1439
1470
  initialTimer = setTimeout(() => {
@@ -1446,12 +1477,12 @@ var Sse = {
1446
1477
  clearAllTimers();
1447
1478
  if (onTimeout) {
1448
1479
  try {
1449
- onTimeout(error, reject);
1480
+ onTimeout(error, (err) => safeReject(err));
1450
1481
  } catch (e) {
1451
- reject(e);
1482
+ safeReject(e);
1452
1483
  }
1453
1484
  } else {
1454
- reject(error);
1485
+ safeReject(error);
1455
1486
  }
1456
1487
  }
1457
1488
  }, initialTimeout);
@@ -1464,12 +1495,12 @@ var Sse = {
1464
1495
  clearAllTimers();
1465
1496
  if (onTimeout) {
1466
1497
  try {
1467
- onTimeout(error, reject);
1498
+ onTimeout(error, (err) => safeReject(err));
1468
1499
  } catch (e) {
1469
- reject(e);
1500
+ safeReject(e);
1470
1501
  }
1471
1502
  } else {
1472
- reject(error);
1503
+ safeReject(error);
1473
1504
  }
1474
1505
  }, overallTimeout);
1475
1506
  });
@@ -1480,20 +1511,7 @@ var Sse = {
1480
1511
  const racePromise = Promise.race([workPromise, timeoutPromise]);
1481
1512
  racePromise.catch(() => {
1482
1513
  });
1483
- const cancel = async () => {
1484
- if (isCancelled) return;
1485
- isCancelled = true;
1486
- clearAllTimers();
1487
- if (routeHandler) {
1488
- try {
1489
- await page.unroute(urlPattern, routeHandler);
1490
- logger8.info("[MITM] \u5DF2\u53D6\u6D88 SSE \u6D41\u76D1\u542C");
1491
- } catch (e) {
1492
- logger8.debug("[MITM] \u53D6\u6D88\u76D1\u542C\u65F6\u51FA\u9519\uFF08\u53EF\u80FD\u5DF2\u53D6\u6D88\uFF09");
1493
- }
1494
- }
1495
- };
1496
- return [racePromise, cancel];
1514
+ return racePromise;
1497
1515
  }
1498
1516
  };
1499
1517