@letsscrapedata/controller 0.0.64 → 0.0.66

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
@@ -32,6 +32,10 @@ var src_exports = {};
32
32
  __export(src_exports, {
33
33
  CheerioElement: () => CheerioElement,
34
34
  CheerioPage: () => CheerioPage,
35
+ ControllerEvent: () => ControllerEvent,
36
+ LsdBrowserContextEvent: () => LsdBrowserContextEvent,
37
+ LsdBrowserEvent: () => LsdBrowserEvent,
38
+ LsdPageEvent: () => LsdPageEvent,
35
39
  PlaywrightBrowser: () => PlaywrightBrowser,
36
40
  PlaywrightBrowserContext: () => PlaywrightBrowserContext,
37
41
  PlaywrightElement: () => PlaywrightElement,
@@ -45,6 +49,32 @@ __export(src_exports, {
45
49
  });
46
50
  module.exports = __toCommonJS(src_exports);
47
51
 
52
+ // src/types/types.ts
53
+ var ControllerEvent = /* @__PURE__ */ ((ControllerEvent2) => {
54
+ ControllerEvent2["BROWSERCONTEXT_CLOSE"] = "close";
55
+ ControllerEvent2["BROWSERCONTEXT_PAGE"] = "page";
56
+ ControllerEvent2["BROWSERCONTEXT_TARGETCREATED"] = "targetcreated";
57
+ ControllerEvent2["BROWSER_DISCONNECTED"] = "disconnected";
58
+ ControllerEvent2["PAGE_CLOSE"] = "close";
59
+ ControllerEvent2["PAGE_POUP"] = "popup";
60
+ ControllerEvent2["PAGE_REQUEST"] = "request";
61
+ ControllerEvent2["PAGE_RESPONSE"] = "response";
62
+ return ControllerEvent2;
63
+ })(ControllerEvent || {});
64
+ var LsdPageEvent = /* @__PURE__ */ ((LsdPageEvent2) => {
65
+ LsdPageEvent2["PAGE_CLOSE"] = "pageClose";
66
+ LsdPageEvent2["PAGE_POPUP"] = "pagePopup";
67
+ return LsdPageEvent2;
68
+ })(LsdPageEvent || {});
69
+ var LsdBrowserContextEvent = /* @__PURE__ */ ((LsdBrowserContextEvent2) => {
70
+ LsdBrowserContextEvent2["PAGE_CLOSE"] = "pageClose";
71
+ return LsdBrowserContextEvent2;
72
+ })(LsdBrowserContextEvent || {});
73
+ var LsdBrowserEvent = /* @__PURE__ */ ((LsdBrowserEvent2) => {
74
+ LsdBrowserEvent2["BROWSER_CONTEXT_CLOSE"] = "browserContextClose";
75
+ return LsdBrowserEvent2;
76
+ })(LsdBrowserEvent || {});
77
+
48
78
  // src/utils/log.ts
49
79
  var import_utils = require("@letsscrapedata/utils");
50
80
  var pkgLog = import_utils.log;
@@ -56,6 +86,9 @@ function setControllerLogFun(logFun) {
56
86
  return false;
57
87
  }
58
88
  }
89
+ async function logdbg(...args) {
90
+ await pkgLog(import_utils.LogLevel.DBG, ...args);
91
+ }
59
92
  async function loginfo(...args) {
60
93
  await pkgLog(import_utils.LogLevel.INF, ...args);
61
94
  }
@@ -403,6 +436,7 @@ var PlaywrightPage = class extends import_node_events.default {
403
436
  #responseInterceptionOptions;
404
437
  #client;
405
438
  #responseCb;
439
+ #isDebugTask;
406
440
  #hasValidUrl(page) {
407
441
  const url = page.url();
408
442
  return url.toLowerCase().startsWith("http");
@@ -418,7 +452,7 @@ var PlaywrightPage = class extends import_node_events.default {
418
452
  const cookieItems = await this.#getCookies(page);
419
453
  const domainSet = new Set(cookieItems.map((c) => c.domain));
420
454
  if (domainSet.size !== 1) {
421
- logwarn(`Domains in clearCookies: ${Array.from(domainSet.values())}`);
455
+ logwarn(`##browser LsdPage domains in clearCookies: ${Array.from(domainSet.values())}`);
422
456
  }
423
457
  for (const domain of domainSet.values()) {
424
458
  await browserContext.clearCookies({ domain });
@@ -624,15 +658,15 @@ var PlaywrightPage = class extends import_node_events.default {
624
658
  }
625
659
  const page = this.#page;
626
660
  const pageId = this.#pageId;
627
- page.on("close", async () => {
628
- loginfo(`##browser ${pageId} closed`);
661
+ page.on("close" /* PAGE_CLOSE */, async () => {
662
+ loginfo(`##browser page ${pageId} closed @LsdPage`);
629
663
  if (!page.pageInfo) {
630
- logerr(`Logic error in page.on("close")`);
664
+ logerr(`##browser LsdPage logic error in page.on("close")`);
631
665
  }
632
- this.emit("pageClose");
633
- this.#lsdBrowserContext.emit("pageClose", this);
666
+ this.emit("pageClose" /* PAGE_CLOSE */);
667
+ this.#lsdBrowserContext.emit("pageClose" /* PAGE_CLOSE */, this);
634
668
  });
635
- page.on("popup", (p) => {
669
+ page.on("popup" /* PAGE_POUP */, (p) => {
636
670
  if (p) {
637
671
  let evtData = null;
638
672
  const pageInfo = p.pageInfo;
@@ -646,12 +680,12 @@ var PlaywrightPage = class extends import_node_events.default {
646
680
  pageInfo.relatedId = page.pageInfo.taskId;
647
681
  }
648
682
  } else {
649
- logerr(`##browser ${pageId} has popup without page.pageInfo`);
683
+ logerr(`##browser page ${pageId} has popup without page.pageInfo @LsdPage`);
650
684
  }
651
- loginfo(`##browser ${pageId} has popup ${popupPageId}`);
652
- this.emit("pagePopup", evtData);
685
+ loginfo(`##browser page ${pageId} has popup ${popupPageId} @LsdPage`);
686
+ this.emit("pagePopup" /* PAGE_POPUP */, evtData);
653
687
  } else {
654
- logerr(`##browser ${pageId} has popup page with null page`);
688
+ logerr(`##browser page ${pageId} has popup page with null page @LsdPage`);
655
689
  }
656
690
  });
657
691
  }
@@ -666,12 +700,14 @@ var PlaywrightPage = class extends import_node_events.default {
666
700
  const currentTime = (0, import_utils3.getCurrentUnixTime)();
667
701
  const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
668
702
  this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId, relatedId, misc };
669
- this.#pageId = `page-${browserIdx}-${browserContextIdx}-${pageIdx}`;
703
+ this.#pageId = `PlaywrightPage-${browserIdx}-${browserContextIdx}-${pageIdx}`;
670
704
  this.#closeWhenFree = false;
671
705
  this.#resquestInterceptionOptions = [];
672
706
  this.#responseInterceptionOptions = [];
673
707
  this.#client = null;
674
708
  this.#responseCb = null;
709
+ this.#isDebugTask = false;
710
+ loginfo(`##browser LsdPage ${this.#pageId} ${openType}ed`);
675
711
  this.#addPageOn();
676
712
  }
677
713
  async addPreloadScript(scriptOrFunc, arg) {
@@ -752,7 +788,7 @@ var PlaywrightPage = class extends import_node_events.default {
752
788
  }
753
789
  async close() {
754
790
  if (this.#status === "closed") {
755
- logwarn(`Page ${this.#pageId} is already closed.`);
791
+ logwarn(`##browser LsdPage ${this.#pageId} is already closed.`);
756
792
  return true;
757
793
  } else if (this.#status === "busy") {
758
794
  throw new Error(`Page ${this.#pageId} cannot be closed because it is busy.`);
@@ -763,6 +799,7 @@ var PlaywrightPage = class extends import_node_events.default {
763
799
  await this.#page.close();
764
800
  this.#page = null;
765
801
  this.#status = "closed";
802
+ loginfo(`##browser LsdPage ${this.#pageId} is closed`);
766
803
  return true;
767
804
  }
768
805
  closeWhenFree() {
@@ -793,7 +830,10 @@ var PlaywrightPage = class extends import_node_events.default {
793
830
  if (!this.#page) {
794
831
  throw new Error("No valid page");
795
832
  }
796
- const height = await this.#page.evaluate(() => document.documentElement.scrollHeight);
833
+ let height = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
834
+ if (typeof height === "undefined") {
835
+ height = 0;
836
+ }
797
837
  return height;
798
838
  }
799
839
  async evaluate(func, args) {
@@ -844,10 +884,11 @@ var PlaywrightPage = class extends import_node_events.default {
844
884
  return [];
845
885
  }
846
886
  async free() {
847
- if (this.#status === "free") {
848
- logwarn(`Page ${this.#pageId} is already free.`);
887
+ if (this.#status === "free" && this.pageInfo().openType !== "popup") {
888
+ logwarn(`##browser LsdPage ${this.#pageId} is already free.`);
849
889
  }
850
890
  this.#status = "free";
891
+ logdbg(`##browser LsdPage ${this.#pageId} is freed`);
851
892
  await this.clearRequestInterceptions();
852
893
  await this.clearResponseInterceptions();
853
894
  return true;
@@ -944,9 +985,18 @@ var PlaywrightPage = class extends import_node_events.default {
944
985
  if (!this.#page) {
945
986
  throw new Error("No valid page");
946
987
  }
947
- const bodyHeight = await this.#page.evaluate(() => document.body.scrollHeight);
948
- const documentHeight = await this.#page.evaluate(() => document.documentElement.scrollHeight);
949
- const windowHeight = await this.#page.evaluate(() => window.outerHeight);
988
+ let bodyHeight = await this.#page.evaluate(() => document?.body?.scrollHeight);
989
+ if (typeof bodyHeight === "undefined") {
990
+ bodyHeight = 0;
991
+ }
992
+ let documentHeight = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
993
+ if (typeof documentHeight === "undefined") {
994
+ documentHeight = 0;
995
+ }
996
+ let windowHeight = await this.#page.evaluate(() => window.outerHeight);
997
+ if (typeof windowHeight === "undefined") {
998
+ windowHeight = 0;
999
+ }
950
1000
  const pageHeight = Math.max(bodyHeight, documentHeight, windowHeight);
951
1001
  return pageHeight;
952
1002
  }
@@ -960,8 +1010,14 @@ var PlaywrightPage = class extends import_node_events.default {
960
1010
  if (!this.#page) {
961
1011
  throw new Error("No valid page");
962
1012
  }
963
- const offsetWidth = await this.#page.evaluate(() => document.documentElement.offsetWidth);
964
- const windowWidth = await this.#page.evaluate(() => window.outerWidth);
1013
+ let offsetWidth = await this.#page.evaluate(() => document?.documentElement?.offsetWidth);
1014
+ if (typeof offsetWidth === "undefined") {
1015
+ offsetWidth = 0;
1016
+ }
1017
+ let windowWidth = await this.#page.evaluate(() => window.outerWidth);
1018
+ if (typeof windowWidth === "undefined") {
1019
+ windowWidth = 0;
1020
+ }
965
1021
  const pageWidth = Math.max(offsetWidth, windowWidth);
966
1022
  return pageWidth;
967
1023
  }
@@ -1069,6 +1125,8 @@ var PlaywrightPage = class extends import_node_events.default {
1069
1125
  }
1070
1126
  if (typeof taskId === "number") {
1071
1127
  actPageInfo.taskId = taskId;
1128
+ const debug = this.#page && this.#page.pageInfo && this.#page.pageInfo.taskId < 0;
1129
+ this.#isDebugTask = !!debug;
1072
1130
  }
1073
1131
  if (typeof relatedId === "number") {
1074
1132
  actPageInfo.relatedId = relatedId;
@@ -1112,7 +1170,7 @@ var PlaywrightPage = class extends import_node_events.default {
1112
1170
  }
1113
1171
  const actOptions = Array.isArray(options) ? options : [options];
1114
1172
  if (actOptions.length <= 0) {
1115
- logwarn("Invalid paras in setRequestInterception");
1173
+ logwarn("##browser LsdPage invalid paras in setRequestInterception");
1116
1174
  return false;
1117
1175
  }
1118
1176
  const firstRequestInterception = this.#resquestInterceptionOptions.length <= 0;
@@ -1133,6 +1191,13 @@ var PlaywrightPage = class extends import_node_events.default {
1133
1191
  const { requestMatch, action, fulfill } = option;
1134
1192
  const request = route.request();
1135
1193
  const matchedFlag = !requestMatch || this.#checkRequestMatch(request, requestMatch);
1194
+ if (this.#isDebugTask) {
1195
+ if (matchedFlag) {
1196
+ loginfo(`##browser matched request ${request.method()} ${request.url()}`);
1197
+ } else {
1198
+ logdbg(`##browser unmatched request ${request.method()} ${request.url()}`);
1199
+ }
1200
+ }
1136
1201
  if (matchedFlag) {
1137
1202
  switch (action) {
1138
1203
  case "abort":
@@ -1184,6 +1249,13 @@ var PlaywrightPage = class extends import_node_events.default {
1184
1249
  matchedFlag = false;
1185
1250
  }
1186
1251
  }
1252
+ if (this.#isDebugTask) {
1253
+ if (matchedFlag) {
1254
+ loginfo(`##browser matched response ${request.method()} ${request.url()}`);
1255
+ } else {
1256
+ logdbg(`##browser unmatched response ${request.method()} ${request.url()}`);
1257
+ }
1258
+ }
1187
1259
  if (!matchedFlag) {
1188
1260
  continue;
1189
1261
  }
@@ -1219,7 +1291,7 @@ var PlaywrightPage = class extends import_node_events.default {
1219
1291
  }
1220
1292
  const actOptions = Array.isArray(options) ? options : [options];
1221
1293
  if (actOptions.length <= 0) {
1222
- logwarn("Invalid paras in setResponseInterception");
1294
+ logwarn("##browser LsdPage invalid paras in setResponseInterception");
1223
1295
  return false;
1224
1296
  }
1225
1297
  const firstResponseInterception = this.#responseInterceptionOptions.length <= 0;
@@ -1232,7 +1304,7 @@ var PlaywrightPage = class extends import_node_events.default {
1232
1304
  }
1233
1305
  if (firstResponseInterception && this.#responseInterceptionOptions.length > 0) {
1234
1306
  this.#responseCb = this.#responseListener.bind(this);
1235
- this.#page.on("response", this.#responseCb);
1307
+ this.#page.on("response" /* PAGE_RESPONSE */, this.#responseCb);
1236
1308
  }
1237
1309
  return true;
1238
1310
  }
@@ -1280,6 +1352,7 @@ var PlaywrightPage = class extends import_node_events.default {
1280
1352
  throw new Error(`Page ${this.#pageId} is already busy!!!`);
1281
1353
  }
1282
1354
  this.#status = "busy";
1355
+ logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
1283
1356
  return true;
1284
1357
  }
1285
1358
  async waitForElement(selector, options = {}) {
@@ -1418,11 +1491,10 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
1418
1491
  for (const page of pages) {
1419
1492
  const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, lastStatusUpdateTime, taskId: 0, relatedId: 0, misc: {} };
1420
1493
  const lsdPage = new PlaywrightPage(this, page, pageInfo);
1494
+ this.#lsdPages.push(lsdPage);
1421
1495
  if (this.#maxViewportOfNewPage) {
1422
1496
  await lsdPage.maximizeViewport();
1423
1497
  }
1424
- this.#lsdPages.push(lsdPage);
1425
- loginfo(`##browser ${lsdPage.id()} ${openType}ed`);
1426
1498
  }
1427
1499
  }
1428
1500
  constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, maxViewportOfNewPage = true) {
@@ -1452,8 +1524,9 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
1452
1524
  this.#lsdPages = [];
1453
1525
  this.#nextPageIdx = 1;
1454
1526
  this.#gettingPage = false;
1527
+ loginfo(`##browser LsdBrowserContext ${this.id()} is created`);
1455
1528
  this.#initPages();
1456
- browserContext.on("page", async (page) => {
1529
+ browserContext.on("page" /* BROWSERCONTEXT_PAGE */, async (page) => {
1457
1530
  const pageInfo = page.pageInfo;
1458
1531
  if (pageInfo) {
1459
1532
  const { browserIdx: browserIdx2, browserContextIdx: browserContextIdx2, pageIdx } = pageInfo;
@@ -1462,27 +1535,26 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
1462
1535
  const currentTime2 = (0, import_utils4.getCurrentUnixTime)();
1463
1536
  const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
1464
1537
  const lsdPage = new PlaywrightPage(this, page, pageInfo2);
1538
+ this.#lsdPages.push(lsdPage);
1465
1539
  if (this.#maxViewportOfNewPage) {
1466
1540
  await lsdPage.maximizeViewport();
1467
1541
  }
1468
- this.#lsdPages.push(lsdPage);
1469
- loginfo(`##page ${lsdPage.id()} created`);
1470
1542
  }
1471
1543
  });
1472
- browserContext.on("close", (bc) => {
1544
+ browserContext.on("close" /* BROWSERCONTEXT_CLOSE */, (bc) => {
1473
1545
  if (browserContext !== bc) {
1474
1546
  logerr(`##browser different browserContext in browserContext.on("close")`);
1475
1547
  }
1476
- this.#lsdBrowser.emit("browserContextClose", this);
1548
+ this.#lsdBrowser.emit("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, this);
1477
1549
  });
1478
- this.on("pageClose", (lsdPage) => {
1550
+ this.on("pageClose" /* PAGE_CLOSE */, (lsdPage) => {
1479
1551
  if (!(lsdPage instanceof PlaywrightPage)) {
1480
- logerr(`Invalid data in LsdBrowserContext.on("pageClose)`);
1552
+ logerr(`##browser LsdBrowserContext invalid data in LsdBrowserContext.on("pageClose)`);
1481
1553
  return;
1482
1554
  }
1483
1555
  const idx = this.#lsdPages.findIndex((p) => p === lsdPage);
1484
1556
  if (idx < 0) {
1485
- logerr(`Invalid lsdPage in LsdBrowserContext.on("pageClose)`);
1557
+ logerr(`##browser LsdBrowserContext invalid lsdPage in LsdBrowserContext.on("pageClose)`);
1486
1558
  return;
1487
1559
  }
1488
1560
  this.#lsdPages.splice(idx, 1);
@@ -1499,7 +1571,7 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
1499
1571
  if (this.#browserContext) {
1500
1572
  this.#status = "closed";
1501
1573
  this.#lastStatusUpdateTime = (0, import_utils4.getCurrentUnixTime)();
1502
- loginfo(`browserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
1574
+ loginfo(`##browser LsdBrowserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
1503
1575
  await this.#browserContext.close();
1504
1576
  }
1505
1577
  return true;
@@ -1514,12 +1586,12 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
1514
1586
  await (0, import_utils4.sleep)(200);
1515
1587
  }
1516
1588
  }
1517
- logwarn(`Cannot get the gettingLock.`);
1589
+ logwarn(`##browser LsdBrowserContext cannot get the gettingLock.`);
1518
1590
  return false;
1519
1591
  }
1520
1592
  #freeGettingLock() {
1521
1593
  if (!this.#gettingPage) {
1522
- logwarn(`Getting lock is already free now.`);
1594
+ logwarn(`##browser LsdBrowserContext gettingLock is already free now.`);
1523
1595
  }
1524
1596
  this.#gettingPage = false;
1525
1597
  }
@@ -1528,7 +1600,7 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
1528
1600
  maxPageFreeSeconds = this.#maxPageFreeSeconds;
1529
1601
  }
1530
1602
  if (maxPageFreeSeconds <= 0) {
1531
- logwarn(`Please set valid maxPageFreeSeconds to close free pages`);
1603
+ logwarn(`##browser LsdBrowserContext please set valid maxPageFreeSeconds to close free pages`);
1532
1604
  return false;
1533
1605
  }
1534
1606
  const gotLock = await this.#tryToGetGettingLock();
@@ -1625,7 +1697,7 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
1625
1697
  }
1626
1698
  }
1627
1699
  id() {
1628
- return `browserContext-${this.#browserIdx}-${this.#browserContextIdx}`;
1700
+ return `PlaywrightContext-${this.#browserIdx}-${this.#browserContextIdx}`;
1629
1701
  }
1630
1702
  isFree() {
1631
1703
  return this.#status === "free";
@@ -1759,34 +1831,33 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends import_node_events3.def
1759
1831
  this.#executablePath = executablePath;
1760
1832
  this.#nextBrowserContextIdx = 1;
1761
1833
  this.#closeFreePagesIntervalId = null;
1762
- loginfo(`##browser ${this.id()} ${this.#browserCreationMethod}ed by ${this.#browserControllerType}`);
1834
+ loginfo(`##browser LsdBrowser ${this.id()} ${this.#browserCreationMethod}ed}`);
1763
1835
  const browserContexts = browser.contexts();
1764
1836
  if (browserContexts.length > 0) {
1765
- logwarn(`There are ${browserContexts.length} new browserContexts when playwright launches new browser`);
1837
+ logwarn(`##browser LsdBrowser there are ${browserContexts.length} new browserContexts when playwright launches new browser`);
1766
1838
  }
1767
1839
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
1768
1840
  for (const browserContext of browserContexts) {
1769
1841
  const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
1770
1842
  this.#lsdBrowserContexts.push(lsdBrowserContext);
1771
- loginfo(`##browserContext ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
1772
1843
  }
1773
- browser.on("disconnected", () => {
1844
+ browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
1774
1845
  loginfo(`##browser ${this.id()} disconnected`);
1775
1846
  if (this.#lsdBrowserContexts.length > 0) {
1776
- logerr(`${this.id()} has browserContexts when disconnected`);
1847
+ logerr(`##browser LsdBrowser ${this.id()} has browserContexts when disconnected`);
1777
1848
  }
1778
1849
  });
1779
- this.on("browserContextClose", (lsdBrowserContext) => {
1850
+ this.on("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, (lsdBrowserContext) => {
1780
1851
  if (!(lsdBrowserContext instanceof PlaywrightBrowserContext)) {
1781
- logerr(`Invalid data in LsdBrowser.on("browserContextClose)`);
1852
+ logerr(`##browser LsdBrowser invalid data in LsdBrowser.on("browserContextClose)`);
1782
1853
  return;
1783
1854
  }
1784
1855
  const idx = this.#lsdBrowserContexts.findIndex((bc) => bc === lsdBrowserContext);
1785
1856
  if (idx < 0) {
1786
- logerr(`Invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
1857
+ logerr(`##browser LsdBrowser invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
1787
1858
  return;
1788
1859
  }
1789
- loginfo(`##browserContext ${lsdBrowserContext.id()} closed
1860
+ loginfo(`##browser ${lsdBrowserContext.id()} closed
1790
1861
  `);
1791
1862
  this.#lsdBrowserContexts.splice(idx, 1);
1792
1863
  if (this.#lsdBrowserContexts.length === 0) {
@@ -1807,7 +1878,7 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends import_node_events3.def
1807
1878
  }
1808
1879
  async newBrowserContext(options) {
1809
1880
  if (this.#lsdBrowserContexts.length >= this.#maxBrowserContextsPerBrowser()) {
1810
- logwarn(`##browser ${this.id()} can not create more new browserContext`);
1881
+ logwarn(`##browser LsdBrowser ${this.id()} can not create more new browserContext`);
1811
1882
  return null;
1812
1883
  }
1813
1884
  const browserContextOptions = {};
@@ -1826,7 +1897,6 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends import_node_events3.def
1826
1897
  const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
1827
1898
  const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
1828
1899
  this.#lsdBrowserContexts.push(lsdBrowserContext);
1829
- loginfo(`##browser ${lsdBrowserContext.id()} created`);
1830
1900
  return lsdBrowserContext;
1831
1901
  }
1832
1902
  async close() {
@@ -1837,6 +1907,7 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends import_node_events3.def
1837
1907
  await lsdBrowserContext.close();
1838
1908
  }
1839
1909
  await this.#browser.close();
1910
+ loginfo(`##browser LsdBrowser ${this.id()} is closed`);
1840
1911
  return true;
1841
1912
  }
1842
1913
  browserContexts() {
@@ -1862,7 +1933,7 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends import_node_events3.def
1862
1933
  return this.#executablePath;
1863
1934
  }
1864
1935
  id() {
1865
- return `browser-${this.#browserType}-${this.#browserIdx}`;
1936
+ return `PlaywrightBrowser-${this.#browserType}-${this.#browserIdx}`;
1866
1937
  }
1867
1938
  isConnected() {
1868
1939
  return this.#browser.isConnected();
@@ -2212,6 +2283,7 @@ var PuppeteerPage = class extends import_node_events4.default {
2212
2283
  #requestInterceptionNum;
2213
2284
  #responseInterceptionNum;
2214
2285
  #client;
2286
+ #isDebugTask;
2215
2287
  #hasValidUrl(page) {
2216
2288
  const url = page.url();
2217
2289
  return url.toLowerCase().startsWith("http");
@@ -2397,15 +2469,15 @@ var PuppeteerPage = class extends import_node_events4.default {
2397
2469
  }
2398
2470
  const page = this.#page;
2399
2471
  const pageId = this.#pageId;
2400
- page.on("close", async () => {
2401
- loginfo(`##browser ${pageId} closed`);
2472
+ page.on("close" /* PAGE_CLOSE */, async () => {
2473
+ loginfo(`##browser page ${pageId} closed @LsdPage`);
2402
2474
  if (!page.pageInfo) {
2403
- logerr(`Logic error in page.on("close")`);
2475
+ logerr(`##browser LsdPage logic error in page.on("close")`);
2404
2476
  }
2405
- this.emit("pageClose");
2406
- this.#lsdBrowserContext.emit("pageClose", this);
2477
+ this.emit("pageClose" /* PAGE_CLOSE */);
2478
+ this.#lsdBrowserContext.emit("pageClose" /* PAGE_CLOSE */, this);
2407
2479
  });
2408
- page.on("popup", (p) => {
2480
+ page.on("popup" /* PAGE_POUP */, (p) => {
2409
2481
  if (p) {
2410
2482
  let evtData = null;
2411
2483
  const pageInfo = p.pageInfo;
@@ -2419,12 +2491,12 @@ var PuppeteerPage = class extends import_node_events4.default {
2419
2491
  pageInfo.relatedId = page.pageInfo.taskId;
2420
2492
  }
2421
2493
  } else {
2422
- logerr(`##browser ${pageId} has popup without page.pageInfo`);
2494
+ logerr(`##browser page ${pageId} has popup without page.pageInfo @LsdPage`);
2423
2495
  }
2424
- loginfo(`##browser ${pageId} has popup ${popupPageId}`);
2425
- this.emit("pagePopup", evtData);
2496
+ loginfo(`##browser page ${pageId} has popup ${popupPageId} @LsdPage`);
2497
+ this.emit("pagePopup" /* PAGE_POPUP */, evtData);
2426
2498
  } else {
2427
- logerr(`##browser ${pageId} has popup page with null page`);
2499
+ logerr(`##browser page ${pageId} has popup page with null page @LsdPage`);
2428
2500
  }
2429
2501
  });
2430
2502
  }
@@ -2439,11 +2511,13 @@ var PuppeteerPage = class extends import_node_events4.default {
2439
2511
  const currentTime = (0, import_utils7.getCurrentUnixTime)();
2440
2512
  const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
2441
2513
  this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId, relatedId, misc };
2442
- this.#pageId = `page-${browserIdx}-${browserContextIdx}-${pageIdx}`;
2514
+ this.#pageId = `PuppeteerPage-${browserIdx}-${browserContextIdx}-${pageIdx}`;
2443
2515
  this.#closeWhenFree = false;
2444
2516
  this.#requestInterceptionNum = 0;
2445
2517
  this.#responseInterceptionNum = 0;
2446
2518
  this.#client = null;
2519
+ this.#isDebugTask = false;
2520
+ loginfo(`##browser LsdPage ${this.#pageId} ${openType}ed`);
2447
2521
  this.#addPageOn();
2448
2522
  }
2449
2523
  async addPreloadScript(scriptOrFunc, arg) {
@@ -2521,7 +2595,7 @@ var PuppeteerPage = class extends import_node_events4.default {
2521
2595
  }
2522
2596
  async close() {
2523
2597
  if (this.#status === "closed") {
2524
- logwarn(`Page ${this.#pageId} is already closed.`);
2598
+ logwarn(`##browser LsdPage ${this.#pageId} is already closed.`);
2525
2599
  return true;
2526
2600
  } else if (this.#status === "busy") {
2527
2601
  throw new Error(`Page ${this.#pageId} cannot be closed because it is busy.`);
@@ -2532,6 +2606,7 @@ var PuppeteerPage = class extends import_node_events4.default {
2532
2606
  await this.#page.close();
2533
2607
  this.#page = null;
2534
2608
  this.#status = "closed";
2609
+ loginfo(`##browser LsdPage ${this.#pageId} is closed`);
2535
2610
  return true;
2536
2611
  }
2537
2612
  closeWhenFree() {
@@ -2562,7 +2637,10 @@ var PuppeteerPage = class extends import_node_events4.default {
2562
2637
  if (!this.#page) {
2563
2638
  throw new Error("No valid page");
2564
2639
  }
2565
- const height = await this.#page.evaluate(() => document.documentElement.scrollHeight);
2640
+ let height = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
2641
+ if (typeof height === "undefined") {
2642
+ height = 0;
2643
+ }
2566
2644
  return height;
2567
2645
  }
2568
2646
  async evaluate(func, args) {
@@ -2613,10 +2691,11 @@ var PuppeteerPage = class extends import_node_events4.default {
2613
2691
  return [];
2614
2692
  }
2615
2693
  async free() {
2616
- if (this.#status === "free") {
2617
- logwarn(`Page ${this.#pageId} is already free.`);
2694
+ if (this.#status === "free" && this.pageInfo().openType !== "popup") {
2695
+ logwarn(`##browser LsdPage ${this.#pageId} is already free.`);
2618
2696
  }
2619
2697
  this.#status = "free";
2698
+ logdbg(`##browser LsdPage ${this.#pageId} is freed`);
2620
2699
  await this.clearRequestInterceptions();
2621
2700
  await this.clearResponseInterceptions();
2622
2701
  return true;
@@ -2717,9 +2796,18 @@ var PuppeteerPage = class extends import_node_events4.default {
2717
2796
  if (!this.#page) {
2718
2797
  throw new Error("No valid page");
2719
2798
  }
2720
- const bodyHeight = await this.#page.evaluate(() => document.body.scrollHeight);
2721
- const documentHeight = await this.#page.evaluate(() => document.documentElement.scrollHeight);
2722
- const windowHeight = await this.#page.evaluate(() => window.outerHeight);
2799
+ let bodyHeight = await this.#page.evaluate(() => document?.body?.scrollHeight);
2800
+ if (typeof bodyHeight === "undefined") {
2801
+ bodyHeight = 0;
2802
+ }
2803
+ let documentHeight = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
2804
+ if (typeof documentHeight === "undefined") {
2805
+ documentHeight = 0;
2806
+ }
2807
+ let windowHeight = await this.#page.evaluate(() => window.outerHeight);
2808
+ if (typeof windowHeight === "undefined") {
2809
+ windowHeight = 0;
2810
+ }
2723
2811
  const pageHeight = Math.max(bodyHeight, documentHeight, windowHeight);
2724
2812
  return pageHeight;
2725
2813
  }
@@ -2733,8 +2821,14 @@ var PuppeteerPage = class extends import_node_events4.default {
2733
2821
  if (!this.#page) {
2734
2822
  throw new Error("No valid page");
2735
2823
  }
2736
- const offsetWidth = await this.#page.evaluate(() => document.documentElement.offsetWidth);
2737
- const windowWidth = await this.#page.evaluate(() => window.outerWidth);
2824
+ let offsetWidth = await this.#page.evaluate(() => document?.documentElement?.offsetWidth);
2825
+ if (typeof offsetWidth === "undefined") {
2826
+ offsetWidth = 0;
2827
+ }
2828
+ let windowWidth = await this.#page.evaluate(() => window.outerWidth);
2829
+ if (typeof windowWidth === "undefined") {
2830
+ windowWidth = 0;
2831
+ }
2738
2832
  const pageWidth = Math.max(offsetWidth, windowWidth);
2739
2833
  return pageWidth;
2740
2834
  }
@@ -2841,6 +2935,8 @@ var PuppeteerPage = class extends import_node_events4.default {
2841
2935
  }
2842
2936
  if (typeof taskId === "number") {
2843
2937
  actPageInfo.taskId = taskId;
2938
+ const debug = this.#page && this.#page.pageInfo && this.#page.pageInfo.taskId < 0;
2939
+ this.#isDebugTask = !!debug;
2844
2940
  }
2845
2941
  if (typeof relatedId === "number") {
2846
2942
  actPageInfo.relatedId = relatedId;
@@ -2883,7 +2979,7 @@ var PuppeteerPage = class extends import_node_events4.default {
2883
2979
  }
2884
2980
  const actOptions = Array.isArray(options) ? options : [options];
2885
2981
  if (actOptions.length <= 0) {
2886
- logwarn("Invalid paras in setRequestInterception");
2982
+ logwarn("##browser LsdPage invalid paras in setRequestInterception");
2887
2983
  return false;
2888
2984
  }
2889
2985
  if (this.#requestInterceptionNum <= 0) {
@@ -2892,11 +2988,18 @@ var PuppeteerPage = class extends import_node_events4.default {
2892
2988
  } else {
2893
2989
  this.#requestInterceptionNum++;
2894
2990
  }
2895
- this.#page.on("request", async (request) => {
2991
+ this.#page.on("request" /* PAGE_REQUEST */, async (request) => {
2896
2992
  try {
2897
2993
  for (const option of actOptions) {
2898
2994
  const { requestMatch, action, fulfill } = option;
2899
2995
  const matchedFlag = !requestMatch || this.#checkRequestMatch(request, requestMatch);
2996
+ if (this.#isDebugTask) {
2997
+ if (matchedFlag) {
2998
+ loginfo(`##browser matched request ${request.method()} ${request.url()}`);
2999
+ } else {
3000
+ logdbg(`##browser unmatched request ${request.method()} ${request.url()}`);
3001
+ }
3002
+ }
2900
3003
  if (matchedFlag) {
2901
3004
  switch (action) {
2902
3005
  case "abort":
@@ -2931,11 +3034,11 @@ var PuppeteerPage = class extends import_node_events4.default {
2931
3034
  }
2932
3035
  const actOptions = Array.isArray(options) ? options : [options];
2933
3036
  if (actOptions.length <= 0) {
2934
- logwarn("Invalid paras in setResponseInterception");
3037
+ logwarn("##browser LsdPage invalid paras in setResponseInterception");
2935
3038
  return false;
2936
3039
  }
2937
3040
  this.#responseInterceptionNum++;
2938
- this.#page.on("response", async (response) => {
3041
+ this.#page.on("response" /* PAGE_RESPONSE */, async (response) => {
2939
3042
  try {
2940
3043
  if (!response.ok() || !this.#page) {
2941
3044
  return false;
@@ -2956,6 +3059,13 @@ var PuppeteerPage = class extends import_node_events4.default {
2956
3059
  matchedFlag = false;
2957
3060
  }
2958
3061
  }
3062
+ if (this.#isDebugTask) {
3063
+ if (matchedFlag) {
3064
+ loginfo(`##browser matched response ${request.method()} ${request.url()}`);
3065
+ } else {
3066
+ logdbg(`##browser unmatched response ${request.method()} ${request.url()}`);
3067
+ }
3068
+ }
2959
3069
  if (!matchedFlag) {
2960
3070
  continue;
2961
3071
  }
@@ -2972,6 +3082,7 @@ var PuppeteerPage = class extends import_node_events4.default {
2972
3082
  requestData,
2973
3083
  responseData
2974
3084
  });
3085
+ loginfo(`##browser cache matched response: ${requestUrl}`);
2975
3086
  }
2976
3087
  if (typeof handler === "function") {
2977
3088
  const pageData = { pageUrl, cookies: "" };
@@ -3037,6 +3148,7 @@ var PuppeteerPage = class extends import_node_events4.default {
3037
3148
  throw new Error(`Page ${this.#pageId} is already busy!!!`);
3038
3149
  }
3039
3150
  this.#status = "busy";
3151
+ logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
3040
3152
  return true;
3041
3153
  }
3042
3154
  async waitForElement(selector, options = {}) {
@@ -3147,14 +3259,13 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
3147
3259
  for (const page of pages) {
3148
3260
  const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, lastStatusUpdateTime, taskId: 0, relatedId: 0, misc: {} };
3149
3261
  const lsdPage = new PuppeteerPage(this, page, pageInfo);
3262
+ this.#lsdPages.push(lsdPage);
3150
3263
  if (this.#maxViewportOfNewPage) {
3151
3264
  await lsdPage.maximizeViewport();
3152
3265
  }
3153
3266
  if (this.#userAgent) {
3154
3267
  await lsdPage.setUserAgent(this.#userAgent);
3155
3268
  }
3156
- this.#lsdPages.push(lsdPage);
3157
- loginfo(`##browser ${lsdPage.id()} ${openType}ed`);
3158
3269
  }
3159
3270
  }
3160
3271
  constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxViewportOfNewPage = true) {
@@ -3183,8 +3294,9 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
3183
3294
  this.#lsdPages = [];
3184
3295
  this.#nextPageIdx = 1;
3185
3296
  this.#gettingPage = false;
3297
+ loginfo(`##browser LsdBrowserContext ${this.id()} is created`);
3186
3298
  this.#initPages();
3187
- browserContext.on("targetcreated", async (p) => {
3299
+ browserContext.on("targetcreated" /* BROWSERCONTEXT_TARGETCREATED */, async (p) => {
3188
3300
  if (p.type() === "page") {
3189
3301
  const page = await p.page();
3190
3302
  if (!page) {
@@ -3198,30 +3310,36 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
3198
3310
  const currentTime2 = (0, import_utils8.getCurrentUnixTime)();
3199
3311
  const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
3200
3312
  const lsdPage = new PuppeteerPage(this, page, pageInfo2);
3201
- if (this.#maxViewportOfNewPage) {
3202
- await lsdPage.maximizeViewport();
3203
- }
3313
+ this.#lsdPages.push(lsdPage);
3204
3314
  if (this.#userAgent) {
3205
3315
  await lsdPage.setUserAgent(this.#userAgent);
3206
3316
  }
3207
- this.#lsdPages.push(lsdPage);
3208
- loginfo(`##page ${lsdPage.id()} created`);
3317
+ if (this.#maxViewportOfNewPage) {
3318
+ await lsdPage.maximizeViewport();
3319
+ }
3209
3320
  }
3210
3321
  }
3211
3322
  });
3212
- this.on("pageClose", (lsdPage) => {
3323
+ browserContext.on("close" /* BROWSERCONTEXT_CLOSE */, (bc) => {
3324
+ logerr(`##browser LsdBrowserContext puppeteer BrowserContext receives close event`);
3325
+ if (browserContext !== bc) {
3326
+ logerr(`##browser LsdBrowserContext different browserContext in browserContext.on("close")`);
3327
+ }
3328
+ this.#lsdBrowser.emit("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, this);
3329
+ });
3330
+ this.on("pageClose" /* PAGE_CLOSE */, (lsdPage) => {
3213
3331
  if (!(lsdPage instanceof PuppeteerPage)) {
3214
- logerr(`Invalid data in LsdBrowserContext.on("pageClose)`);
3332
+ logerr(`##browser LsdBrowserContext invalid data in LsdBrowserContext.on("pageClose)`);
3215
3333
  return;
3216
3334
  }
3217
3335
  const idx = this.#lsdPages.findIndex((p) => p === lsdPage);
3218
3336
  if (idx < 0) {
3219
- logerr(`Invalid lsdPage in LsdBrowserContext.on("pageClose)`);
3337
+ logerr(`##browser LsdBrowserContext invalid lsdPage in LsdBrowserContext.on("pageClose)`);
3220
3338
  return;
3221
3339
  }
3222
3340
  this.#lsdPages.splice(idx, 1);
3223
3341
  if (this.#lsdPages.length === 0) {
3224
- this.#lsdBrowser.emit("browserContextClose", this);
3342
+ this.#lsdBrowser.emit("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, this);
3225
3343
  }
3226
3344
  return;
3227
3345
  });
@@ -3236,7 +3354,7 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
3236
3354
  if (this.#browserContext) {
3237
3355
  this.#status = "closed";
3238
3356
  this.#lastStatusUpdateTime = (0, import_utils8.getCurrentUnixTime)();
3239
- loginfo(`browserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
3357
+ loginfo(`##browser LsdBrowserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
3240
3358
  if (this.#browserContextCreationMethod !== "launch") {
3241
3359
  await this.#browserContext.close();
3242
3360
  }
@@ -3253,12 +3371,12 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
3253
3371
  await (0, import_utils8.sleep)(200);
3254
3372
  }
3255
3373
  }
3256
- logwarn(`Cannot get the gettingLock.`);
3374
+ logwarn(`##browser LsdBrowserContext cannot get the gettingLock.`);
3257
3375
  return false;
3258
3376
  }
3259
3377
  #freeGettingLock() {
3260
3378
  if (!this.#gettingPage) {
3261
- logwarn(`Getting lock is already free now.`);
3379
+ logwarn(`##browser LsdBrowserContext gettingLock is already free now.`);
3262
3380
  }
3263
3381
  this.#gettingPage = false;
3264
3382
  }
@@ -3267,7 +3385,7 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
3267
3385
  maxPageFreeSeconds = this.#maxPageFreeSeconds;
3268
3386
  }
3269
3387
  if (maxPageFreeSeconds <= 0) {
3270
- logwarn(`Please set valid maxPageFreeSeconds to close free pages`);
3388
+ logwarn(`##browser LsdBrowserContext please set valid maxPageFreeSeconds to close free pages`);
3271
3389
  return false;
3272
3390
  }
3273
3391
  const gotLock = await this.#tryToGetGettingLock();
@@ -3366,7 +3484,7 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
3366
3484
  }
3367
3485
  }
3368
3486
  id() {
3369
- return `browserContext-${this.#browserIdx}-${this.#browserContextIdx}`;
3487
+ return `PuppeteerContext-${this.#browserIdx}-${this.#browserContextIdx}`;
3370
3488
  }
3371
3489
  isIncognito() {
3372
3490
  return this.#incognito;
@@ -3400,7 +3518,7 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
3400
3518
  }
3401
3519
  if (localStorageOrigins.length > 0) {
3402
3520
  await origPage.setRequestInterception(true);
3403
- origPage.on("request", (request) => {
3521
+ origPage.on("request" /* PAGE_REQUEST */, (request) => {
3404
3522
  request.respond({
3405
3523
  status: 200,
3406
3524
  // contentType: "text/html; charset=utf-8", // "text/plain",
@@ -3503,28 +3621,27 @@ var PuppeteerBrowser = class _PuppeteerBrowser extends import_node_events6.defau
3503
3621
  this.#executablePath = executablePath;
3504
3622
  this.#nextBrowserContextIdx = 1;
3505
3623
  this.#closeFreePagesIntervalId = null;
3506
- loginfo(`##browser ${this.#browserType} ${this.id()} ${this.#browserCreationMethod}ed by ${this.#browserControllerType}`);
3624
+ loginfo(`##browser LsdBrowser ${this.id()} ${this.#browserCreationMethod}ed}`);
3507
3625
  const browserContexts = browser.browserContexts();
3508
3626
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : false;
3509
3627
  for (const browserContext of browserContexts) {
3510
3628
  const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), this.#userAgent(), maxViewportOfNewPage);
3511
3629
  this.#lsdBrowserContexts.push(lsdBrowserContext);
3512
- loginfo(`##browser ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
3513
3630
  }
3514
- browser.on("disconnected", () => {
3631
+ browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
3515
3632
  loginfo(`##browser ${this.id()} disconnected`);
3516
3633
  if (this.#lsdBrowserContexts.length > 0) {
3517
- logerr(`${this.id()} has browserContexts when disconnected`);
3634
+ logerr(`##browser LsdBrowser ${this.id()} has browserContexts when disconnected`);
3518
3635
  }
3519
3636
  });
3520
- this.on("browserContextClose", (lsdBrowserContext) => {
3637
+ this.on("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, (lsdBrowserContext) => {
3521
3638
  if (!(lsdBrowserContext instanceof PuppeteerBrowserContext)) {
3522
- logerr(`Invalid data in LsdBrowser.on("browserContextClose)`);
3639
+ logerr(`##browser LsdBrowser invalid data in LsdBrowser.on("browserContextClose)`);
3523
3640
  return;
3524
3641
  }
3525
3642
  const idx = this.#lsdBrowserContexts.findIndex((bc) => bc === lsdBrowserContext);
3526
3643
  if (idx < 0) {
3527
- logerr(`Invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
3644
+ logerr(`##browser LsdBrowser invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
3528
3645
  return;
3529
3646
  }
3530
3647
  loginfo(`##browser ${lsdBrowserContext.id()} closed
@@ -3548,7 +3665,7 @@ var PuppeteerBrowser = class _PuppeteerBrowser extends import_node_events6.defau
3548
3665
  }
3549
3666
  async newBrowserContext(options) {
3550
3667
  if (this.#lsdBrowserContexts.length >= this.#maxBrowserContextsPerBrowser()) {
3551
- logwarn(`##browser ${this.id()} can not create more new browserContext`);
3668
+ logwarn(`##browser LsdBrowser ${this.id()} can not create more new browserContext`);
3552
3669
  return null;
3553
3670
  }
3554
3671
  const browserContextOptions = {};
@@ -3561,7 +3678,6 @@ var PuppeteerBrowser = class _PuppeteerBrowser extends import_node_events6.defau
3561
3678
  const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
3562
3679
  const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxViewportOfNewPage);
3563
3680
  this.#lsdBrowserContexts.push(lsdBrowserContext);
3564
- loginfo(`##browser ${lsdBrowserContext.id()} created`);
3565
3681
  return lsdBrowserContext;
3566
3682
  }
3567
3683
  async close() {
@@ -3572,6 +3688,7 @@ var PuppeteerBrowser = class _PuppeteerBrowser extends import_node_events6.defau
3572
3688
  await lsdBrowserContext.close();
3573
3689
  }
3574
3690
  await this.#browser.close();
3691
+ loginfo(`##browser LsdBrowser ${this.id()} is closed`);
3575
3692
  return true;
3576
3693
  }
3577
3694
  browserContexts() {
@@ -3597,7 +3714,7 @@ var PuppeteerBrowser = class _PuppeteerBrowser extends import_node_events6.defau
3597
3714
  return this.#executablePath;
3598
3715
  }
3599
3716
  id() {
3600
- return `browser-${this.#browserIdx}`;
3717
+ return `PuppeteerBrowser-${this.#browserIdx}`;
3601
3718
  }
3602
3719
  isConnected() {
3603
3720
  return this.#browser.connected;
@@ -4326,6 +4443,7 @@ var PatchrightPage = class extends import_node_events8.default {
4326
4443
  #responseInterceptionOptions;
4327
4444
  #client;
4328
4445
  #responseCb;
4446
+ #isDebugTask;
4329
4447
  #hasValidUrl(page) {
4330
4448
  const url = page.url();
4331
4449
  return url.toLowerCase().startsWith("http");
@@ -4341,7 +4459,7 @@ var PatchrightPage = class extends import_node_events8.default {
4341
4459
  const cookieItems = await this.#getCookies(page);
4342
4460
  const domainSet = new Set(cookieItems.map((c) => c.domain));
4343
4461
  if (domainSet.size !== 1) {
4344
- logwarn(`Domains in clearCookies: ${Array.from(domainSet.values())}`);
4462
+ logwarn(`##browser LsdPage domains in clearCookies: ${Array.from(domainSet.values())}`);
4345
4463
  }
4346
4464
  for (const domain of domainSet.values()) {
4347
4465
  await browserContext.clearCookies({ domain });
@@ -4547,15 +4665,15 @@ var PatchrightPage = class extends import_node_events8.default {
4547
4665
  }
4548
4666
  const page = this.#page;
4549
4667
  const pageId = this.#pageId;
4550
- page.on("close", async () => {
4551
- loginfo(`##browser ${pageId} closed`);
4668
+ page.on("close" /* PAGE_CLOSE */, async () => {
4669
+ loginfo(`##browser page ${pageId} closed @LsdPage`);
4552
4670
  if (!page.pageInfo) {
4553
- logerr(`Logic error in page.on("close")`);
4671
+ logerr(`##browser LsdPage logic error in page.on("close")`);
4554
4672
  }
4555
- this.emit("pageClose");
4556
- this.#lsdBrowserContext.emit("pageClose", this);
4673
+ this.emit("pageClose" /* PAGE_CLOSE */);
4674
+ this.#lsdBrowserContext.emit("pageClose" /* PAGE_CLOSE */, this);
4557
4675
  });
4558
- page.on("popup", (p) => {
4676
+ page.on("popup" /* PAGE_POUP */, (p) => {
4559
4677
  if (p) {
4560
4678
  let evtData = null;
4561
4679
  const pageInfo = p.pageInfo;
@@ -4569,12 +4687,12 @@ var PatchrightPage = class extends import_node_events8.default {
4569
4687
  pageInfo.relatedId = page.pageInfo.taskId;
4570
4688
  }
4571
4689
  } else {
4572
- logerr(`##browser ${pageId} has popup without page.pageInfo`);
4690
+ logerr(`##browser page ${pageId} has popup without page.pageInfo @LsdPage`);
4573
4691
  }
4574
- loginfo(`##browser ${pageId} has popup ${popupPageId}`);
4575
- this.emit("pagePopup", evtData);
4692
+ loginfo(`##browser page ${pageId} has popup ${popupPageId} @LsdPage`);
4693
+ this.emit("pagePopup" /* PAGE_POPUP */, evtData);
4576
4694
  } else {
4577
- logerr(`##browser ${pageId} has popup page with null page`);
4695
+ logerr(`##browser page ${pageId} has popup page with null page @LsdPage`);
4578
4696
  }
4579
4697
  });
4580
4698
  }
@@ -4589,12 +4707,14 @@ var PatchrightPage = class extends import_node_events8.default {
4589
4707
  const currentTime = (0, import_utils11.getCurrentUnixTime)();
4590
4708
  const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
4591
4709
  this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId, relatedId, misc };
4592
- this.#pageId = `page-${browserIdx}-${browserContextIdx}-${pageIdx}`;
4710
+ this.#pageId = `PatchrightPage-${browserIdx}-${browserContextIdx}-${pageIdx}`;
4593
4711
  this.#closeWhenFree = false;
4594
4712
  this.#resquestInterceptionOptions = [];
4595
4713
  this.#responseInterceptionOptions = [];
4596
4714
  this.#client = null;
4597
4715
  this.#responseCb = null;
4716
+ this.#isDebugTask = false;
4717
+ loginfo(`##browser LsdPage ${this.#pageId} ${openType}ed`);
4598
4718
  this.#addPageOn();
4599
4719
  }
4600
4720
  async addPreloadScript(scriptOrFunc, arg) {
@@ -4675,7 +4795,7 @@ var PatchrightPage = class extends import_node_events8.default {
4675
4795
  }
4676
4796
  async close() {
4677
4797
  if (this.#status === "closed") {
4678
- logwarn(`Page ${this.#pageId} is already closed.`);
4798
+ logwarn(`##browser LsdPage ${this.#pageId} is already closed.`);
4679
4799
  return true;
4680
4800
  } else if (this.#status === "busy") {
4681
4801
  throw new Error(`Page ${this.#pageId} cannot be closed because it is busy.`);
@@ -4686,6 +4806,7 @@ var PatchrightPage = class extends import_node_events8.default {
4686
4806
  await this.#page.close();
4687
4807
  this.#page = null;
4688
4808
  this.#status = "closed";
4809
+ loginfo(`##browser LsdPage ${this.#pageId} is closed`);
4689
4810
  return true;
4690
4811
  }
4691
4812
  closeWhenFree() {
@@ -4716,7 +4837,10 @@ var PatchrightPage = class extends import_node_events8.default {
4716
4837
  if (!this.#page) {
4717
4838
  throw new Error("No valid page");
4718
4839
  }
4719
- const height = await this.#page.evaluate(() => document.documentElement.scrollHeight);
4840
+ let height = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
4841
+ if (typeof height === "undefined") {
4842
+ height = 0;
4843
+ }
4720
4844
  return height;
4721
4845
  }
4722
4846
  async evaluate(func, args, isolated = true) {
@@ -4766,10 +4890,11 @@ var PatchrightPage = class extends import_node_events8.default {
4766
4890
  return [];
4767
4891
  }
4768
4892
  async free() {
4769
- if (this.#status === "free") {
4770
- logwarn(`Page ${this.#pageId} is already free.`);
4893
+ if (this.#status === "free" && this.pageInfo().openType !== "popup") {
4894
+ logwarn(`##browser LsdPage ${this.#pageId} is already free.`);
4771
4895
  }
4772
4896
  this.#status = "free";
4897
+ logdbg(`##browser LsdPage ${this.#pageId} is freed`);
4773
4898
  await this.clearRequestInterceptions();
4774
4899
  await this.clearResponseInterceptions();
4775
4900
  return true;
@@ -4866,9 +4991,18 @@ var PatchrightPage = class extends import_node_events8.default {
4866
4991
  if (!this.#page) {
4867
4992
  throw new Error("No valid page");
4868
4993
  }
4869
- const bodyHeight = await this.#page.evaluate(() => document.body.scrollHeight);
4870
- const documentHeight = await this.#page.evaluate(() => document.documentElement.scrollHeight);
4871
- const windowHeight = await this.#page.evaluate(() => window.outerHeight);
4994
+ let bodyHeight = await this.#page.evaluate(() => document?.body?.scrollHeight);
4995
+ if (typeof bodyHeight === "undefined") {
4996
+ bodyHeight = 0;
4997
+ }
4998
+ let documentHeight = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
4999
+ if (typeof documentHeight === "undefined") {
5000
+ documentHeight = 0;
5001
+ }
5002
+ let windowHeight = await this.#page.evaluate(() => window.outerHeight);
5003
+ if (typeof windowHeight === "undefined") {
5004
+ windowHeight = 0;
5005
+ }
4872
5006
  const pageHeight = Math.max(bodyHeight, documentHeight, windowHeight);
4873
5007
  return pageHeight;
4874
5008
  }
@@ -4882,8 +5016,14 @@ var PatchrightPage = class extends import_node_events8.default {
4882
5016
  if (!this.#page) {
4883
5017
  throw new Error("No valid page");
4884
5018
  }
4885
- const offsetWidth = await this.#page.evaluate(() => document.documentElement.offsetWidth);
4886
- const windowWidth = await this.#page.evaluate(() => window.outerWidth);
5019
+ let offsetWidth = await this.#page.evaluate(() => document?.documentElement?.offsetWidth);
5020
+ if (typeof offsetWidth === "undefined") {
5021
+ offsetWidth = 0;
5022
+ }
5023
+ let windowWidth = await this.#page.evaluate(() => window.outerWidth);
5024
+ if (typeof windowWidth === "undefined") {
5025
+ windowWidth = 0;
5026
+ }
4887
5027
  const pageWidth = Math.max(offsetWidth, windowWidth);
4888
5028
  return pageWidth;
4889
5029
  }
@@ -4991,6 +5131,8 @@ var PatchrightPage = class extends import_node_events8.default {
4991
5131
  }
4992
5132
  if (typeof taskId === "number") {
4993
5133
  actPageInfo.taskId = taskId;
5134
+ const debug = this.#page && this.#page.pageInfo && this.#page.pageInfo.taskId < 0;
5135
+ this.#isDebugTask = !!debug;
4994
5136
  }
4995
5137
  if (typeof relatedId === "number") {
4996
5138
  actPageInfo.relatedId = relatedId;
@@ -5034,7 +5176,7 @@ var PatchrightPage = class extends import_node_events8.default {
5034
5176
  }
5035
5177
  const actOptions = Array.isArray(options) ? options : [options];
5036
5178
  if (actOptions.length <= 0) {
5037
- logwarn("Invalid paras in setRequestInterception");
5179
+ logwarn("##browser LsdPage invalid paras in setRequestInterception");
5038
5180
  return false;
5039
5181
  }
5040
5182
  const firstRequestInterception = this.#resquestInterceptionOptions.length <= 0;
@@ -5055,6 +5197,13 @@ var PatchrightPage = class extends import_node_events8.default {
5055
5197
  const { requestMatch, action, fulfill } = option;
5056
5198
  const request = route.request();
5057
5199
  const matchedFlag = !requestMatch || this.#checkRequestMatch(request, requestMatch);
5200
+ if (this.#isDebugTask) {
5201
+ if (matchedFlag) {
5202
+ loginfo(`##browser matched request ${request.method()} ${request.url()}`);
5203
+ } else {
5204
+ logdbg(`##browser unmatched request ${request.method()} ${request.url()}`);
5205
+ }
5206
+ }
5058
5207
  if (matchedFlag) {
5059
5208
  switch (action) {
5060
5209
  case "abort":
@@ -5106,6 +5255,13 @@ var PatchrightPage = class extends import_node_events8.default {
5106
5255
  matchedFlag = false;
5107
5256
  }
5108
5257
  }
5258
+ if (this.#isDebugTask) {
5259
+ if (matchedFlag) {
5260
+ loginfo(`##browser matched response ${request.method()} ${request.url()}`);
5261
+ } else {
5262
+ logdbg(`##browser unmatched response ${request.method()} ${request.url()}`);
5263
+ }
5264
+ }
5109
5265
  if (!matchedFlag) {
5110
5266
  continue;
5111
5267
  }
@@ -5141,7 +5297,7 @@ var PatchrightPage = class extends import_node_events8.default {
5141
5297
  }
5142
5298
  const actOptions = Array.isArray(options) ? options : [options];
5143
5299
  if (actOptions.length <= 0) {
5144
- logwarn("Invalid paras in setResponseInterception");
5300
+ logwarn("##browser LsdPage invalid paras in setResponseInterception");
5145
5301
  return false;
5146
5302
  }
5147
5303
  const firstResponseInterception = this.#responseInterceptionOptions.length <= 0;
@@ -5154,7 +5310,7 @@ var PatchrightPage = class extends import_node_events8.default {
5154
5310
  }
5155
5311
  if (firstResponseInterception && this.#responseInterceptionOptions.length > 0) {
5156
5312
  this.#responseCb = this.#responseListener.bind(this);
5157
- this.#page.on("response", this.#responseCb);
5313
+ this.#page.on("response" /* PAGE_RESPONSE */, this.#responseCb);
5158
5314
  }
5159
5315
  return true;
5160
5316
  }
@@ -5202,6 +5358,7 @@ var PatchrightPage = class extends import_node_events8.default {
5202
5358
  throw new Error(`Page ${this.#pageId} is already busy!!!`);
5203
5359
  }
5204
5360
  this.#status = "busy";
5361
+ logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
5205
5362
  return true;
5206
5363
  }
5207
5364
  async waitForElement(selector, options = {}) {
@@ -5340,11 +5497,10 @@ var PatchrightBrowserContext = class extends import_node_events9.default {
5340
5497
  for (const page of pages) {
5341
5498
  const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, lastStatusUpdateTime, taskId: 0, relatedId: 0, misc: {} };
5342
5499
  const lsdPage = new PatchrightPage(this, page, pageInfo);
5500
+ this.#lsdPages.push(lsdPage);
5343
5501
  if (this.#maxViewportOfNewPage) {
5344
5502
  await lsdPage.maximizeViewport();
5345
5503
  }
5346
- this.#lsdPages.push(lsdPage);
5347
- loginfo(`##browser ${lsdPage.id()} ${openType}ed`);
5348
5504
  }
5349
5505
  }
5350
5506
  constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, maxViewportOfNewPage = true) {
@@ -5374,8 +5530,9 @@ var PatchrightBrowserContext = class extends import_node_events9.default {
5374
5530
  this.#lsdPages = [];
5375
5531
  this.#nextPageIdx = 1;
5376
5532
  this.#gettingPage = false;
5533
+ loginfo(`##browser LsdBrowserContext ${this.id()} is created`);
5377
5534
  this.#initPages();
5378
- browserContext.on("page", async (page) => {
5535
+ browserContext.on("page" /* BROWSERCONTEXT_PAGE */, async (page) => {
5379
5536
  const pageInfo = page.pageInfo;
5380
5537
  if (pageInfo) {
5381
5538
  const { browserIdx: browserIdx2, browserContextIdx: browserContextIdx2, pageIdx } = pageInfo;
@@ -5384,27 +5541,26 @@ var PatchrightBrowserContext = class extends import_node_events9.default {
5384
5541
  const currentTime2 = (0, import_utils12.getCurrentUnixTime)();
5385
5542
  const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
5386
5543
  const lsdPage = new PatchrightPage(this, page, pageInfo2);
5544
+ this.#lsdPages.push(lsdPage);
5387
5545
  if (this.#maxViewportOfNewPage) {
5388
5546
  await lsdPage.maximizeViewport();
5389
5547
  }
5390
- this.#lsdPages.push(lsdPage);
5391
- loginfo(`##page ${lsdPage.id()} created`);
5392
5548
  }
5393
5549
  });
5394
- browserContext.on("close", (bc) => {
5550
+ browserContext.on("close" /* BROWSERCONTEXT_CLOSE */, (bc) => {
5395
5551
  if (browserContext !== bc) {
5396
- logerr(`##browser different browserContext in browserContext.on("close")`);
5552
+ logerr(`##browser LsdBrowserContext different browserContext in browserContext.on("close")`);
5397
5553
  }
5398
- this.#lsdBrowser.emit("browserContextClose", this);
5554
+ this.#lsdBrowser.emit("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, this);
5399
5555
  });
5400
- this.on("pageClose", (lsdPage) => {
5556
+ this.on("pageClose" /* PAGE_CLOSE */, (lsdPage) => {
5401
5557
  if (!(lsdPage instanceof PatchrightPage)) {
5402
- logerr(`Invalid data in LsdBrowserContext.on("pageClose)`);
5558
+ logerr(`##browser LsdBrowserContext invalid data in LsdBrowserContext.on("pageClose)`);
5403
5559
  return;
5404
5560
  }
5405
5561
  const idx = this.#lsdPages.findIndex((p) => p === lsdPage);
5406
5562
  if (idx < 0) {
5407
- logerr(`Invalid lsdPage in LsdBrowserContext.on("pageClose)`);
5563
+ logerr(`##browser LsdBrowserContext invalid lsdPage in LsdBrowserContext.on("pageClose)`);
5408
5564
  return;
5409
5565
  }
5410
5566
  this.#lsdPages.splice(idx, 1);
@@ -5421,7 +5577,7 @@ var PatchrightBrowserContext = class extends import_node_events9.default {
5421
5577
  if (this.#browserContext) {
5422
5578
  this.#status = "closed";
5423
5579
  this.#lastStatusUpdateTime = (0, import_utils12.getCurrentUnixTime)();
5424
- loginfo(`browserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
5580
+ loginfo(`##browser LsdBrowserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
5425
5581
  await this.#browserContext.close();
5426
5582
  }
5427
5583
  return true;
@@ -5436,12 +5592,12 @@ var PatchrightBrowserContext = class extends import_node_events9.default {
5436
5592
  await (0, import_utils12.sleep)(200);
5437
5593
  }
5438
5594
  }
5439
- logwarn(`Cannot get the gettingLock.`);
5595
+ logwarn(`##browser LsdBrowserContext cannot get the gettingLock.`);
5440
5596
  return false;
5441
5597
  }
5442
5598
  #freeGettingLock() {
5443
5599
  if (!this.#gettingPage) {
5444
- logwarn(`Getting lock is already free now.`);
5600
+ logwarn(`##browser LsdBrowserContext gettingLock is already free now.`);
5445
5601
  }
5446
5602
  this.#gettingPage = false;
5447
5603
  }
@@ -5450,7 +5606,7 @@ var PatchrightBrowserContext = class extends import_node_events9.default {
5450
5606
  maxPageFreeSeconds = this.#maxPageFreeSeconds;
5451
5607
  }
5452
5608
  if (maxPageFreeSeconds <= 0) {
5453
- logwarn(`Please set valid maxPageFreeSeconds to close free pages`);
5609
+ logwarn(`##browser LsdBrowserContext please set valid maxPageFreeSeconds to close free pages`);
5454
5610
  return false;
5455
5611
  }
5456
5612
  const gotLock = await this.#tryToGetGettingLock();
@@ -5547,7 +5703,7 @@ var PatchrightBrowserContext = class extends import_node_events9.default {
5547
5703
  }
5548
5704
  }
5549
5705
  id() {
5550
- return `browserContext-${this.#browserIdx}-${this.#browserContextIdx}`;
5706
+ return `PatchrightContext-${this.#browserIdx}-${this.#browserContextIdx}`;
5551
5707
  }
5552
5708
  isFree() {
5553
5709
  return this.#status === "free";
@@ -5681,34 +5837,33 @@ var PatchrightBrowser = class _PatchrightBrowser extends import_node_events10.de
5681
5837
  this.#executablePath = executablePath;
5682
5838
  this.#nextBrowserContextIdx = 1;
5683
5839
  this.#closeFreePagesIntervalId = null;
5684
- loginfo(`##browser ${this.id()} ${this.#browserCreationMethod}ed by ${this.#browserControllerType}`);
5840
+ loginfo(`##browser LsdBrowser ${this.id()} ${this.#browserCreationMethod}ed}`);
5685
5841
  const browserContexts = browser.contexts();
5686
5842
  if (browserContexts.length > 0) {
5687
- logwarn(`There are ${browserContexts.length} new browserContexts when playwright launches new browser`);
5843
+ logwarn(`##browser LsdBrowser there are ${browserContexts.length} new browserContexts when playwright launches new browser`);
5688
5844
  }
5689
5845
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
5690
5846
  for (const browserContext of browserContexts) {
5691
5847
  const lsdBrowserContext = new PatchrightBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
5692
5848
  this.#lsdBrowserContexts.push(lsdBrowserContext);
5693
- loginfo(`##browserContext ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
5694
5849
  }
5695
- browser.on("disconnected", () => {
5850
+ browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
5696
5851
  loginfo(`##browser ${this.id()} disconnected`);
5697
5852
  if (this.#lsdBrowserContexts.length > 0) {
5698
- logerr(`${this.id()} has browserContexts when disconnected`);
5853
+ logerr(`##browser LsdBrowser ${this.id()} has browserContexts when disconnected`);
5699
5854
  }
5700
5855
  });
5701
- this.on("browserContextClose", (lsdBrowserContext) => {
5856
+ this.on("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, (lsdBrowserContext) => {
5702
5857
  if (!(lsdBrowserContext instanceof PatchrightBrowserContext)) {
5703
- logerr(`Invalid data in LsdBrowser.on("browserContextClose)`);
5858
+ logerr(`##browser LsdBrowser invalid data in LsdBrowser.on("browserContextClose)`);
5704
5859
  return;
5705
5860
  }
5706
5861
  const idx = this.#lsdBrowserContexts.findIndex((bc) => bc === lsdBrowserContext);
5707
5862
  if (idx < 0) {
5708
- logerr(`Invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
5863
+ logerr(`##browser LsdBrowser invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
5709
5864
  return;
5710
5865
  }
5711
- loginfo(`##browserContext ${lsdBrowserContext.id()} closed
5866
+ loginfo(`##browser ${lsdBrowserContext.id()} closed
5712
5867
  `);
5713
5868
  this.#lsdBrowserContexts.splice(idx, 1);
5714
5869
  if (this.#lsdBrowserContexts.length === 0) {
@@ -5729,7 +5884,7 @@ var PatchrightBrowser = class _PatchrightBrowser extends import_node_events10.de
5729
5884
  }
5730
5885
  async newBrowserContext(options) {
5731
5886
  if (this.#lsdBrowserContexts.length >= this.#maxBrowserContextsPerBrowser()) {
5732
- logwarn(`##browser ${this.id()} can not create more new browserContext`);
5887
+ logwarn(`##browser LsdBrowser ${this.id()} can not create more new browserContext`);
5733
5888
  return null;
5734
5889
  }
5735
5890
  const browserContextOptions = {};
@@ -5748,7 +5903,6 @@ var PatchrightBrowser = class _PatchrightBrowser extends import_node_events10.de
5748
5903
  const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
5749
5904
  const lsdBrowserContext = new PatchrightBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
5750
5905
  this.#lsdBrowserContexts.push(lsdBrowserContext);
5751
- loginfo(`##browser ${lsdBrowserContext.id()} created`);
5752
5906
  return lsdBrowserContext;
5753
5907
  }
5754
5908
  async close() {
@@ -5759,6 +5913,7 @@ var PatchrightBrowser = class _PatchrightBrowser extends import_node_events10.de
5759
5913
  await lsdBrowserContext.close();
5760
5914
  }
5761
5915
  await this.#browser.close();
5916
+ loginfo(`##browser LsdBrowser ${this.id()} is closed`);
5762
5917
  return true;
5763
5918
  }
5764
5919
  browserContexts() {
@@ -5784,7 +5939,7 @@ var PatchrightBrowser = class _PatchrightBrowser extends import_node_events10.de
5784
5939
  return this.#executablePath;
5785
5940
  }
5786
5941
  id() {
5787
- return `browser-${this.#browserType}-${this.#browserIdx}`;
5942
+ return `PatchrightBrowser-${this.#browserType}-${this.#browserIdx}`;
5788
5943
  }
5789
5944
  isConnected() {
5790
5945
  return this.#browser.isConnected();
@@ -6140,6 +6295,7 @@ var CamoufoxPage = class extends import_node_events11.default {
6140
6295
  #responseInterceptionOptions;
6141
6296
  #client;
6142
6297
  #responseCb;
6298
+ #isDebugTask;
6143
6299
  #hasValidUrl(page) {
6144
6300
  const url = page.url();
6145
6301
  return url.toLowerCase().startsWith("http");
@@ -6155,7 +6311,7 @@ var CamoufoxPage = class extends import_node_events11.default {
6155
6311
  const cookieItems = await this.#getCookies(page);
6156
6312
  const domainSet = new Set(cookieItems.map((c) => c.domain));
6157
6313
  if (domainSet.size !== 1) {
6158
- logwarn(`Domains in clearCookies: ${Array.from(domainSet.values())}`);
6314
+ logwarn(`##browser LsdPage domains in clearCookies: ${Array.from(domainSet.values())}`);
6159
6315
  }
6160
6316
  for (const domain of domainSet.values()) {
6161
6317
  await browserContext.clearCookies({ domain });
@@ -6361,15 +6517,15 @@ var CamoufoxPage = class extends import_node_events11.default {
6361
6517
  }
6362
6518
  const page = this.#page;
6363
6519
  const pageId = this.#pageId;
6364
- page.on("close", async () => {
6365
- loginfo(`##browser ${pageId} closed`);
6520
+ page.on("close" /* PAGE_CLOSE */, async () => {
6521
+ loginfo(`##browser page ${pageId} closed @LsdPage`);
6366
6522
  if (!page.pageInfo) {
6367
- logerr(`Logic error in page.on("close")`);
6523
+ logerr(`##browser LsdPage logic error in page.on("close")`);
6368
6524
  }
6369
- this.emit("pageClose");
6370
- this.#lsdBrowserContext.emit("pageClose", this);
6525
+ this.emit("pageClose" /* PAGE_CLOSE */);
6526
+ this.#lsdBrowserContext.emit("pageClose" /* PAGE_CLOSE */, this);
6371
6527
  });
6372
- page.on("popup", (p) => {
6528
+ page.on("popup" /* PAGE_POUP */, (p) => {
6373
6529
  if (p) {
6374
6530
  let evtData = null;
6375
6531
  const pageInfo = p.pageInfo;
@@ -6383,12 +6539,12 @@ var CamoufoxPage = class extends import_node_events11.default {
6383
6539
  pageInfo.relatedId = page.pageInfo.taskId;
6384
6540
  }
6385
6541
  } else {
6386
- logerr(`##browser ${pageId} has popup without page.pageInfo`);
6542
+ logerr(`##browser page ${pageId} has popup without page.pageInfo @LsdPage`);
6387
6543
  }
6388
- loginfo(`##browser ${pageId} has popup ${popupPageId}`);
6389
- this.emit("pagePopup", evtData);
6544
+ loginfo(`##browser page ${pageId} has popup ${popupPageId} @LsdPage`);
6545
+ this.emit("pagePopup" /* PAGE_POPUP */, evtData);
6390
6546
  } else {
6391
- logerr(`##browser ${pageId} has popup page with null page`);
6547
+ logerr(`##browser page ${pageId} has popup page with null page @LsdPage`);
6392
6548
  }
6393
6549
  });
6394
6550
  }
@@ -6403,12 +6559,14 @@ var CamoufoxPage = class extends import_node_events11.default {
6403
6559
  const currentTime = (0, import_utils15.getCurrentUnixTime)();
6404
6560
  const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
6405
6561
  this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId, relatedId, misc };
6406
- this.#pageId = `page-${browserIdx}-${browserContextIdx}-${pageIdx}`;
6562
+ this.#pageId = `CamoufoxPage-${browserIdx}-${browserContextIdx}-${pageIdx}`;
6407
6563
  this.#closeWhenFree = false;
6408
6564
  this.#resquestInterceptionOptions = [];
6409
6565
  this.#responseInterceptionOptions = [];
6410
6566
  this.#client = null;
6411
6567
  this.#responseCb = null;
6568
+ this.#isDebugTask = false;
6569
+ loginfo(`##browser LsdPage ${this.#pageId} ${openType}ed`);
6412
6570
  this.#addPageOn();
6413
6571
  }
6414
6572
  async addPreloadScript() {
@@ -6476,7 +6634,7 @@ var CamoufoxPage = class extends import_node_events11.default {
6476
6634
  }
6477
6635
  async close() {
6478
6636
  if (this.#status === "closed") {
6479
- logwarn(`Page ${this.#pageId} is already closed.`);
6637
+ logwarn(`##browser LsdPage ${this.#pageId} is already closed.`);
6480
6638
  return true;
6481
6639
  } else if (this.#status === "busy") {
6482
6640
  throw new Error(`Page ${this.#pageId} cannot be closed because it is busy.`);
@@ -6487,6 +6645,7 @@ var CamoufoxPage = class extends import_node_events11.default {
6487
6645
  await this.#page.close();
6488
6646
  this.#page = null;
6489
6647
  this.#status = "closed";
6648
+ loginfo(`##browser LsdPage ${this.#pageId} is closed`);
6490
6649
  return true;
6491
6650
  }
6492
6651
  closeWhenFree() {
@@ -6517,7 +6676,10 @@ var CamoufoxPage = class extends import_node_events11.default {
6517
6676
  if (!this.#page) {
6518
6677
  throw new Error("No valid page");
6519
6678
  }
6520
- const height = await this.#page.evaluate(() => document.documentElement.scrollHeight);
6679
+ let height = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
6680
+ if (typeof height === "undefined") {
6681
+ height = 0;
6682
+ }
6521
6683
  return height;
6522
6684
  }
6523
6685
  async evaluate(func, args, isolated = true) {
@@ -6568,10 +6730,11 @@ var CamoufoxPage = class extends import_node_events11.default {
6568
6730
  return [];
6569
6731
  }
6570
6732
  async free() {
6571
- if (this.#status === "free") {
6572
- logwarn(`Page ${this.#pageId} is already free.`);
6733
+ if (this.#status === "free" && this.pageInfo().openType !== "popup") {
6734
+ logwarn(`##browser LsdPage ${this.#pageId} is already free.`);
6573
6735
  }
6574
6736
  this.#status = "free";
6737
+ logdbg(`##browser LsdPage ${this.#pageId} is freed`);
6575
6738
  await this.clearRequestInterceptions();
6576
6739
  await this.clearResponseInterceptions();
6577
6740
  return true;
@@ -6668,9 +6831,18 @@ var CamoufoxPage = class extends import_node_events11.default {
6668
6831
  if (!this.#page) {
6669
6832
  throw new Error("No valid page");
6670
6833
  }
6671
- const bodyHeight = await this.#page.evaluate(() => document.body.scrollHeight);
6672
- const documentHeight = await this.#page.evaluate(() => document.documentElement.scrollHeight);
6673
- const windowHeight = await this.#page.evaluate(() => window.outerHeight);
6834
+ let bodyHeight = await this.#page.evaluate(() => document?.body?.scrollHeight);
6835
+ if (typeof bodyHeight === "undefined") {
6836
+ bodyHeight = 0;
6837
+ }
6838
+ let documentHeight = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
6839
+ if (typeof documentHeight === "undefined") {
6840
+ documentHeight = 0;
6841
+ }
6842
+ let windowHeight = await this.#page.evaluate(() => window.outerHeight);
6843
+ if (typeof windowHeight === "undefined") {
6844
+ windowHeight = 0;
6845
+ }
6674
6846
  const pageHeight = Math.max(bodyHeight, documentHeight, windowHeight);
6675
6847
  return pageHeight;
6676
6848
  }
@@ -6684,8 +6856,14 @@ var CamoufoxPage = class extends import_node_events11.default {
6684
6856
  if (!this.#page) {
6685
6857
  throw new Error("No valid page");
6686
6858
  }
6687
- const offsetWidth = await this.#page.evaluate(() => document.documentElement.offsetWidth);
6688
- const windowWidth = await this.#page.evaluate(() => window.outerWidth);
6859
+ let offsetWidth = await this.#page.evaluate(() => document?.documentElement?.offsetWidth);
6860
+ if (typeof offsetWidth === "undefined") {
6861
+ offsetWidth = 0;
6862
+ }
6863
+ let windowWidth = await this.#page.evaluate(() => window.outerWidth);
6864
+ if (typeof windowWidth === "undefined") {
6865
+ windowWidth = 0;
6866
+ }
6689
6867
  const pageWidth = Math.max(offsetWidth, windowWidth);
6690
6868
  return pageWidth;
6691
6869
  }
@@ -6793,6 +6971,8 @@ var CamoufoxPage = class extends import_node_events11.default {
6793
6971
  }
6794
6972
  if (typeof taskId === "number") {
6795
6973
  actPageInfo.taskId = taskId;
6974
+ const debug = this.#page && this.#page.pageInfo && this.#page.pageInfo.taskId < 0;
6975
+ this.#isDebugTask = !!debug;
6796
6976
  }
6797
6977
  if (typeof relatedId === "number") {
6798
6978
  actPageInfo.relatedId = relatedId;
@@ -6836,7 +7016,7 @@ var CamoufoxPage = class extends import_node_events11.default {
6836
7016
  }
6837
7017
  const actOptions = Array.isArray(options) ? options : [options];
6838
7018
  if (actOptions.length <= 0) {
6839
- logwarn("Invalid paras in setRequestInterception");
7019
+ logwarn("##browser LsdPage invalid paras in setRequestInterception");
6840
7020
  return false;
6841
7021
  }
6842
7022
  const firstRequestInterception = this.#resquestInterceptionOptions.length <= 0;
@@ -6857,6 +7037,13 @@ var CamoufoxPage = class extends import_node_events11.default {
6857
7037
  const { requestMatch, action, fulfill } = option;
6858
7038
  const request = route.request();
6859
7039
  const matchedFlag = !requestMatch || this.#checkRequestMatch(request, requestMatch);
7040
+ if (this.#isDebugTask) {
7041
+ if (matchedFlag) {
7042
+ loginfo(`##browser matched request ${request.method()} ${request.url()}`);
7043
+ } else {
7044
+ logdbg(`##browser unmatched request ${request.method()} ${request.url()}`);
7045
+ }
7046
+ }
6860
7047
  if (matchedFlag) {
6861
7048
  switch (action) {
6862
7049
  case "abort":
@@ -6908,6 +7095,13 @@ var CamoufoxPage = class extends import_node_events11.default {
6908
7095
  matchedFlag = false;
6909
7096
  }
6910
7097
  }
7098
+ if (this.#isDebugTask) {
7099
+ if (matchedFlag) {
7100
+ loginfo(`##browser matched response ${request.method()} ${request.url()}`);
7101
+ } else {
7102
+ logdbg(`##browser unmatched response ${request.method()} ${request.url()}`);
7103
+ }
7104
+ }
6911
7105
  if (!matchedFlag) {
6912
7106
  continue;
6913
7107
  }
@@ -6943,7 +7137,7 @@ var CamoufoxPage = class extends import_node_events11.default {
6943
7137
  }
6944
7138
  const actOptions = Array.isArray(options) ? options : [options];
6945
7139
  if (actOptions.length <= 0) {
6946
- logwarn("Invalid paras in setResponseInterception");
7140
+ logwarn("##browser LsdPage invalid paras in setResponseInterception");
6947
7141
  return false;
6948
7142
  }
6949
7143
  const firstResponseInterception = this.#responseInterceptionOptions.length <= 0;
@@ -6956,7 +7150,7 @@ var CamoufoxPage = class extends import_node_events11.default {
6956
7150
  }
6957
7151
  if (firstResponseInterception && this.#responseInterceptionOptions.length > 0) {
6958
7152
  this.#responseCb = this.#responseListener.bind(this);
6959
- this.#page.on("response", this.#responseCb);
7153
+ this.#page.on("response" /* PAGE_RESPONSE */, this.#responseCb);
6960
7154
  }
6961
7155
  return true;
6962
7156
  }
@@ -7004,6 +7198,7 @@ var CamoufoxPage = class extends import_node_events11.default {
7004
7198
  throw new Error(`Page ${this.#pageId} is already busy!!!`);
7005
7199
  }
7006
7200
  this.#status = "busy";
7201
+ logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
7007
7202
  return true;
7008
7203
  }
7009
7204
  async waitForElement(selector, options = {}) {
@@ -7142,11 +7337,10 @@ var CamoufoxBrowserContext = class extends import_node_events12.default {
7142
7337
  for (const page of pages) {
7143
7338
  const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, lastStatusUpdateTime, taskId: 0, relatedId: 0, misc: {} };
7144
7339
  const lsdPage = new CamoufoxPage(this, page, pageInfo);
7340
+ this.#lsdPages.push(lsdPage);
7145
7341
  if (this.#maxViewportOfNewPage) {
7146
7342
  await lsdPage.maximizeViewport();
7147
7343
  }
7148
- this.#lsdPages.push(lsdPage);
7149
- loginfo(`##browser ${lsdPage.id()} ${openType}ed`);
7150
7344
  }
7151
7345
  }
7152
7346
  constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, maxViewportOfNewPage = true) {
@@ -7176,8 +7370,9 @@ var CamoufoxBrowserContext = class extends import_node_events12.default {
7176
7370
  this.#lsdPages = [];
7177
7371
  this.#nextPageIdx = 1;
7178
7372
  this.#gettingPage = false;
7373
+ loginfo(`##browser LsdBrowserContext ${this.id()} is created`);
7179
7374
  this.#initPages();
7180
- browserContext.on("page", async (page) => {
7375
+ browserContext.on("page" /* BROWSERCONTEXT_PAGE */, async (page) => {
7181
7376
  const pageInfo = page.pageInfo;
7182
7377
  if (pageInfo) {
7183
7378
  const { browserIdx: browserIdx2, browserContextIdx: browserContextIdx2, pageIdx } = pageInfo;
@@ -7186,27 +7381,26 @@ var CamoufoxBrowserContext = class extends import_node_events12.default {
7186
7381
  const currentTime2 = (0, import_utils16.getCurrentUnixTime)();
7187
7382
  const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
7188
7383
  const lsdPage = new CamoufoxPage(this, page, pageInfo2);
7384
+ this.#lsdPages.push(lsdPage);
7189
7385
  if (this.#maxViewportOfNewPage) {
7190
7386
  await lsdPage.maximizeViewport();
7191
7387
  }
7192
- this.#lsdPages.push(lsdPage);
7193
- loginfo(`##page ${lsdPage.id()} created`);
7194
7388
  }
7195
7389
  });
7196
- browserContext.on("close", (bc) => {
7390
+ browserContext.on("close" /* BROWSERCONTEXT_CLOSE */, (bc) => {
7197
7391
  if (browserContext !== bc) {
7198
- logerr(`##browser different browserContext in browserContext.on("close")`);
7392
+ logerr(`##browser LsdBrowserContext different browserContext in browserContext.on("close")`);
7199
7393
  }
7200
- this.#lsdBrowser.emit("browserContextClose", this);
7394
+ this.#lsdBrowser.emit("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, this);
7201
7395
  });
7202
- this.on("pageClose", (lsdPage) => {
7396
+ this.on("pageClose" /* PAGE_CLOSE */, (lsdPage) => {
7203
7397
  if (!(lsdPage instanceof CamoufoxPage)) {
7204
- logerr(`Invalid data in LsdBrowserContext.on("pageClose)`);
7398
+ logerr(`##browser LsdBrowserContext invalid data in LsdBrowserContext.on("pageClose)`);
7205
7399
  return;
7206
7400
  }
7207
7401
  const idx = this.#lsdPages.findIndex((p) => p === lsdPage);
7208
7402
  if (idx < 0) {
7209
- logerr(`Invalid lsdPage in LsdBrowserContext.on("pageClose)`);
7403
+ logerr(`##browser LsdBrowserContext invalid lsdPage in LsdBrowserContext.on("pageClose)`);
7210
7404
  return;
7211
7405
  }
7212
7406
  this.#lsdPages.splice(idx, 1);
@@ -7223,7 +7417,7 @@ var CamoufoxBrowserContext = class extends import_node_events12.default {
7223
7417
  if (this.#browserContext) {
7224
7418
  this.#status = "closed";
7225
7419
  this.#lastStatusUpdateTime = (0, import_utils16.getCurrentUnixTime)();
7226
- loginfo(`browserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
7420
+ loginfo(`##browser LsdBrowserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
7227
7421
  await this.#browserContext.close();
7228
7422
  }
7229
7423
  return true;
@@ -7238,12 +7432,12 @@ var CamoufoxBrowserContext = class extends import_node_events12.default {
7238
7432
  await (0, import_utils16.sleep)(200);
7239
7433
  }
7240
7434
  }
7241
- logwarn(`Cannot get the gettingLock.`);
7435
+ logwarn(`##browser LsdBrowserContext cannot get the gettingLock.`);
7242
7436
  return false;
7243
7437
  }
7244
7438
  #freeGettingLock() {
7245
7439
  if (!this.#gettingPage) {
7246
- logwarn(`Getting lock is already free now.`);
7440
+ logwarn(`##browser LsdBrowserContext gettingLock is already free now.`);
7247
7441
  }
7248
7442
  this.#gettingPage = false;
7249
7443
  }
@@ -7252,7 +7446,7 @@ var CamoufoxBrowserContext = class extends import_node_events12.default {
7252
7446
  maxPageFreeSeconds = this.#maxPageFreeSeconds;
7253
7447
  }
7254
7448
  if (maxPageFreeSeconds <= 0) {
7255
- logwarn(`Please set valid maxPageFreeSeconds to close free pages`);
7449
+ logwarn(`##browser LsdBrowserContext please set valid maxPageFreeSeconds to close free pages`);
7256
7450
  return false;
7257
7451
  }
7258
7452
  const gotLock = await this.#tryToGetGettingLock();
@@ -7349,7 +7543,7 @@ var CamoufoxBrowserContext = class extends import_node_events12.default {
7349
7543
  }
7350
7544
  }
7351
7545
  id() {
7352
- return `browserContext-${this.#browserIdx}-${this.#browserContextIdx}`;
7546
+ return `CamoufoxContext-${this.#browserIdx}-${this.#browserContextIdx}`;
7353
7547
  }
7354
7548
  isFree() {
7355
7549
  return this.#status === "free";
@@ -7483,34 +7677,33 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends import_node_events13.defaul
7483
7677
  this.#executablePath = executablePath;
7484
7678
  this.#nextBrowserContextIdx = 1;
7485
7679
  this.#closeFreePagesIntervalId = null;
7486
- loginfo(`##browser ${this.id()} ${this.#browserCreationMethod}ed by ${this.#browserControllerType}`);
7680
+ loginfo(`##browser LsdBrowser ${this.id()} ${this.#browserCreationMethod}ed}`);
7487
7681
  const browserContexts = browser.contexts();
7488
7682
  if (browserContexts.length > 0) {
7489
- logwarn(`There are ${browserContexts.length} new browserContexts when camoufox launches new browser`);
7683
+ logwarn(`##browser LsdBrowser there are ${browserContexts.length} new browserContexts when camoufox launches new browser`);
7490
7684
  }
7491
7685
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
7492
7686
  for (const browserContext of browserContexts) {
7493
7687
  const lsdBrowserContext = new CamoufoxBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
7494
7688
  this.#lsdBrowserContexts.push(lsdBrowserContext);
7495
- loginfo(`##browserContext ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
7496
7689
  }
7497
- browser.on("disconnected", () => {
7690
+ browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
7498
7691
  loginfo(`##browser ${this.id()} disconnected`);
7499
7692
  if (this.#lsdBrowserContexts.length > 0) {
7500
- logerr(`${this.id()} has browserContexts when disconnected`);
7693
+ logerr(`##browser LsdBrowser ${this.id()} has browserContexts when disconnected`);
7501
7694
  }
7502
7695
  });
7503
- this.on("browserContextClose", (lsdBrowserContext) => {
7696
+ this.on("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, (lsdBrowserContext) => {
7504
7697
  if (!(lsdBrowserContext instanceof CamoufoxBrowserContext)) {
7505
- logerr(`Invalid data in LsdBrowser.on("browserContextClose)`);
7698
+ logerr(`##browser LsdBrowser invalid data in LsdBrowser.on("browserContextClose)`);
7506
7699
  return;
7507
7700
  }
7508
7701
  const idx = this.#lsdBrowserContexts.findIndex((bc) => bc === lsdBrowserContext);
7509
7702
  if (idx < 0) {
7510
- logerr(`Invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
7703
+ logerr(`##browser LsdBrowser invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
7511
7704
  return;
7512
7705
  }
7513
- loginfo(`##browserContext ${lsdBrowserContext.id()} closed
7706
+ loginfo(`##browser ${lsdBrowserContext.id()} closed
7514
7707
  `);
7515
7708
  this.#lsdBrowserContexts.splice(idx, 1);
7516
7709
  if (this.#lsdBrowserContexts.length === 0) {
@@ -7531,7 +7724,7 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends import_node_events13.defaul
7531
7724
  }
7532
7725
  async newBrowserContext(options) {
7533
7726
  if (this.#lsdBrowserContexts.length >= this.#maxBrowserContextsPerBrowser()) {
7534
- logwarn(`##browser ${this.id()} can not create more new browserContext`);
7727
+ logwarn(`##browser LsdBrowser ${this.id()} can not create more new browserContext`);
7535
7728
  return null;
7536
7729
  }
7537
7730
  const browserContextOptions = {};
@@ -7550,7 +7743,6 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends import_node_events13.defaul
7550
7743
  const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
7551
7744
  const lsdBrowserContext = new CamoufoxBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
7552
7745
  this.#lsdBrowserContexts.push(lsdBrowserContext);
7553
- loginfo(`##browser ${lsdBrowserContext.id()} created`);
7554
7746
  return lsdBrowserContext;
7555
7747
  }
7556
7748
  async close() {
@@ -7561,6 +7753,7 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends import_node_events13.defaul
7561
7753
  await lsdBrowserContext.close();
7562
7754
  }
7563
7755
  await this.#browser.close();
7756
+ loginfo(`##browser LsdBrowser ${this.id()} is closed`);
7564
7757
  return true;
7565
7758
  }
7566
7759
  browserContexts() {
@@ -7586,7 +7779,7 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends import_node_events13.defaul
7586
7779
  return this.#executablePath;
7587
7780
  }
7588
7781
  id() {
7589
- return `browser-${this.#browserType}-${this.#browserIdx}`;
7782
+ return `CamoufoxBrowser-${this.#browserType}-${this.#browserIdx}`;
7590
7783
  }
7591
7784
  isConnected() {
7592
7785
  return this.#browser.isConnected();
@@ -7748,22 +7941,22 @@ var LsdBrowserController = class _LsdBrowserController {
7748
7941
  const actOptions = { closeFreePagesIntervalSeconds, maxBrowserContextsPerBrowser, maxPagesPerBrowserContext, maxPageFreeSeconds, maxViewportOfNewPage, proxy, timeout, args, executablePath, maxWindowSize, headless, minBrowserContexts, incognito, proxyPerBrowserContext, userDataDir, userAgent };
7749
7942
  let idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--incoginto"));
7750
7943
  if (idx >= 0) {
7751
- logwarn(`Please use options.incognito instead when launching new browser.`);
7944
+ logwarn(`##browser controller Please use options.incognito instead when launching new browser.`);
7752
7945
  args.splice(idx, 1);
7753
7946
  }
7754
7947
  idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--proxy-server"));
7755
7948
  if (idx >= 0) {
7756
- logwarn(`Please use options.proxy instead when launching new browser.`);
7949
+ logwarn(`##browser controller Please use options.proxy instead when launching new browser.`);
7757
7950
  args.splice(idx, 1);
7758
7951
  }
7759
7952
  idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--user-data-dir"));
7760
7953
  if (idx >= 0) {
7761
- logwarn(`Please use options.userDataDir instead when launching new browser.`);
7954
+ logwarn(`##browser controller Please use options.userDataDir instead when launching new browser.`);
7762
7955
  args.splice(idx, 1);
7763
7956
  }
7764
7957
  idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--start-maximized"));
7765
7958
  if (idx >= 0) {
7766
- logwarn(`Please use options.maxWindowSize instead when launching new browser.`);
7959
+ logwarn(`##browser controller Please use options.maxWindowSize instead when launching new browser.`);
7767
7960
  args.splice(idx, 1);
7768
7961
  }
7769
7962
  let lsdBrowser;
@@ -7961,7 +8154,7 @@ var LsdBrowserController = class _LsdBrowserController {
7961
8154
  const pids = await (0, import_utils18.getPidsListeningOnPort)(port);
7962
8155
  let browserPid = 0;
7963
8156
  if (pids.length !== 1) {
7964
- logerr(`##browser pids.length ${pids.length} is not 1 when trying to connect to browserUrl ${browserUrl}`);
8157
+ logerr(`##browser controller pids.length ${pids.length} is not 1 when trying to connect to browserUrl ${browserUrl}`);
7965
8158
  } else {
7966
8159
  browserPid = pids[0];
7967
8160
  }
@@ -8006,6 +8199,10 @@ var controller = new LsdBrowserController();
8006
8199
  0 && (module.exports = {
8007
8200
  CheerioElement,
8008
8201
  CheerioPage,
8202
+ ControllerEvent,
8203
+ LsdBrowserContextEvent,
8204
+ LsdBrowserEvent,
8205
+ LsdPageEvent,
8009
8206
  PlaywrightBrowser,
8010
8207
  PlaywrightBrowserContext,
8011
8208
  PlaywrightElement,