@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.js CHANGED
@@ -1,3 +1,29 @@
1
+ // src/types/types.ts
2
+ var ControllerEvent = /* @__PURE__ */ ((ControllerEvent2) => {
3
+ ControllerEvent2["BROWSERCONTEXT_CLOSE"] = "close";
4
+ ControllerEvent2["BROWSERCONTEXT_PAGE"] = "page";
5
+ ControllerEvent2["BROWSERCONTEXT_TARGETCREATED"] = "targetcreated";
6
+ ControllerEvent2["BROWSER_DISCONNECTED"] = "disconnected";
7
+ ControllerEvent2["PAGE_CLOSE"] = "close";
8
+ ControllerEvent2["PAGE_POUP"] = "popup";
9
+ ControllerEvent2["PAGE_REQUEST"] = "request";
10
+ ControllerEvent2["PAGE_RESPONSE"] = "response";
11
+ return ControllerEvent2;
12
+ })(ControllerEvent || {});
13
+ var LsdPageEvent = /* @__PURE__ */ ((LsdPageEvent2) => {
14
+ LsdPageEvent2["PAGE_CLOSE"] = "pageClose";
15
+ LsdPageEvent2["PAGE_POPUP"] = "pagePopup";
16
+ return LsdPageEvent2;
17
+ })(LsdPageEvent || {});
18
+ var LsdBrowserContextEvent = /* @__PURE__ */ ((LsdBrowserContextEvent2) => {
19
+ LsdBrowserContextEvent2["PAGE_CLOSE"] = "pageClose";
20
+ return LsdBrowserContextEvent2;
21
+ })(LsdBrowserContextEvent || {});
22
+ var LsdBrowserEvent = /* @__PURE__ */ ((LsdBrowserEvent2) => {
23
+ LsdBrowserEvent2["BROWSER_CONTEXT_CLOSE"] = "browserContextClose";
24
+ return LsdBrowserEvent2;
25
+ })(LsdBrowserEvent || {});
26
+
1
27
  // src/utils/log.ts
2
28
  import { log, LogLevel } from "@letsscrapedata/utils";
3
29
  var pkgLog = log;
@@ -9,6 +35,9 @@ function setControllerLogFun(logFun) {
9
35
  return false;
10
36
  }
11
37
  }
38
+ async function logdbg(...args) {
39
+ await pkgLog(LogLevel.DBG, ...args);
40
+ }
12
41
  async function loginfo(...args) {
13
42
  await pkgLog(LogLevel.INF, ...args);
14
43
  }
@@ -356,6 +385,7 @@ var PlaywrightPage = class extends EventEmitter {
356
385
  #responseInterceptionOptions;
357
386
  #client;
358
387
  #responseCb;
388
+ #isDebugTask;
359
389
  #hasValidUrl(page) {
360
390
  const url = page.url();
361
391
  return url.toLowerCase().startsWith("http");
@@ -371,7 +401,7 @@ var PlaywrightPage = class extends EventEmitter {
371
401
  const cookieItems = await this.#getCookies(page);
372
402
  const domainSet = new Set(cookieItems.map((c) => c.domain));
373
403
  if (domainSet.size !== 1) {
374
- logwarn(`Domains in clearCookies: ${Array.from(domainSet.values())}`);
404
+ logwarn(`##browser LsdPage domains in clearCookies: ${Array.from(domainSet.values())}`);
375
405
  }
376
406
  for (const domain of domainSet.values()) {
377
407
  await browserContext.clearCookies({ domain });
@@ -577,15 +607,15 @@ var PlaywrightPage = class extends EventEmitter {
577
607
  }
578
608
  const page = this.#page;
579
609
  const pageId = this.#pageId;
580
- page.on("close", async () => {
581
- loginfo(`##browser ${pageId} closed`);
610
+ page.on("close" /* PAGE_CLOSE */, async () => {
611
+ loginfo(`##browser page ${pageId} closed @LsdPage`);
582
612
  if (!page.pageInfo) {
583
- logerr(`Logic error in page.on("close")`);
613
+ logerr(`##browser LsdPage logic error in page.on("close")`);
584
614
  }
585
- this.emit("pageClose");
586
- this.#lsdBrowserContext.emit("pageClose", this);
615
+ this.emit("pageClose" /* PAGE_CLOSE */);
616
+ this.#lsdBrowserContext.emit("pageClose" /* PAGE_CLOSE */, this);
587
617
  });
588
- page.on("popup", (p) => {
618
+ page.on("popup" /* PAGE_POUP */, (p) => {
589
619
  if (p) {
590
620
  let evtData = null;
591
621
  const pageInfo = p.pageInfo;
@@ -599,12 +629,12 @@ var PlaywrightPage = class extends EventEmitter {
599
629
  pageInfo.relatedId = page.pageInfo.taskId;
600
630
  }
601
631
  } else {
602
- logerr(`##browser ${pageId} has popup without page.pageInfo`);
632
+ logerr(`##browser page ${pageId} has popup without page.pageInfo @LsdPage`);
603
633
  }
604
- loginfo(`##browser ${pageId} has popup ${popupPageId}`);
605
- this.emit("pagePopup", evtData);
634
+ loginfo(`##browser page ${pageId} has popup ${popupPageId} @LsdPage`);
635
+ this.emit("pagePopup" /* PAGE_POPUP */, evtData);
606
636
  } else {
607
- logerr(`##browser ${pageId} has popup page with null page`);
637
+ logerr(`##browser page ${pageId} has popup page with null page @LsdPage`);
608
638
  }
609
639
  });
610
640
  }
@@ -619,12 +649,14 @@ var PlaywrightPage = class extends EventEmitter {
619
649
  const currentTime = getCurrentUnixTime();
620
650
  const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
621
651
  this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId, relatedId, misc };
622
- this.#pageId = `page-${browserIdx}-${browserContextIdx}-${pageIdx}`;
652
+ this.#pageId = `PlaywrightPage-${browserIdx}-${browserContextIdx}-${pageIdx}`;
623
653
  this.#closeWhenFree = false;
624
654
  this.#resquestInterceptionOptions = [];
625
655
  this.#responseInterceptionOptions = [];
626
656
  this.#client = null;
627
657
  this.#responseCb = null;
658
+ this.#isDebugTask = false;
659
+ loginfo(`##browser LsdPage ${this.#pageId} ${openType}ed`);
628
660
  this.#addPageOn();
629
661
  }
630
662
  async addPreloadScript(scriptOrFunc, arg) {
@@ -705,7 +737,7 @@ var PlaywrightPage = class extends EventEmitter {
705
737
  }
706
738
  async close() {
707
739
  if (this.#status === "closed") {
708
- logwarn(`Page ${this.#pageId} is already closed.`);
740
+ logwarn(`##browser LsdPage ${this.#pageId} is already closed.`);
709
741
  return true;
710
742
  } else if (this.#status === "busy") {
711
743
  throw new Error(`Page ${this.#pageId} cannot be closed because it is busy.`);
@@ -716,6 +748,7 @@ var PlaywrightPage = class extends EventEmitter {
716
748
  await this.#page.close();
717
749
  this.#page = null;
718
750
  this.#status = "closed";
751
+ loginfo(`##browser LsdPage ${this.#pageId} is closed`);
719
752
  return true;
720
753
  }
721
754
  closeWhenFree() {
@@ -746,7 +779,10 @@ var PlaywrightPage = class extends EventEmitter {
746
779
  if (!this.#page) {
747
780
  throw new Error("No valid page");
748
781
  }
749
- const height = await this.#page.evaluate(() => document.documentElement.scrollHeight);
782
+ let height = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
783
+ if (typeof height === "undefined") {
784
+ height = 0;
785
+ }
750
786
  return height;
751
787
  }
752
788
  async evaluate(func, args) {
@@ -797,10 +833,11 @@ var PlaywrightPage = class extends EventEmitter {
797
833
  return [];
798
834
  }
799
835
  async free() {
800
- if (this.#status === "free") {
801
- logwarn(`Page ${this.#pageId} is already free.`);
836
+ if (this.#status === "free" && this.pageInfo().openType !== "popup") {
837
+ logwarn(`##browser LsdPage ${this.#pageId} is already free.`);
802
838
  }
803
839
  this.#status = "free";
840
+ logdbg(`##browser LsdPage ${this.#pageId} is freed`);
804
841
  await this.clearRequestInterceptions();
805
842
  await this.clearResponseInterceptions();
806
843
  return true;
@@ -897,9 +934,18 @@ var PlaywrightPage = class extends EventEmitter {
897
934
  if (!this.#page) {
898
935
  throw new Error("No valid page");
899
936
  }
900
- const bodyHeight = await this.#page.evaluate(() => document.body.scrollHeight);
901
- const documentHeight = await this.#page.evaluate(() => document.documentElement.scrollHeight);
902
- const windowHeight = await this.#page.evaluate(() => window.outerHeight);
937
+ let bodyHeight = await this.#page.evaluate(() => document?.body?.scrollHeight);
938
+ if (typeof bodyHeight === "undefined") {
939
+ bodyHeight = 0;
940
+ }
941
+ let documentHeight = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
942
+ if (typeof documentHeight === "undefined") {
943
+ documentHeight = 0;
944
+ }
945
+ let windowHeight = await this.#page.evaluate(() => window.outerHeight);
946
+ if (typeof windowHeight === "undefined") {
947
+ windowHeight = 0;
948
+ }
903
949
  const pageHeight = Math.max(bodyHeight, documentHeight, windowHeight);
904
950
  return pageHeight;
905
951
  }
@@ -913,8 +959,14 @@ var PlaywrightPage = class extends EventEmitter {
913
959
  if (!this.#page) {
914
960
  throw new Error("No valid page");
915
961
  }
916
- const offsetWidth = await this.#page.evaluate(() => document.documentElement.offsetWidth);
917
- const windowWidth = await this.#page.evaluate(() => window.outerWidth);
962
+ let offsetWidth = await this.#page.evaluate(() => document?.documentElement?.offsetWidth);
963
+ if (typeof offsetWidth === "undefined") {
964
+ offsetWidth = 0;
965
+ }
966
+ let windowWidth = await this.#page.evaluate(() => window.outerWidth);
967
+ if (typeof windowWidth === "undefined") {
968
+ windowWidth = 0;
969
+ }
918
970
  const pageWidth = Math.max(offsetWidth, windowWidth);
919
971
  return pageWidth;
920
972
  }
@@ -1022,6 +1074,8 @@ var PlaywrightPage = class extends EventEmitter {
1022
1074
  }
1023
1075
  if (typeof taskId === "number") {
1024
1076
  actPageInfo.taskId = taskId;
1077
+ const debug = this.#page && this.#page.pageInfo && this.#page.pageInfo.taskId < 0;
1078
+ this.#isDebugTask = !!debug;
1025
1079
  }
1026
1080
  if (typeof relatedId === "number") {
1027
1081
  actPageInfo.relatedId = relatedId;
@@ -1065,7 +1119,7 @@ var PlaywrightPage = class extends EventEmitter {
1065
1119
  }
1066
1120
  const actOptions = Array.isArray(options) ? options : [options];
1067
1121
  if (actOptions.length <= 0) {
1068
- logwarn("Invalid paras in setRequestInterception");
1122
+ logwarn("##browser LsdPage invalid paras in setRequestInterception");
1069
1123
  return false;
1070
1124
  }
1071
1125
  const firstRequestInterception = this.#resquestInterceptionOptions.length <= 0;
@@ -1086,6 +1140,13 @@ var PlaywrightPage = class extends EventEmitter {
1086
1140
  const { requestMatch, action, fulfill } = option;
1087
1141
  const request = route.request();
1088
1142
  const matchedFlag = !requestMatch || this.#checkRequestMatch(request, requestMatch);
1143
+ if (this.#isDebugTask) {
1144
+ if (matchedFlag) {
1145
+ loginfo(`##browser matched request ${request.method()} ${request.url()}`);
1146
+ } else {
1147
+ logdbg(`##browser unmatched request ${request.method()} ${request.url()}`);
1148
+ }
1149
+ }
1089
1150
  if (matchedFlag) {
1090
1151
  switch (action) {
1091
1152
  case "abort":
@@ -1137,6 +1198,13 @@ var PlaywrightPage = class extends EventEmitter {
1137
1198
  matchedFlag = false;
1138
1199
  }
1139
1200
  }
1201
+ if (this.#isDebugTask) {
1202
+ if (matchedFlag) {
1203
+ loginfo(`##browser matched response ${request.method()} ${request.url()}`);
1204
+ } else {
1205
+ logdbg(`##browser unmatched response ${request.method()} ${request.url()}`);
1206
+ }
1207
+ }
1140
1208
  if (!matchedFlag) {
1141
1209
  continue;
1142
1210
  }
@@ -1172,7 +1240,7 @@ var PlaywrightPage = class extends EventEmitter {
1172
1240
  }
1173
1241
  const actOptions = Array.isArray(options) ? options : [options];
1174
1242
  if (actOptions.length <= 0) {
1175
- logwarn("Invalid paras in setResponseInterception");
1243
+ logwarn("##browser LsdPage invalid paras in setResponseInterception");
1176
1244
  return false;
1177
1245
  }
1178
1246
  const firstResponseInterception = this.#responseInterceptionOptions.length <= 0;
@@ -1185,7 +1253,7 @@ var PlaywrightPage = class extends EventEmitter {
1185
1253
  }
1186
1254
  if (firstResponseInterception && this.#responseInterceptionOptions.length > 0) {
1187
1255
  this.#responseCb = this.#responseListener.bind(this);
1188
- this.#page.on("response", this.#responseCb);
1256
+ this.#page.on("response" /* PAGE_RESPONSE */, this.#responseCb);
1189
1257
  }
1190
1258
  return true;
1191
1259
  }
@@ -1233,6 +1301,7 @@ var PlaywrightPage = class extends EventEmitter {
1233
1301
  throw new Error(`Page ${this.#pageId} is already busy!!!`);
1234
1302
  }
1235
1303
  this.#status = "busy";
1304
+ logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
1236
1305
  return true;
1237
1306
  }
1238
1307
  async waitForElement(selector, options = {}) {
@@ -1371,11 +1440,10 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1371
1440
  for (const page of pages) {
1372
1441
  const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, lastStatusUpdateTime, taskId: 0, relatedId: 0, misc: {} };
1373
1442
  const lsdPage = new PlaywrightPage(this, page, pageInfo);
1443
+ this.#lsdPages.push(lsdPage);
1374
1444
  if (this.#maxViewportOfNewPage) {
1375
1445
  await lsdPage.maximizeViewport();
1376
1446
  }
1377
- this.#lsdPages.push(lsdPage);
1378
- loginfo(`##browser ${lsdPage.id()} ${openType}ed`);
1379
1447
  }
1380
1448
  }
1381
1449
  constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, maxViewportOfNewPage = true) {
@@ -1405,8 +1473,9 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1405
1473
  this.#lsdPages = [];
1406
1474
  this.#nextPageIdx = 1;
1407
1475
  this.#gettingPage = false;
1476
+ loginfo(`##browser LsdBrowserContext ${this.id()} is created`);
1408
1477
  this.#initPages();
1409
- browserContext.on("page", async (page) => {
1478
+ browserContext.on("page" /* BROWSERCONTEXT_PAGE */, async (page) => {
1410
1479
  const pageInfo = page.pageInfo;
1411
1480
  if (pageInfo) {
1412
1481
  const { browserIdx: browserIdx2, browserContextIdx: browserContextIdx2, pageIdx } = pageInfo;
@@ -1415,27 +1484,26 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1415
1484
  const currentTime2 = getCurrentUnixTime2();
1416
1485
  const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
1417
1486
  const lsdPage = new PlaywrightPage(this, page, pageInfo2);
1487
+ this.#lsdPages.push(lsdPage);
1418
1488
  if (this.#maxViewportOfNewPage) {
1419
1489
  await lsdPage.maximizeViewport();
1420
1490
  }
1421
- this.#lsdPages.push(lsdPage);
1422
- loginfo(`##page ${lsdPage.id()} created`);
1423
1491
  }
1424
1492
  });
1425
- browserContext.on("close", (bc) => {
1493
+ browserContext.on("close" /* BROWSERCONTEXT_CLOSE */, (bc) => {
1426
1494
  if (browserContext !== bc) {
1427
1495
  logerr(`##browser different browserContext in browserContext.on("close")`);
1428
1496
  }
1429
- this.#lsdBrowser.emit("browserContextClose", this);
1497
+ this.#lsdBrowser.emit("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, this);
1430
1498
  });
1431
- this.on("pageClose", (lsdPage) => {
1499
+ this.on("pageClose" /* PAGE_CLOSE */, (lsdPage) => {
1432
1500
  if (!(lsdPage instanceof PlaywrightPage)) {
1433
- logerr(`Invalid data in LsdBrowserContext.on("pageClose)`);
1501
+ logerr(`##browser LsdBrowserContext invalid data in LsdBrowserContext.on("pageClose)`);
1434
1502
  return;
1435
1503
  }
1436
1504
  const idx = this.#lsdPages.findIndex((p) => p === lsdPage);
1437
1505
  if (idx < 0) {
1438
- logerr(`Invalid lsdPage in LsdBrowserContext.on("pageClose)`);
1506
+ logerr(`##browser LsdBrowserContext invalid lsdPage in LsdBrowserContext.on("pageClose)`);
1439
1507
  return;
1440
1508
  }
1441
1509
  this.#lsdPages.splice(idx, 1);
@@ -1452,7 +1520,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1452
1520
  if (this.#browserContext) {
1453
1521
  this.#status = "closed";
1454
1522
  this.#lastStatusUpdateTime = getCurrentUnixTime2();
1455
- loginfo(`browserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
1523
+ loginfo(`##browser LsdBrowserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
1456
1524
  await this.#browserContext.close();
1457
1525
  }
1458
1526
  return true;
@@ -1467,12 +1535,12 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1467
1535
  await sleep(200);
1468
1536
  }
1469
1537
  }
1470
- logwarn(`Cannot get the gettingLock.`);
1538
+ logwarn(`##browser LsdBrowserContext cannot get the gettingLock.`);
1471
1539
  return false;
1472
1540
  }
1473
1541
  #freeGettingLock() {
1474
1542
  if (!this.#gettingPage) {
1475
- logwarn(`Getting lock is already free now.`);
1543
+ logwarn(`##browser LsdBrowserContext gettingLock is already free now.`);
1476
1544
  }
1477
1545
  this.#gettingPage = false;
1478
1546
  }
@@ -1481,7 +1549,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1481
1549
  maxPageFreeSeconds = this.#maxPageFreeSeconds;
1482
1550
  }
1483
1551
  if (maxPageFreeSeconds <= 0) {
1484
- logwarn(`Please set valid maxPageFreeSeconds to close free pages`);
1552
+ logwarn(`##browser LsdBrowserContext please set valid maxPageFreeSeconds to close free pages`);
1485
1553
  return false;
1486
1554
  }
1487
1555
  const gotLock = await this.#tryToGetGettingLock();
@@ -1578,7 +1646,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1578
1646
  }
1579
1647
  }
1580
1648
  id() {
1581
- return `browserContext-${this.#browserIdx}-${this.#browserContextIdx}`;
1649
+ return `PlaywrightContext-${this.#browserIdx}-${this.#browserContextIdx}`;
1582
1650
  }
1583
1651
  isFree() {
1584
1652
  return this.#status === "free";
@@ -1712,34 +1780,33 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends EventEmitter3 {
1712
1780
  this.#executablePath = executablePath;
1713
1781
  this.#nextBrowserContextIdx = 1;
1714
1782
  this.#closeFreePagesIntervalId = null;
1715
- loginfo(`##browser ${this.id()} ${this.#browserCreationMethod}ed by ${this.#browserControllerType}`);
1783
+ loginfo(`##browser LsdBrowser ${this.id()} ${this.#browserCreationMethod}ed}`);
1716
1784
  const browserContexts = browser.contexts();
1717
1785
  if (browserContexts.length > 0) {
1718
- logwarn(`There are ${browserContexts.length} new browserContexts when playwright launches new browser`);
1786
+ logwarn(`##browser LsdBrowser there are ${browserContexts.length} new browserContexts when playwright launches new browser`);
1719
1787
  }
1720
1788
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
1721
1789
  for (const browserContext of browserContexts) {
1722
1790
  const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
1723
1791
  this.#lsdBrowserContexts.push(lsdBrowserContext);
1724
- loginfo(`##browserContext ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
1725
1792
  }
1726
- browser.on("disconnected", () => {
1793
+ browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
1727
1794
  loginfo(`##browser ${this.id()} disconnected`);
1728
1795
  if (this.#lsdBrowserContexts.length > 0) {
1729
- logerr(`${this.id()} has browserContexts when disconnected`);
1796
+ logerr(`##browser LsdBrowser ${this.id()} has browserContexts when disconnected`);
1730
1797
  }
1731
1798
  });
1732
- this.on("browserContextClose", (lsdBrowserContext) => {
1799
+ this.on("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, (lsdBrowserContext) => {
1733
1800
  if (!(lsdBrowserContext instanceof PlaywrightBrowserContext)) {
1734
- logerr(`Invalid data in LsdBrowser.on("browserContextClose)`);
1801
+ logerr(`##browser LsdBrowser invalid data in LsdBrowser.on("browserContextClose)`);
1735
1802
  return;
1736
1803
  }
1737
1804
  const idx = this.#lsdBrowserContexts.findIndex((bc) => bc === lsdBrowserContext);
1738
1805
  if (idx < 0) {
1739
- logerr(`Invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
1806
+ logerr(`##browser LsdBrowser invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
1740
1807
  return;
1741
1808
  }
1742
- loginfo(`##browserContext ${lsdBrowserContext.id()} closed
1809
+ loginfo(`##browser ${lsdBrowserContext.id()} closed
1743
1810
  `);
1744
1811
  this.#lsdBrowserContexts.splice(idx, 1);
1745
1812
  if (this.#lsdBrowserContexts.length === 0) {
@@ -1760,7 +1827,7 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends EventEmitter3 {
1760
1827
  }
1761
1828
  async newBrowserContext(options) {
1762
1829
  if (this.#lsdBrowserContexts.length >= this.#maxBrowserContextsPerBrowser()) {
1763
- logwarn(`##browser ${this.id()} can not create more new browserContext`);
1830
+ logwarn(`##browser LsdBrowser ${this.id()} can not create more new browserContext`);
1764
1831
  return null;
1765
1832
  }
1766
1833
  const browserContextOptions = {};
@@ -1779,7 +1846,6 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends EventEmitter3 {
1779
1846
  const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
1780
1847
  const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
1781
1848
  this.#lsdBrowserContexts.push(lsdBrowserContext);
1782
- loginfo(`##browser ${lsdBrowserContext.id()} created`);
1783
1849
  return lsdBrowserContext;
1784
1850
  }
1785
1851
  async close() {
@@ -1790,6 +1856,7 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends EventEmitter3 {
1790
1856
  await lsdBrowserContext.close();
1791
1857
  }
1792
1858
  await this.#browser.close();
1859
+ loginfo(`##browser LsdBrowser ${this.id()} is closed`);
1793
1860
  return true;
1794
1861
  }
1795
1862
  browserContexts() {
@@ -1815,7 +1882,7 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends EventEmitter3 {
1815
1882
  return this.#executablePath;
1816
1883
  }
1817
1884
  id() {
1818
- return `browser-${this.#browserType}-${this.#browserIdx}`;
1885
+ return `PlaywrightBrowser-${this.#browserType}-${this.#browserIdx}`;
1819
1886
  }
1820
1887
  isConnected() {
1821
1888
  return this.#browser.isConnected();
@@ -2165,6 +2232,7 @@ var PuppeteerPage = class extends EventEmitter4 {
2165
2232
  #requestInterceptionNum;
2166
2233
  #responseInterceptionNum;
2167
2234
  #client;
2235
+ #isDebugTask;
2168
2236
  #hasValidUrl(page) {
2169
2237
  const url = page.url();
2170
2238
  return url.toLowerCase().startsWith("http");
@@ -2350,15 +2418,15 @@ var PuppeteerPage = class extends EventEmitter4 {
2350
2418
  }
2351
2419
  const page = this.#page;
2352
2420
  const pageId = this.#pageId;
2353
- page.on("close", async () => {
2354
- loginfo(`##browser ${pageId} closed`);
2421
+ page.on("close" /* PAGE_CLOSE */, async () => {
2422
+ loginfo(`##browser page ${pageId} closed @LsdPage`);
2355
2423
  if (!page.pageInfo) {
2356
- logerr(`Logic error in page.on("close")`);
2424
+ logerr(`##browser LsdPage logic error in page.on("close")`);
2357
2425
  }
2358
- this.emit("pageClose");
2359
- this.#lsdBrowserContext.emit("pageClose", this);
2426
+ this.emit("pageClose" /* PAGE_CLOSE */);
2427
+ this.#lsdBrowserContext.emit("pageClose" /* PAGE_CLOSE */, this);
2360
2428
  });
2361
- page.on("popup", (p) => {
2429
+ page.on("popup" /* PAGE_POUP */, (p) => {
2362
2430
  if (p) {
2363
2431
  let evtData = null;
2364
2432
  const pageInfo = p.pageInfo;
@@ -2372,12 +2440,12 @@ var PuppeteerPage = class extends EventEmitter4 {
2372
2440
  pageInfo.relatedId = page.pageInfo.taskId;
2373
2441
  }
2374
2442
  } else {
2375
- logerr(`##browser ${pageId} has popup without page.pageInfo`);
2443
+ logerr(`##browser page ${pageId} has popup without page.pageInfo @LsdPage`);
2376
2444
  }
2377
- loginfo(`##browser ${pageId} has popup ${popupPageId}`);
2378
- this.emit("pagePopup", evtData);
2445
+ loginfo(`##browser page ${pageId} has popup ${popupPageId} @LsdPage`);
2446
+ this.emit("pagePopup" /* PAGE_POPUP */, evtData);
2379
2447
  } else {
2380
- logerr(`##browser ${pageId} has popup page with null page`);
2448
+ logerr(`##browser page ${pageId} has popup page with null page @LsdPage`);
2381
2449
  }
2382
2450
  });
2383
2451
  }
@@ -2392,11 +2460,13 @@ var PuppeteerPage = class extends EventEmitter4 {
2392
2460
  const currentTime = getCurrentUnixTime4();
2393
2461
  const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
2394
2462
  this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId, relatedId, misc };
2395
- this.#pageId = `page-${browserIdx}-${browserContextIdx}-${pageIdx}`;
2463
+ this.#pageId = `PuppeteerPage-${browserIdx}-${browserContextIdx}-${pageIdx}`;
2396
2464
  this.#closeWhenFree = false;
2397
2465
  this.#requestInterceptionNum = 0;
2398
2466
  this.#responseInterceptionNum = 0;
2399
2467
  this.#client = null;
2468
+ this.#isDebugTask = false;
2469
+ loginfo(`##browser LsdPage ${this.#pageId} ${openType}ed`);
2400
2470
  this.#addPageOn();
2401
2471
  }
2402
2472
  async addPreloadScript(scriptOrFunc, arg) {
@@ -2474,7 +2544,7 @@ var PuppeteerPage = class extends EventEmitter4 {
2474
2544
  }
2475
2545
  async close() {
2476
2546
  if (this.#status === "closed") {
2477
- logwarn(`Page ${this.#pageId} is already closed.`);
2547
+ logwarn(`##browser LsdPage ${this.#pageId} is already closed.`);
2478
2548
  return true;
2479
2549
  } else if (this.#status === "busy") {
2480
2550
  throw new Error(`Page ${this.#pageId} cannot be closed because it is busy.`);
@@ -2485,6 +2555,7 @@ var PuppeteerPage = class extends EventEmitter4 {
2485
2555
  await this.#page.close();
2486
2556
  this.#page = null;
2487
2557
  this.#status = "closed";
2558
+ loginfo(`##browser LsdPage ${this.#pageId} is closed`);
2488
2559
  return true;
2489
2560
  }
2490
2561
  closeWhenFree() {
@@ -2515,7 +2586,10 @@ var PuppeteerPage = class extends EventEmitter4 {
2515
2586
  if (!this.#page) {
2516
2587
  throw new Error("No valid page");
2517
2588
  }
2518
- const height = await this.#page.evaluate(() => document.documentElement.scrollHeight);
2589
+ let height = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
2590
+ if (typeof height === "undefined") {
2591
+ height = 0;
2592
+ }
2519
2593
  return height;
2520
2594
  }
2521
2595
  async evaluate(func, args) {
@@ -2566,10 +2640,11 @@ var PuppeteerPage = class extends EventEmitter4 {
2566
2640
  return [];
2567
2641
  }
2568
2642
  async free() {
2569
- if (this.#status === "free") {
2570
- logwarn(`Page ${this.#pageId} is already free.`);
2643
+ if (this.#status === "free" && this.pageInfo().openType !== "popup") {
2644
+ logwarn(`##browser LsdPage ${this.#pageId} is already free.`);
2571
2645
  }
2572
2646
  this.#status = "free";
2647
+ logdbg(`##browser LsdPage ${this.#pageId} is freed`);
2573
2648
  await this.clearRequestInterceptions();
2574
2649
  await this.clearResponseInterceptions();
2575
2650
  return true;
@@ -2670,9 +2745,18 @@ var PuppeteerPage = class extends EventEmitter4 {
2670
2745
  if (!this.#page) {
2671
2746
  throw new Error("No valid page");
2672
2747
  }
2673
- const bodyHeight = await this.#page.evaluate(() => document.body.scrollHeight);
2674
- const documentHeight = await this.#page.evaluate(() => document.documentElement.scrollHeight);
2675
- const windowHeight = await this.#page.evaluate(() => window.outerHeight);
2748
+ let bodyHeight = await this.#page.evaluate(() => document?.body?.scrollHeight);
2749
+ if (typeof bodyHeight === "undefined") {
2750
+ bodyHeight = 0;
2751
+ }
2752
+ let documentHeight = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
2753
+ if (typeof documentHeight === "undefined") {
2754
+ documentHeight = 0;
2755
+ }
2756
+ let windowHeight = await this.#page.evaluate(() => window.outerHeight);
2757
+ if (typeof windowHeight === "undefined") {
2758
+ windowHeight = 0;
2759
+ }
2676
2760
  const pageHeight = Math.max(bodyHeight, documentHeight, windowHeight);
2677
2761
  return pageHeight;
2678
2762
  }
@@ -2686,8 +2770,14 @@ var PuppeteerPage = class extends EventEmitter4 {
2686
2770
  if (!this.#page) {
2687
2771
  throw new Error("No valid page");
2688
2772
  }
2689
- const offsetWidth = await this.#page.evaluate(() => document.documentElement.offsetWidth);
2690
- const windowWidth = await this.#page.evaluate(() => window.outerWidth);
2773
+ let offsetWidth = await this.#page.evaluate(() => document?.documentElement?.offsetWidth);
2774
+ if (typeof offsetWidth === "undefined") {
2775
+ offsetWidth = 0;
2776
+ }
2777
+ let windowWidth = await this.#page.evaluate(() => window.outerWidth);
2778
+ if (typeof windowWidth === "undefined") {
2779
+ windowWidth = 0;
2780
+ }
2691
2781
  const pageWidth = Math.max(offsetWidth, windowWidth);
2692
2782
  return pageWidth;
2693
2783
  }
@@ -2794,6 +2884,8 @@ var PuppeteerPage = class extends EventEmitter4 {
2794
2884
  }
2795
2885
  if (typeof taskId === "number") {
2796
2886
  actPageInfo.taskId = taskId;
2887
+ const debug = this.#page && this.#page.pageInfo && this.#page.pageInfo.taskId < 0;
2888
+ this.#isDebugTask = !!debug;
2797
2889
  }
2798
2890
  if (typeof relatedId === "number") {
2799
2891
  actPageInfo.relatedId = relatedId;
@@ -2836,7 +2928,7 @@ var PuppeteerPage = class extends EventEmitter4 {
2836
2928
  }
2837
2929
  const actOptions = Array.isArray(options) ? options : [options];
2838
2930
  if (actOptions.length <= 0) {
2839
- logwarn("Invalid paras in setRequestInterception");
2931
+ logwarn("##browser LsdPage invalid paras in setRequestInterception");
2840
2932
  return false;
2841
2933
  }
2842
2934
  if (this.#requestInterceptionNum <= 0) {
@@ -2845,11 +2937,18 @@ var PuppeteerPage = class extends EventEmitter4 {
2845
2937
  } else {
2846
2938
  this.#requestInterceptionNum++;
2847
2939
  }
2848
- this.#page.on("request", async (request) => {
2940
+ this.#page.on("request" /* PAGE_REQUEST */, async (request) => {
2849
2941
  try {
2850
2942
  for (const option of actOptions) {
2851
2943
  const { requestMatch, action, fulfill } = option;
2852
2944
  const matchedFlag = !requestMatch || this.#checkRequestMatch(request, requestMatch);
2945
+ if (this.#isDebugTask) {
2946
+ if (matchedFlag) {
2947
+ loginfo(`##browser matched request ${request.method()} ${request.url()}`);
2948
+ } else {
2949
+ logdbg(`##browser unmatched request ${request.method()} ${request.url()}`);
2950
+ }
2951
+ }
2853
2952
  if (matchedFlag) {
2854
2953
  switch (action) {
2855
2954
  case "abort":
@@ -2884,11 +2983,11 @@ var PuppeteerPage = class extends EventEmitter4 {
2884
2983
  }
2885
2984
  const actOptions = Array.isArray(options) ? options : [options];
2886
2985
  if (actOptions.length <= 0) {
2887
- logwarn("Invalid paras in setResponseInterception");
2986
+ logwarn("##browser LsdPage invalid paras in setResponseInterception");
2888
2987
  return false;
2889
2988
  }
2890
2989
  this.#responseInterceptionNum++;
2891
- this.#page.on("response", async (response) => {
2990
+ this.#page.on("response" /* PAGE_RESPONSE */, async (response) => {
2892
2991
  try {
2893
2992
  if (!response.ok() || !this.#page) {
2894
2993
  return false;
@@ -2909,6 +3008,13 @@ var PuppeteerPage = class extends EventEmitter4 {
2909
3008
  matchedFlag = false;
2910
3009
  }
2911
3010
  }
3011
+ if (this.#isDebugTask) {
3012
+ if (matchedFlag) {
3013
+ loginfo(`##browser matched response ${request.method()} ${request.url()}`);
3014
+ } else {
3015
+ logdbg(`##browser unmatched response ${request.method()} ${request.url()}`);
3016
+ }
3017
+ }
2912
3018
  if (!matchedFlag) {
2913
3019
  continue;
2914
3020
  }
@@ -2925,6 +3031,7 @@ var PuppeteerPage = class extends EventEmitter4 {
2925
3031
  requestData,
2926
3032
  responseData
2927
3033
  });
3034
+ loginfo(`##browser cache matched response: ${requestUrl}`);
2928
3035
  }
2929
3036
  if (typeof handler === "function") {
2930
3037
  const pageData = { pageUrl, cookies: "" };
@@ -2990,6 +3097,7 @@ var PuppeteerPage = class extends EventEmitter4 {
2990
3097
  throw new Error(`Page ${this.#pageId} is already busy!!!`);
2991
3098
  }
2992
3099
  this.#status = "busy";
3100
+ logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
2993
3101
  return true;
2994
3102
  }
2995
3103
  async waitForElement(selector, options = {}) {
@@ -3100,14 +3208,13 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3100
3208
  for (const page of pages) {
3101
3209
  const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, lastStatusUpdateTime, taskId: 0, relatedId: 0, misc: {} };
3102
3210
  const lsdPage = new PuppeteerPage(this, page, pageInfo);
3211
+ this.#lsdPages.push(lsdPage);
3103
3212
  if (this.#maxViewportOfNewPage) {
3104
3213
  await lsdPage.maximizeViewport();
3105
3214
  }
3106
3215
  if (this.#userAgent) {
3107
3216
  await lsdPage.setUserAgent(this.#userAgent);
3108
3217
  }
3109
- this.#lsdPages.push(lsdPage);
3110
- loginfo(`##browser ${lsdPage.id()} ${openType}ed`);
3111
3218
  }
3112
3219
  }
3113
3220
  constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxViewportOfNewPage = true) {
@@ -3136,8 +3243,9 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3136
3243
  this.#lsdPages = [];
3137
3244
  this.#nextPageIdx = 1;
3138
3245
  this.#gettingPage = false;
3246
+ loginfo(`##browser LsdBrowserContext ${this.id()} is created`);
3139
3247
  this.#initPages();
3140
- browserContext.on("targetcreated", async (p) => {
3248
+ browserContext.on("targetcreated" /* BROWSERCONTEXT_TARGETCREATED */, async (p) => {
3141
3249
  if (p.type() === "page") {
3142
3250
  const page = await p.page();
3143
3251
  if (!page) {
@@ -3151,30 +3259,36 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3151
3259
  const currentTime2 = getCurrentUnixTime5();
3152
3260
  const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
3153
3261
  const lsdPage = new PuppeteerPage(this, page, pageInfo2);
3154
- if (this.#maxViewportOfNewPage) {
3155
- await lsdPage.maximizeViewport();
3156
- }
3262
+ this.#lsdPages.push(lsdPage);
3157
3263
  if (this.#userAgent) {
3158
3264
  await lsdPage.setUserAgent(this.#userAgent);
3159
3265
  }
3160
- this.#lsdPages.push(lsdPage);
3161
- loginfo(`##page ${lsdPage.id()} created`);
3266
+ if (this.#maxViewportOfNewPage) {
3267
+ await lsdPage.maximizeViewport();
3268
+ }
3162
3269
  }
3163
3270
  }
3164
3271
  });
3165
- this.on("pageClose", (lsdPage) => {
3272
+ browserContext.on("close" /* BROWSERCONTEXT_CLOSE */, (bc) => {
3273
+ logerr(`##browser LsdBrowserContext puppeteer BrowserContext receives close event`);
3274
+ if (browserContext !== bc) {
3275
+ logerr(`##browser LsdBrowserContext different browserContext in browserContext.on("close")`);
3276
+ }
3277
+ this.#lsdBrowser.emit("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, this);
3278
+ });
3279
+ this.on("pageClose" /* PAGE_CLOSE */, (lsdPage) => {
3166
3280
  if (!(lsdPage instanceof PuppeteerPage)) {
3167
- logerr(`Invalid data in LsdBrowserContext.on("pageClose)`);
3281
+ logerr(`##browser LsdBrowserContext invalid data in LsdBrowserContext.on("pageClose)`);
3168
3282
  return;
3169
3283
  }
3170
3284
  const idx = this.#lsdPages.findIndex((p) => p === lsdPage);
3171
3285
  if (idx < 0) {
3172
- logerr(`Invalid lsdPage in LsdBrowserContext.on("pageClose)`);
3286
+ logerr(`##browser LsdBrowserContext invalid lsdPage in LsdBrowserContext.on("pageClose)`);
3173
3287
  return;
3174
3288
  }
3175
3289
  this.#lsdPages.splice(idx, 1);
3176
3290
  if (this.#lsdPages.length === 0) {
3177
- this.#lsdBrowser.emit("browserContextClose", this);
3291
+ this.#lsdBrowser.emit("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, this);
3178
3292
  }
3179
3293
  return;
3180
3294
  });
@@ -3189,7 +3303,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3189
3303
  if (this.#browserContext) {
3190
3304
  this.#status = "closed";
3191
3305
  this.#lastStatusUpdateTime = getCurrentUnixTime5();
3192
- loginfo(`browserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
3306
+ loginfo(`##browser LsdBrowserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
3193
3307
  if (this.#browserContextCreationMethod !== "launch") {
3194
3308
  await this.#browserContext.close();
3195
3309
  }
@@ -3206,12 +3320,12 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3206
3320
  await sleep2(200);
3207
3321
  }
3208
3322
  }
3209
- logwarn(`Cannot get the gettingLock.`);
3323
+ logwarn(`##browser LsdBrowserContext cannot get the gettingLock.`);
3210
3324
  return false;
3211
3325
  }
3212
3326
  #freeGettingLock() {
3213
3327
  if (!this.#gettingPage) {
3214
- logwarn(`Getting lock is already free now.`);
3328
+ logwarn(`##browser LsdBrowserContext gettingLock is already free now.`);
3215
3329
  }
3216
3330
  this.#gettingPage = false;
3217
3331
  }
@@ -3220,7 +3334,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3220
3334
  maxPageFreeSeconds = this.#maxPageFreeSeconds;
3221
3335
  }
3222
3336
  if (maxPageFreeSeconds <= 0) {
3223
- logwarn(`Please set valid maxPageFreeSeconds to close free pages`);
3337
+ logwarn(`##browser LsdBrowserContext please set valid maxPageFreeSeconds to close free pages`);
3224
3338
  return false;
3225
3339
  }
3226
3340
  const gotLock = await this.#tryToGetGettingLock();
@@ -3319,7 +3433,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3319
3433
  }
3320
3434
  }
3321
3435
  id() {
3322
- return `browserContext-${this.#browserIdx}-${this.#browserContextIdx}`;
3436
+ return `PuppeteerContext-${this.#browserIdx}-${this.#browserContextIdx}`;
3323
3437
  }
3324
3438
  isIncognito() {
3325
3439
  return this.#incognito;
@@ -3353,7 +3467,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3353
3467
  }
3354
3468
  if (localStorageOrigins.length > 0) {
3355
3469
  await origPage.setRequestInterception(true);
3356
- origPage.on("request", (request) => {
3470
+ origPage.on("request" /* PAGE_REQUEST */, (request) => {
3357
3471
  request.respond({
3358
3472
  status: 200,
3359
3473
  // contentType: "text/html; charset=utf-8", // "text/plain",
@@ -3456,28 +3570,27 @@ var PuppeteerBrowser = class _PuppeteerBrowser extends EventEmitter6 {
3456
3570
  this.#executablePath = executablePath;
3457
3571
  this.#nextBrowserContextIdx = 1;
3458
3572
  this.#closeFreePagesIntervalId = null;
3459
- loginfo(`##browser ${this.#browserType} ${this.id()} ${this.#browserCreationMethod}ed by ${this.#browserControllerType}`);
3573
+ loginfo(`##browser LsdBrowser ${this.id()} ${this.#browserCreationMethod}ed}`);
3460
3574
  const browserContexts = browser.browserContexts();
3461
3575
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : false;
3462
3576
  for (const browserContext of browserContexts) {
3463
3577
  const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), this.#userAgent(), maxViewportOfNewPage);
3464
3578
  this.#lsdBrowserContexts.push(lsdBrowserContext);
3465
- loginfo(`##browser ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
3466
3579
  }
3467
- browser.on("disconnected", () => {
3580
+ browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
3468
3581
  loginfo(`##browser ${this.id()} disconnected`);
3469
3582
  if (this.#lsdBrowserContexts.length > 0) {
3470
- logerr(`${this.id()} has browserContexts when disconnected`);
3583
+ logerr(`##browser LsdBrowser ${this.id()} has browserContexts when disconnected`);
3471
3584
  }
3472
3585
  });
3473
- this.on("browserContextClose", (lsdBrowserContext) => {
3586
+ this.on("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, (lsdBrowserContext) => {
3474
3587
  if (!(lsdBrowserContext instanceof PuppeteerBrowserContext)) {
3475
- logerr(`Invalid data in LsdBrowser.on("browserContextClose)`);
3588
+ logerr(`##browser LsdBrowser invalid data in LsdBrowser.on("browserContextClose)`);
3476
3589
  return;
3477
3590
  }
3478
3591
  const idx = this.#lsdBrowserContexts.findIndex((bc) => bc === lsdBrowserContext);
3479
3592
  if (idx < 0) {
3480
- logerr(`Invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
3593
+ logerr(`##browser LsdBrowser invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
3481
3594
  return;
3482
3595
  }
3483
3596
  loginfo(`##browser ${lsdBrowserContext.id()} closed
@@ -3501,7 +3614,7 @@ var PuppeteerBrowser = class _PuppeteerBrowser extends EventEmitter6 {
3501
3614
  }
3502
3615
  async newBrowserContext(options) {
3503
3616
  if (this.#lsdBrowserContexts.length >= this.#maxBrowserContextsPerBrowser()) {
3504
- logwarn(`##browser ${this.id()} can not create more new browserContext`);
3617
+ logwarn(`##browser LsdBrowser ${this.id()} can not create more new browserContext`);
3505
3618
  return null;
3506
3619
  }
3507
3620
  const browserContextOptions = {};
@@ -3514,7 +3627,6 @@ var PuppeteerBrowser = class _PuppeteerBrowser extends EventEmitter6 {
3514
3627
  const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
3515
3628
  const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxViewportOfNewPage);
3516
3629
  this.#lsdBrowserContexts.push(lsdBrowserContext);
3517
- loginfo(`##browser ${lsdBrowserContext.id()} created`);
3518
3630
  return lsdBrowserContext;
3519
3631
  }
3520
3632
  async close() {
@@ -3525,6 +3637,7 @@ var PuppeteerBrowser = class _PuppeteerBrowser extends EventEmitter6 {
3525
3637
  await lsdBrowserContext.close();
3526
3638
  }
3527
3639
  await this.#browser.close();
3640
+ loginfo(`##browser LsdBrowser ${this.id()} is closed`);
3528
3641
  return true;
3529
3642
  }
3530
3643
  browserContexts() {
@@ -3550,7 +3663,7 @@ var PuppeteerBrowser = class _PuppeteerBrowser extends EventEmitter6 {
3550
3663
  return this.#executablePath;
3551
3664
  }
3552
3665
  id() {
3553
- return `browser-${this.#browserIdx}`;
3666
+ return `PuppeteerBrowser-${this.#browserIdx}`;
3554
3667
  }
3555
3668
  isConnected() {
3556
3669
  return this.#browser.connected;
@@ -4279,6 +4392,7 @@ var PatchrightPage = class extends EventEmitter8 {
4279
4392
  #responseInterceptionOptions;
4280
4393
  #client;
4281
4394
  #responseCb;
4395
+ #isDebugTask;
4282
4396
  #hasValidUrl(page) {
4283
4397
  const url = page.url();
4284
4398
  return url.toLowerCase().startsWith("http");
@@ -4294,7 +4408,7 @@ var PatchrightPage = class extends EventEmitter8 {
4294
4408
  const cookieItems = await this.#getCookies(page);
4295
4409
  const domainSet = new Set(cookieItems.map((c) => c.domain));
4296
4410
  if (domainSet.size !== 1) {
4297
- logwarn(`Domains in clearCookies: ${Array.from(domainSet.values())}`);
4411
+ logwarn(`##browser LsdPage domains in clearCookies: ${Array.from(domainSet.values())}`);
4298
4412
  }
4299
4413
  for (const domain of domainSet.values()) {
4300
4414
  await browserContext.clearCookies({ domain });
@@ -4500,15 +4614,15 @@ var PatchrightPage = class extends EventEmitter8 {
4500
4614
  }
4501
4615
  const page = this.#page;
4502
4616
  const pageId = this.#pageId;
4503
- page.on("close", async () => {
4504
- loginfo(`##browser ${pageId} closed`);
4617
+ page.on("close" /* PAGE_CLOSE */, async () => {
4618
+ loginfo(`##browser page ${pageId} closed @LsdPage`);
4505
4619
  if (!page.pageInfo) {
4506
- logerr(`Logic error in page.on("close")`);
4620
+ logerr(`##browser LsdPage logic error in page.on("close")`);
4507
4621
  }
4508
- this.emit("pageClose");
4509
- this.#lsdBrowserContext.emit("pageClose", this);
4622
+ this.emit("pageClose" /* PAGE_CLOSE */);
4623
+ this.#lsdBrowserContext.emit("pageClose" /* PAGE_CLOSE */, this);
4510
4624
  });
4511
- page.on("popup", (p) => {
4625
+ page.on("popup" /* PAGE_POUP */, (p) => {
4512
4626
  if (p) {
4513
4627
  let evtData = null;
4514
4628
  const pageInfo = p.pageInfo;
@@ -4522,12 +4636,12 @@ var PatchrightPage = class extends EventEmitter8 {
4522
4636
  pageInfo.relatedId = page.pageInfo.taskId;
4523
4637
  }
4524
4638
  } else {
4525
- logerr(`##browser ${pageId} has popup without page.pageInfo`);
4639
+ logerr(`##browser page ${pageId} has popup without page.pageInfo @LsdPage`);
4526
4640
  }
4527
- loginfo(`##browser ${pageId} has popup ${popupPageId}`);
4528
- this.emit("pagePopup", evtData);
4641
+ loginfo(`##browser page ${pageId} has popup ${popupPageId} @LsdPage`);
4642
+ this.emit("pagePopup" /* PAGE_POPUP */, evtData);
4529
4643
  } else {
4530
- logerr(`##browser ${pageId} has popup page with null page`);
4644
+ logerr(`##browser page ${pageId} has popup page with null page @LsdPage`);
4531
4645
  }
4532
4646
  });
4533
4647
  }
@@ -4542,12 +4656,14 @@ var PatchrightPage = class extends EventEmitter8 {
4542
4656
  const currentTime = getCurrentUnixTime7();
4543
4657
  const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
4544
4658
  this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId, relatedId, misc };
4545
- this.#pageId = `page-${browserIdx}-${browserContextIdx}-${pageIdx}`;
4659
+ this.#pageId = `PatchrightPage-${browserIdx}-${browserContextIdx}-${pageIdx}`;
4546
4660
  this.#closeWhenFree = false;
4547
4661
  this.#resquestInterceptionOptions = [];
4548
4662
  this.#responseInterceptionOptions = [];
4549
4663
  this.#client = null;
4550
4664
  this.#responseCb = null;
4665
+ this.#isDebugTask = false;
4666
+ loginfo(`##browser LsdPage ${this.#pageId} ${openType}ed`);
4551
4667
  this.#addPageOn();
4552
4668
  }
4553
4669
  async addPreloadScript(scriptOrFunc, arg) {
@@ -4628,7 +4744,7 @@ var PatchrightPage = class extends EventEmitter8 {
4628
4744
  }
4629
4745
  async close() {
4630
4746
  if (this.#status === "closed") {
4631
- logwarn(`Page ${this.#pageId} is already closed.`);
4747
+ logwarn(`##browser LsdPage ${this.#pageId} is already closed.`);
4632
4748
  return true;
4633
4749
  } else if (this.#status === "busy") {
4634
4750
  throw new Error(`Page ${this.#pageId} cannot be closed because it is busy.`);
@@ -4639,6 +4755,7 @@ var PatchrightPage = class extends EventEmitter8 {
4639
4755
  await this.#page.close();
4640
4756
  this.#page = null;
4641
4757
  this.#status = "closed";
4758
+ loginfo(`##browser LsdPage ${this.#pageId} is closed`);
4642
4759
  return true;
4643
4760
  }
4644
4761
  closeWhenFree() {
@@ -4669,7 +4786,10 @@ var PatchrightPage = class extends EventEmitter8 {
4669
4786
  if (!this.#page) {
4670
4787
  throw new Error("No valid page");
4671
4788
  }
4672
- const height = await this.#page.evaluate(() => document.documentElement.scrollHeight);
4789
+ let height = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
4790
+ if (typeof height === "undefined") {
4791
+ height = 0;
4792
+ }
4673
4793
  return height;
4674
4794
  }
4675
4795
  async evaluate(func, args, isolated = true) {
@@ -4719,10 +4839,11 @@ var PatchrightPage = class extends EventEmitter8 {
4719
4839
  return [];
4720
4840
  }
4721
4841
  async free() {
4722
- if (this.#status === "free") {
4723
- logwarn(`Page ${this.#pageId} is already free.`);
4842
+ if (this.#status === "free" && this.pageInfo().openType !== "popup") {
4843
+ logwarn(`##browser LsdPage ${this.#pageId} is already free.`);
4724
4844
  }
4725
4845
  this.#status = "free";
4846
+ logdbg(`##browser LsdPage ${this.#pageId} is freed`);
4726
4847
  await this.clearRequestInterceptions();
4727
4848
  await this.clearResponseInterceptions();
4728
4849
  return true;
@@ -4819,9 +4940,18 @@ var PatchrightPage = class extends EventEmitter8 {
4819
4940
  if (!this.#page) {
4820
4941
  throw new Error("No valid page");
4821
4942
  }
4822
- const bodyHeight = await this.#page.evaluate(() => document.body.scrollHeight);
4823
- const documentHeight = await this.#page.evaluate(() => document.documentElement.scrollHeight);
4824
- const windowHeight = await this.#page.evaluate(() => window.outerHeight);
4943
+ let bodyHeight = await this.#page.evaluate(() => document?.body?.scrollHeight);
4944
+ if (typeof bodyHeight === "undefined") {
4945
+ bodyHeight = 0;
4946
+ }
4947
+ let documentHeight = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
4948
+ if (typeof documentHeight === "undefined") {
4949
+ documentHeight = 0;
4950
+ }
4951
+ let windowHeight = await this.#page.evaluate(() => window.outerHeight);
4952
+ if (typeof windowHeight === "undefined") {
4953
+ windowHeight = 0;
4954
+ }
4825
4955
  const pageHeight = Math.max(bodyHeight, documentHeight, windowHeight);
4826
4956
  return pageHeight;
4827
4957
  }
@@ -4835,8 +4965,14 @@ var PatchrightPage = class extends EventEmitter8 {
4835
4965
  if (!this.#page) {
4836
4966
  throw new Error("No valid page");
4837
4967
  }
4838
- const offsetWidth = await this.#page.evaluate(() => document.documentElement.offsetWidth);
4839
- const windowWidth = await this.#page.evaluate(() => window.outerWidth);
4968
+ let offsetWidth = await this.#page.evaluate(() => document?.documentElement?.offsetWidth);
4969
+ if (typeof offsetWidth === "undefined") {
4970
+ offsetWidth = 0;
4971
+ }
4972
+ let windowWidth = await this.#page.evaluate(() => window.outerWidth);
4973
+ if (typeof windowWidth === "undefined") {
4974
+ windowWidth = 0;
4975
+ }
4840
4976
  const pageWidth = Math.max(offsetWidth, windowWidth);
4841
4977
  return pageWidth;
4842
4978
  }
@@ -4944,6 +5080,8 @@ var PatchrightPage = class extends EventEmitter8 {
4944
5080
  }
4945
5081
  if (typeof taskId === "number") {
4946
5082
  actPageInfo.taskId = taskId;
5083
+ const debug = this.#page && this.#page.pageInfo && this.#page.pageInfo.taskId < 0;
5084
+ this.#isDebugTask = !!debug;
4947
5085
  }
4948
5086
  if (typeof relatedId === "number") {
4949
5087
  actPageInfo.relatedId = relatedId;
@@ -4987,7 +5125,7 @@ var PatchrightPage = class extends EventEmitter8 {
4987
5125
  }
4988
5126
  const actOptions = Array.isArray(options) ? options : [options];
4989
5127
  if (actOptions.length <= 0) {
4990
- logwarn("Invalid paras in setRequestInterception");
5128
+ logwarn("##browser LsdPage invalid paras in setRequestInterception");
4991
5129
  return false;
4992
5130
  }
4993
5131
  const firstRequestInterception = this.#resquestInterceptionOptions.length <= 0;
@@ -5008,6 +5146,13 @@ var PatchrightPage = class extends EventEmitter8 {
5008
5146
  const { requestMatch, action, fulfill } = option;
5009
5147
  const request = route.request();
5010
5148
  const matchedFlag = !requestMatch || this.#checkRequestMatch(request, requestMatch);
5149
+ if (this.#isDebugTask) {
5150
+ if (matchedFlag) {
5151
+ loginfo(`##browser matched request ${request.method()} ${request.url()}`);
5152
+ } else {
5153
+ logdbg(`##browser unmatched request ${request.method()} ${request.url()}`);
5154
+ }
5155
+ }
5011
5156
  if (matchedFlag) {
5012
5157
  switch (action) {
5013
5158
  case "abort":
@@ -5059,6 +5204,13 @@ var PatchrightPage = class extends EventEmitter8 {
5059
5204
  matchedFlag = false;
5060
5205
  }
5061
5206
  }
5207
+ if (this.#isDebugTask) {
5208
+ if (matchedFlag) {
5209
+ loginfo(`##browser matched response ${request.method()} ${request.url()}`);
5210
+ } else {
5211
+ logdbg(`##browser unmatched response ${request.method()} ${request.url()}`);
5212
+ }
5213
+ }
5062
5214
  if (!matchedFlag) {
5063
5215
  continue;
5064
5216
  }
@@ -5094,7 +5246,7 @@ var PatchrightPage = class extends EventEmitter8 {
5094
5246
  }
5095
5247
  const actOptions = Array.isArray(options) ? options : [options];
5096
5248
  if (actOptions.length <= 0) {
5097
- logwarn("Invalid paras in setResponseInterception");
5249
+ logwarn("##browser LsdPage invalid paras in setResponseInterception");
5098
5250
  return false;
5099
5251
  }
5100
5252
  const firstResponseInterception = this.#responseInterceptionOptions.length <= 0;
@@ -5107,7 +5259,7 @@ var PatchrightPage = class extends EventEmitter8 {
5107
5259
  }
5108
5260
  if (firstResponseInterception && this.#responseInterceptionOptions.length > 0) {
5109
5261
  this.#responseCb = this.#responseListener.bind(this);
5110
- this.#page.on("response", this.#responseCb);
5262
+ this.#page.on("response" /* PAGE_RESPONSE */, this.#responseCb);
5111
5263
  }
5112
5264
  return true;
5113
5265
  }
@@ -5155,6 +5307,7 @@ var PatchrightPage = class extends EventEmitter8 {
5155
5307
  throw new Error(`Page ${this.#pageId} is already busy!!!`);
5156
5308
  }
5157
5309
  this.#status = "busy";
5310
+ logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
5158
5311
  return true;
5159
5312
  }
5160
5313
  async waitForElement(selector, options = {}) {
@@ -5293,11 +5446,10 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
5293
5446
  for (const page of pages) {
5294
5447
  const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, lastStatusUpdateTime, taskId: 0, relatedId: 0, misc: {} };
5295
5448
  const lsdPage = new PatchrightPage(this, page, pageInfo);
5449
+ this.#lsdPages.push(lsdPage);
5296
5450
  if (this.#maxViewportOfNewPage) {
5297
5451
  await lsdPage.maximizeViewport();
5298
5452
  }
5299
- this.#lsdPages.push(lsdPage);
5300
- loginfo(`##browser ${lsdPage.id()} ${openType}ed`);
5301
5453
  }
5302
5454
  }
5303
5455
  constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, maxViewportOfNewPage = true) {
@@ -5327,8 +5479,9 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
5327
5479
  this.#lsdPages = [];
5328
5480
  this.#nextPageIdx = 1;
5329
5481
  this.#gettingPage = false;
5482
+ loginfo(`##browser LsdBrowserContext ${this.id()} is created`);
5330
5483
  this.#initPages();
5331
- browserContext.on("page", async (page) => {
5484
+ browserContext.on("page" /* BROWSERCONTEXT_PAGE */, async (page) => {
5332
5485
  const pageInfo = page.pageInfo;
5333
5486
  if (pageInfo) {
5334
5487
  const { browserIdx: browserIdx2, browserContextIdx: browserContextIdx2, pageIdx } = pageInfo;
@@ -5337,27 +5490,26 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
5337
5490
  const currentTime2 = getCurrentUnixTime8();
5338
5491
  const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
5339
5492
  const lsdPage = new PatchrightPage(this, page, pageInfo2);
5493
+ this.#lsdPages.push(lsdPage);
5340
5494
  if (this.#maxViewportOfNewPage) {
5341
5495
  await lsdPage.maximizeViewport();
5342
5496
  }
5343
- this.#lsdPages.push(lsdPage);
5344
- loginfo(`##page ${lsdPage.id()} created`);
5345
5497
  }
5346
5498
  });
5347
- browserContext.on("close", (bc) => {
5499
+ browserContext.on("close" /* BROWSERCONTEXT_CLOSE */, (bc) => {
5348
5500
  if (browserContext !== bc) {
5349
- logerr(`##browser different browserContext in browserContext.on("close")`);
5501
+ logerr(`##browser LsdBrowserContext different browserContext in browserContext.on("close")`);
5350
5502
  }
5351
- this.#lsdBrowser.emit("browserContextClose", this);
5503
+ this.#lsdBrowser.emit("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, this);
5352
5504
  });
5353
- this.on("pageClose", (lsdPage) => {
5505
+ this.on("pageClose" /* PAGE_CLOSE */, (lsdPage) => {
5354
5506
  if (!(lsdPage instanceof PatchrightPage)) {
5355
- logerr(`Invalid data in LsdBrowserContext.on("pageClose)`);
5507
+ logerr(`##browser LsdBrowserContext invalid data in LsdBrowserContext.on("pageClose)`);
5356
5508
  return;
5357
5509
  }
5358
5510
  const idx = this.#lsdPages.findIndex((p) => p === lsdPage);
5359
5511
  if (idx < 0) {
5360
- logerr(`Invalid lsdPage in LsdBrowserContext.on("pageClose)`);
5512
+ logerr(`##browser LsdBrowserContext invalid lsdPage in LsdBrowserContext.on("pageClose)`);
5361
5513
  return;
5362
5514
  }
5363
5515
  this.#lsdPages.splice(idx, 1);
@@ -5374,7 +5526,7 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
5374
5526
  if (this.#browserContext) {
5375
5527
  this.#status = "closed";
5376
5528
  this.#lastStatusUpdateTime = getCurrentUnixTime8();
5377
- loginfo(`browserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
5529
+ loginfo(`##browser LsdBrowserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
5378
5530
  await this.#browserContext.close();
5379
5531
  }
5380
5532
  return true;
@@ -5389,12 +5541,12 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
5389
5541
  await sleep3(200);
5390
5542
  }
5391
5543
  }
5392
- logwarn(`Cannot get the gettingLock.`);
5544
+ logwarn(`##browser LsdBrowserContext cannot get the gettingLock.`);
5393
5545
  return false;
5394
5546
  }
5395
5547
  #freeGettingLock() {
5396
5548
  if (!this.#gettingPage) {
5397
- logwarn(`Getting lock is already free now.`);
5549
+ logwarn(`##browser LsdBrowserContext gettingLock is already free now.`);
5398
5550
  }
5399
5551
  this.#gettingPage = false;
5400
5552
  }
@@ -5403,7 +5555,7 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
5403
5555
  maxPageFreeSeconds = this.#maxPageFreeSeconds;
5404
5556
  }
5405
5557
  if (maxPageFreeSeconds <= 0) {
5406
- logwarn(`Please set valid maxPageFreeSeconds to close free pages`);
5558
+ logwarn(`##browser LsdBrowserContext please set valid maxPageFreeSeconds to close free pages`);
5407
5559
  return false;
5408
5560
  }
5409
5561
  const gotLock = await this.#tryToGetGettingLock();
@@ -5500,7 +5652,7 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
5500
5652
  }
5501
5653
  }
5502
5654
  id() {
5503
- return `browserContext-${this.#browserIdx}-${this.#browserContextIdx}`;
5655
+ return `PatchrightContext-${this.#browserIdx}-${this.#browserContextIdx}`;
5504
5656
  }
5505
5657
  isFree() {
5506
5658
  return this.#status === "free";
@@ -5634,34 +5786,33 @@ var PatchrightBrowser = class _PatchrightBrowser extends EventEmitter10 {
5634
5786
  this.#executablePath = executablePath;
5635
5787
  this.#nextBrowserContextIdx = 1;
5636
5788
  this.#closeFreePagesIntervalId = null;
5637
- loginfo(`##browser ${this.id()} ${this.#browserCreationMethod}ed by ${this.#browserControllerType}`);
5789
+ loginfo(`##browser LsdBrowser ${this.id()} ${this.#browserCreationMethod}ed}`);
5638
5790
  const browserContexts = browser.contexts();
5639
5791
  if (browserContexts.length > 0) {
5640
- logwarn(`There are ${browserContexts.length} new browserContexts when playwright launches new browser`);
5792
+ logwarn(`##browser LsdBrowser there are ${browserContexts.length} new browserContexts when playwright launches new browser`);
5641
5793
  }
5642
5794
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
5643
5795
  for (const browserContext of browserContexts) {
5644
5796
  const lsdBrowserContext = new PatchrightBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
5645
5797
  this.#lsdBrowserContexts.push(lsdBrowserContext);
5646
- loginfo(`##browserContext ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
5647
5798
  }
5648
- browser.on("disconnected", () => {
5799
+ browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
5649
5800
  loginfo(`##browser ${this.id()} disconnected`);
5650
5801
  if (this.#lsdBrowserContexts.length > 0) {
5651
- logerr(`${this.id()} has browserContexts when disconnected`);
5802
+ logerr(`##browser LsdBrowser ${this.id()} has browserContexts when disconnected`);
5652
5803
  }
5653
5804
  });
5654
- this.on("browserContextClose", (lsdBrowserContext) => {
5805
+ this.on("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, (lsdBrowserContext) => {
5655
5806
  if (!(lsdBrowserContext instanceof PatchrightBrowserContext)) {
5656
- logerr(`Invalid data in LsdBrowser.on("browserContextClose)`);
5807
+ logerr(`##browser LsdBrowser invalid data in LsdBrowser.on("browserContextClose)`);
5657
5808
  return;
5658
5809
  }
5659
5810
  const idx = this.#lsdBrowserContexts.findIndex((bc) => bc === lsdBrowserContext);
5660
5811
  if (idx < 0) {
5661
- logerr(`Invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
5812
+ logerr(`##browser LsdBrowser invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
5662
5813
  return;
5663
5814
  }
5664
- loginfo(`##browserContext ${lsdBrowserContext.id()} closed
5815
+ loginfo(`##browser ${lsdBrowserContext.id()} closed
5665
5816
  `);
5666
5817
  this.#lsdBrowserContexts.splice(idx, 1);
5667
5818
  if (this.#lsdBrowserContexts.length === 0) {
@@ -5682,7 +5833,7 @@ var PatchrightBrowser = class _PatchrightBrowser extends EventEmitter10 {
5682
5833
  }
5683
5834
  async newBrowserContext(options) {
5684
5835
  if (this.#lsdBrowserContexts.length >= this.#maxBrowserContextsPerBrowser()) {
5685
- logwarn(`##browser ${this.id()} can not create more new browserContext`);
5836
+ logwarn(`##browser LsdBrowser ${this.id()} can not create more new browserContext`);
5686
5837
  return null;
5687
5838
  }
5688
5839
  const browserContextOptions = {};
@@ -5701,7 +5852,6 @@ var PatchrightBrowser = class _PatchrightBrowser extends EventEmitter10 {
5701
5852
  const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
5702
5853
  const lsdBrowserContext = new PatchrightBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
5703
5854
  this.#lsdBrowserContexts.push(lsdBrowserContext);
5704
- loginfo(`##browser ${lsdBrowserContext.id()} created`);
5705
5855
  return lsdBrowserContext;
5706
5856
  }
5707
5857
  async close() {
@@ -5712,6 +5862,7 @@ var PatchrightBrowser = class _PatchrightBrowser extends EventEmitter10 {
5712
5862
  await lsdBrowserContext.close();
5713
5863
  }
5714
5864
  await this.#browser.close();
5865
+ loginfo(`##browser LsdBrowser ${this.id()} is closed`);
5715
5866
  return true;
5716
5867
  }
5717
5868
  browserContexts() {
@@ -5737,7 +5888,7 @@ var PatchrightBrowser = class _PatchrightBrowser extends EventEmitter10 {
5737
5888
  return this.#executablePath;
5738
5889
  }
5739
5890
  id() {
5740
- return `browser-${this.#browserType}-${this.#browserIdx}`;
5891
+ return `PatchrightBrowser-${this.#browserType}-${this.#browserIdx}`;
5741
5892
  }
5742
5893
  isConnected() {
5743
5894
  return this.#browser.isConnected();
@@ -6093,6 +6244,7 @@ var CamoufoxPage = class extends EventEmitter11 {
6093
6244
  #responseInterceptionOptions;
6094
6245
  #client;
6095
6246
  #responseCb;
6247
+ #isDebugTask;
6096
6248
  #hasValidUrl(page) {
6097
6249
  const url = page.url();
6098
6250
  return url.toLowerCase().startsWith("http");
@@ -6108,7 +6260,7 @@ var CamoufoxPage = class extends EventEmitter11 {
6108
6260
  const cookieItems = await this.#getCookies(page);
6109
6261
  const domainSet = new Set(cookieItems.map((c) => c.domain));
6110
6262
  if (domainSet.size !== 1) {
6111
- logwarn(`Domains in clearCookies: ${Array.from(domainSet.values())}`);
6263
+ logwarn(`##browser LsdPage domains in clearCookies: ${Array.from(domainSet.values())}`);
6112
6264
  }
6113
6265
  for (const domain of domainSet.values()) {
6114
6266
  await browserContext.clearCookies({ domain });
@@ -6314,15 +6466,15 @@ var CamoufoxPage = class extends EventEmitter11 {
6314
6466
  }
6315
6467
  const page = this.#page;
6316
6468
  const pageId = this.#pageId;
6317
- page.on("close", async () => {
6318
- loginfo(`##browser ${pageId} closed`);
6469
+ page.on("close" /* PAGE_CLOSE */, async () => {
6470
+ loginfo(`##browser page ${pageId} closed @LsdPage`);
6319
6471
  if (!page.pageInfo) {
6320
- logerr(`Logic error in page.on("close")`);
6472
+ logerr(`##browser LsdPage logic error in page.on("close")`);
6321
6473
  }
6322
- this.emit("pageClose");
6323
- this.#lsdBrowserContext.emit("pageClose", this);
6474
+ this.emit("pageClose" /* PAGE_CLOSE */);
6475
+ this.#lsdBrowserContext.emit("pageClose" /* PAGE_CLOSE */, this);
6324
6476
  });
6325
- page.on("popup", (p) => {
6477
+ page.on("popup" /* PAGE_POUP */, (p) => {
6326
6478
  if (p) {
6327
6479
  let evtData = null;
6328
6480
  const pageInfo = p.pageInfo;
@@ -6336,12 +6488,12 @@ var CamoufoxPage = class extends EventEmitter11 {
6336
6488
  pageInfo.relatedId = page.pageInfo.taskId;
6337
6489
  }
6338
6490
  } else {
6339
- logerr(`##browser ${pageId} has popup without page.pageInfo`);
6491
+ logerr(`##browser page ${pageId} has popup without page.pageInfo @LsdPage`);
6340
6492
  }
6341
- loginfo(`##browser ${pageId} has popup ${popupPageId}`);
6342
- this.emit("pagePopup", evtData);
6493
+ loginfo(`##browser page ${pageId} has popup ${popupPageId} @LsdPage`);
6494
+ this.emit("pagePopup" /* PAGE_POPUP */, evtData);
6343
6495
  } else {
6344
- logerr(`##browser ${pageId} has popup page with null page`);
6496
+ logerr(`##browser page ${pageId} has popup page with null page @LsdPage`);
6345
6497
  }
6346
6498
  });
6347
6499
  }
@@ -6356,12 +6508,14 @@ var CamoufoxPage = class extends EventEmitter11 {
6356
6508
  const currentTime = getCurrentUnixTime10();
6357
6509
  const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
6358
6510
  this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId, relatedId, misc };
6359
- this.#pageId = `page-${browserIdx}-${browserContextIdx}-${pageIdx}`;
6511
+ this.#pageId = `CamoufoxPage-${browserIdx}-${browserContextIdx}-${pageIdx}`;
6360
6512
  this.#closeWhenFree = false;
6361
6513
  this.#resquestInterceptionOptions = [];
6362
6514
  this.#responseInterceptionOptions = [];
6363
6515
  this.#client = null;
6364
6516
  this.#responseCb = null;
6517
+ this.#isDebugTask = false;
6518
+ loginfo(`##browser LsdPage ${this.#pageId} ${openType}ed`);
6365
6519
  this.#addPageOn();
6366
6520
  }
6367
6521
  async addPreloadScript() {
@@ -6429,7 +6583,7 @@ var CamoufoxPage = class extends EventEmitter11 {
6429
6583
  }
6430
6584
  async close() {
6431
6585
  if (this.#status === "closed") {
6432
- logwarn(`Page ${this.#pageId} is already closed.`);
6586
+ logwarn(`##browser LsdPage ${this.#pageId} is already closed.`);
6433
6587
  return true;
6434
6588
  } else if (this.#status === "busy") {
6435
6589
  throw new Error(`Page ${this.#pageId} cannot be closed because it is busy.`);
@@ -6440,6 +6594,7 @@ var CamoufoxPage = class extends EventEmitter11 {
6440
6594
  await this.#page.close();
6441
6595
  this.#page = null;
6442
6596
  this.#status = "closed";
6597
+ loginfo(`##browser LsdPage ${this.#pageId} is closed`);
6443
6598
  return true;
6444
6599
  }
6445
6600
  closeWhenFree() {
@@ -6470,7 +6625,10 @@ var CamoufoxPage = class extends EventEmitter11 {
6470
6625
  if (!this.#page) {
6471
6626
  throw new Error("No valid page");
6472
6627
  }
6473
- const height = await this.#page.evaluate(() => document.documentElement.scrollHeight);
6628
+ let height = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
6629
+ if (typeof height === "undefined") {
6630
+ height = 0;
6631
+ }
6474
6632
  return height;
6475
6633
  }
6476
6634
  async evaluate(func, args, isolated = true) {
@@ -6521,10 +6679,11 @@ var CamoufoxPage = class extends EventEmitter11 {
6521
6679
  return [];
6522
6680
  }
6523
6681
  async free() {
6524
- if (this.#status === "free") {
6525
- logwarn(`Page ${this.#pageId} is already free.`);
6682
+ if (this.#status === "free" && this.pageInfo().openType !== "popup") {
6683
+ logwarn(`##browser LsdPage ${this.#pageId} is already free.`);
6526
6684
  }
6527
6685
  this.#status = "free";
6686
+ logdbg(`##browser LsdPage ${this.#pageId} is freed`);
6528
6687
  await this.clearRequestInterceptions();
6529
6688
  await this.clearResponseInterceptions();
6530
6689
  return true;
@@ -6621,9 +6780,18 @@ var CamoufoxPage = class extends EventEmitter11 {
6621
6780
  if (!this.#page) {
6622
6781
  throw new Error("No valid page");
6623
6782
  }
6624
- const bodyHeight = await this.#page.evaluate(() => document.body.scrollHeight);
6625
- const documentHeight = await this.#page.evaluate(() => document.documentElement.scrollHeight);
6626
- const windowHeight = await this.#page.evaluate(() => window.outerHeight);
6783
+ let bodyHeight = await this.#page.evaluate(() => document?.body?.scrollHeight);
6784
+ if (typeof bodyHeight === "undefined") {
6785
+ bodyHeight = 0;
6786
+ }
6787
+ let documentHeight = await this.#page.evaluate(() => document?.documentElement?.scrollHeight);
6788
+ if (typeof documentHeight === "undefined") {
6789
+ documentHeight = 0;
6790
+ }
6791
+ let windowHeight = await this.#page.evaluate(() => window.outerHeight);
6792
+ if (typeof windowHeight === "undefined") {
6793
+ windowHeight = 0;
6794
+ }
6627
6795
  const pageHeight = Math.max(bodyHeight, documentHeight, windowHeight);
6628
6796
  return pageHeight;
6629
6797
  }
@@ -6637,8 +6805,14 @@ var CamoufoxPage = class extends EventEmitter11 {
6637
6805
  if (!this.#page) {
6638
6806
  throw new Error("No valid page");
6639
6807
  }
6640
- const offsetWidth = await this.#page.evaluate(() => document.documentElement.offsetWidth);
6641
- const windowWidth = await this.#page.evaluate(() => window.outerWidth);
6808
+ let offsetWidth = await this.#page.evaluate(() => document?.documentElement?.offsetWidth);
6809
+ if (typeof offsetWidth === "undefined") {
6810
+ offsetWidth = 0;
6811
+ }
6812
+ let windowWidth = await this.#page.evaluate(() => window.outerWidth);
6813
+ if (typeof windowWidth === "undefined") {
6814
+ windowWidth = 0;
6815
+ }
6642
6816
  const pageWidth = Math.max(offsetWidth, windowWidth);
6643
6817
  return pageWidth;
6644
6818
  }
@@ -6746,6 +6920,8 @@ var CamoufoxPage = class extends EventEmitter11 {
6746
6920
  }
6747
6921
  if (typeof taskId === "number") {
6748
6922
  actPageInfo.taskId = taskId;
6923
+ const debug = this.#page && this.#page.pageInfo && this.#page.pageInfo.taskId < 0;
6924
+ this.#isDebugTask = !!debug;
6749
6925
  }
6750
6926
  if (typeof relatedId === "number") {
6751
6927
  actPageInfo.relatedId = relatedId;
@@ -6789,7 +6965,7 @@ var CamoufoxPage = class extends EventEmitter11 {
6789
6965
  }
6790
6966
  const actOptions = Array.isArray(options) ? options : [options];
6791
6967
  if (actOptions.length <= 0) {
6792
- logwarn("Invalid paras in setRequestInterception");
6968
+ logwarn("##browser LsdPage invalid paras in setRequestInterception");
6793
6969
  return false;
6794
6970
  }
6795
6971
  const firstRequestInterception = this.#resquestInterceptionOptions.length <= 0;
@@ -6810,6 +6986,13 @@ var CamoufoxPage = class extends EventEmitter11 {
6810
6986
  const { requestMatch, action, fulfill } = option;
6811
6987
  const request = route.request();
6812
6988
  const matchedFlag = !requestMatch || this.#checkRequestMatch(request, requestMatch);
6989
+ if (this.#isDebugTask) {
6990
+ if (matchedFlag) {
6991
+ loginfo(`##browser matched request ${request.method()} ${request.url()}`);
6992
+ } else {
6993
+ logdbg(`##browser unmatched request ${request.method()} ${request.url()}`);
6994
+ }
6995
+ }
6813
6996
  if (matchedFlag) {
6814
6997
  switch (action) {
6815
6998
  case "abort":
@@ -6861,6 +7044,13 @@ var CamoufoxPage = class extends EventEmitter11 {
6861
7044
  matchedFlag = false;
6862
7045
  }
6863
7046
  }
7047
+ if (this.#isDebugTask) {
7048
+ if (matchedFlag) {
7049
+ loginfo(`##browser matched response ${request.method()} ${request.url()}`);
7050
+ } else {
7051
+ logdbg(`##browser unmatched response ${request.method()} ${request.url()}`);
7052
+ }
7053
+ }
6864
7054
  if (!matchedFlag) {
6865
7055
  continue;
6866
7056
  }
@@ -6896,7 +7086,7 @@ var CamoufoxPage = class extends EventEmitter11 {
6896
7086
  }
6897
7087
  const actOptions = Array.isArray(options) ? options : [options];
6898
7088
  if (actOptions.length <= 0) {
6899
- logwarn("Invalid paras in setResponseInterception");
7089
+ logwarn("##browser LsdPage invalid paras in setResponseInterception");
6900
7090
  return false;
6901
7091
  }
6902
7092
  const firstResponseInterception = this.#responseInterceptionOptions.length <= 0;
@@ -6909,7 +7099,7 @@ var CamoufoxPage = class extends EventEmitter11 {
6909
7099
  }
6910
7100
  if (firstResponseInterception && this.#responseInterceptionOptions.length > 0) {
6911
7101
  this.#responseCb = this.#responseListener.bind(this);
6912
- this.#page.on("response", this.#responseCb);
7102
+ this.#page.on("response" /* PAGE_RESPONSE */, this.#responseCb);
6913
7103
  }
6914
7104
  return true;
6915
7105
  }
@@ -6957,6 +7147,7 @@ var CamoufoxPage = class extends EventEmitter11 {
6957
7147
  throw new Error(`Page ${this.#pageId} is already busy!!!`);
6958
7148
  }
6959
7149
  this.#status = "busy";
7150
+ logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
6960
7151
  return true;
6961
7152
  }
6962
7153
  async waitForElement(selector, options = {}) {
@@ -7095,11 +7286,10 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
7095
7286
  for (const page of pages) {
7096
7287
  const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, lastStatusUpdateTime, taskId: 0, relatedId: 0, misc: {} };
7097
7288
  const lsdPage = new CamoufoxPage(this, page, pageInfo);
7289
+ this.#lsdPages.push(lsdPage);
7098
7290
  if (this.#maxViewportOfNewPage) {
7099
7291
  await lsdPage.maximizeViewport();
7100
7292
  }
7101
- this.#lsdPages.push(lsdPage);
7102
- loginfo(`##browser ${lsdPage.id()} ${openType}ed`);
7103
7293
  }
7104
7294
  }
7105
7295
  constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, maxViewportOfNewPage = true) {
@@ -7129,8 +7319,9 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
7129
7319
  this.#lsdPages = [];
7130
7320
  this.#nextPageIdx = 1;
7131
7321
  this.#gettingPage = false;
7322
+ loginfo(`##browser LsdBrowserContext ${this.id()} is created`);
7132
7323
  this.#initPages();
7133
- browserContext.on("page", async (page) => {
7324
+ browserContext.on("page" /* BROWSERCONTEXT_PAGE */, async (page) => {
7134
7325
  const pageInfo = page.pageInfo;
7135
7326
  if (pageInfo) {
7136
7327
  const { browserIdx: browserIdx2, browserContextIdx: browserContextIdx2, pageIdx } = pageInfo;
@@ -7139,27 +7330,26 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
7139
7330
  const currentTime2 = getCurrentUnixTime11();
7140
7331
  const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
7141
7332
  const lsdPage = new CamoufoxPage(this, page, pageInfo2);
7333
+ this.#lsdPages.push(lsdPage);
7142
7334
  if (this.#maxViewportOfNewPage) {
7143
7335
  await lsdPage.maximizeViewport();
7144
7336
  }
7145
- this.#lsdPages.push(lsdPage);
7146
- loginfo(`##page ${lsdPage.id()} created`);
7147
7337
  }
7148
7338
  });
7149
- browserContext.on("close", (bc) => {
7339
+ browserContext.on("close" /* BROWSERCONTEXT_CLOSE */, (bc) => {
7150
7340
  if (browserContext !== bc) {
7151
- logerr(`##browser different browserContext in browserContext.on("close")`);
7341
+ logerr(`##browser LsdBrowserContext different browserContext in browserContext.on("close")`);
7152
7342
  }
7153
- this.#lsdBrowser.emit("browserContextClose", this);
7343
+ this.#lsdBrowser.emit("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, this);
7154
7344
  });
7155
- this.on("pageClose", (lsdPage) => {
7345
+ this.on("pageClose" /* PAGE_CLOSE */, (lsdPage) => {
7156
7346
  if (!(lsdPage instanceof CamoufoxPage)) {
7157
- logerr(`Invalid data in LsdBrowserContext.on("pageClose)`);
7347
+ logerr(`##browser LsdBrowserContext invalid data in LsdBrowserContext.on("pageClose)`);
7158
7348
  return;
7159
7349
  }
7160
7350
  const idx = this.#lsdPages.findIndex((p) => p === lsdPage);
7161
7351
  if (idx < 0) {
7162
- logerr(`Invalid lsdPage in LsdBrowserContext.on("pageClose)`);
7352
+ logerr(`##browser LsdBrowserContext invalid lsdPage in LsdBrowserContext.on("pageClose)`);
7163
7353
  return;
7164
7354
  }
7165
7355
  this.#lsdPages.splice(idx, 1);
@@ -7176,7 +7366,7 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
7176
7366
  if (this.#browserContext) {
7177
7367
  this.#status = "closed";
7178
7368
  this.#lastStatusUpdateTime = getCurrentUnixTime11();
7179
- loginfo(`browserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
7369
+ loginfo(`##browser LsdBrowserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
7180
7370
  await this.#browserContext.close();
7181
7371
  }
7182
7372
  return true;
@@ -7191,12 +7381,12 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
7191
7381
  await sleep4(200);
7192
7382
  }
7193
7383
  }
7194
- logwarn(`Cannot get the gettingLock.`);
7384
+ logwarn(`##browser LsdBrowserContext cannot get the gettingLock.`);
7195
7385
  return false;
7196
7386
  }
7197
7387
  #freeGettingLock() {
7198
7388
  if (!this.#gettingPage) {
7199
- logwarn(`Getting lock is already free now.`);
7389
+ logwarn(`##browser LsdBrowserContext gettingLock is already free now.`);
7200
7390
  }
7201
7391
  this.#gettingPage = false;
7202
7392
  }
@@ -7205,7 +7395,7 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
7205
7395
  maxPageFreeSeconds = this.#maxPageFreeSeconds;
7206
7396
  }
7207
7397
  if (maxPageFreeSeconds <= 0) {
7208
- logwarn(`Please set valid maxPageFreeSeconds to close free pages`);
7398
+ logwarn(`##browser LsdBrowserContext please set valid maxPageFreeSeconds to close free pages`);
7209
7399
  return false;
7210
7400
  }
7211
7401
  const gotLock = await this.#tryToGetGettingLock();
@@ -7302,7 +7492,7 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
7302
7492
  }
7303
7493
  }
7304
7494
  id() {
7305
- return `browserContext-${this.#browserIdx}-${this.#browserContextIdx}`;
7495
+ return `CamoufoxContext-${this.#browserIdx}-${this.#browserContextIdx}`;
7306
7496
  }
7307
7497
  isFree() {
7308
7498
  return this.#status === "free";
@@ -7436,34 +7626,33 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends EventEmitter13 {
7436
7626
  this.#executablePath = executablePath;
7437
7627
  this.#nextBrowserContextIdx = 1;
7438
7628
  this.#closeFreePagesIntervalId = null;
7439
- loginfo(`##browser ${this.id()} ${this.#browserCreationMethod}ed by ${this.#browserControllerType}`);
7629
+ loginfo(`##browser LsdBrowser ${this.id()} ${this.#browserCreationMethod}ed}`);
7440
7630
  const browserContexts = browser.contexts();
7441
7631
  if (browserContexts.length > 0) {
7442
- logwarn(`There are ${browserContexts.length} new browserContexts when camoufox launches new browser`);
7632
+ logwarn(`##browser LsdBrowser there are ${browserContexts.length} new browserContexts when camoufox launches new browser`);
7443
7633
  }
7444
7634
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
7445
7635
  for (const browserContext of browserContexts) {
7446
7636
  const lsdBrowserContext = new CamoufoxBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
7447
7637
  this.#lsdBrowserContexts.push(lsdBrowserContext);
7448
- loginfo(`##browserContext ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
7449
7638
  }
7450
- browser.on("disconnected", () => {
7639
+ browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
7451
7640
  loginfo(`##browser ${this.id()} disconnected`);
7452
7641
  if (this.#lsdBrowserContexts.length > 0) {
7453
- logerr(`${this.id()} has browserContexts when disconnected`);
7642
+ logerr(`##browser LsdBrowser ${this.id()} has browserContexts when disconnected`);
7454
7643
  }
7455
7644
  });
7456
- this.on("browserContextClose", (lsdBrowserContext) => {
7645
+ this.on("browserContextClose" /* BROWSER_CONTEXT_CLOSE */, (lsdBrowserContext) => {
7457
7646
  if (!(lsdBrowserContext instanceof CamoufoxBrowserContext)) {
7458
- logerr(`Invalid data in LsdBrowser.on("browserContextClose)`);
7647
+ logerr(`##browser LsdBrowser invalid data in LsdBrowser.on("browserContextClose)`);
7459
7648
  return;
7460
7649
  }
7461
7650
  const idx = this.#lsdBrowserContexts.findIndex((bc) => bc === lsdBrowserContext);
7462
7651
  if (idx < 0) {
7463
- logerr(`Invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
7652
+ logerr(`##browser LsdBrowser invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
7464
7653
  return;
7465
7654
  }
7466
- loginfo(`##browserContext ${lsdBrowserContext.id()} closed
7655
+ loginfo(`##browser ${lsdBrowserContext.id()} closed
7467
7656
  `);
7468
7657
  this.#lsdBrowserContexts.splice(idx, 1);
7469
7658
  if (this.#lsdBrowserContexts.length === 0) {
@@ -7484,7 +7673,7 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends EventEmitter13 {
7484
7673
  }
7485
7674
  async newBrowserContext(options) {
7486
7675
  if (this.#lsdBrowserContexts.length >= this.#maxBrowserContextsPerBrowser()) {
7487
- logwarn(`##browser ${this.id()} can not create more new browserContext`);
7676
+ logwarn(`##browser LsdBrowser ${this.id()} can not create more new browserContext`);
7488
7677
  return null;
7489
7678
  }
7490
7679
  const browserContextOptions = {};
@@ -7503,7 +7692,6 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends EventEmitter13 {
7503
7692
  const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
7504
7693
  const lsdBrowserContext = new CamoufoxBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
7505
7694
  this.#lsdBrowserContexts.push(lsdBrowserContext);
7506
- loginfo(`##browser ${lsdBrowserContext.id()} created`);
7507
7695
  return lsdBrowserContext;
7508
7696
  }
7509
7697
  async close() {
@@ -7514,6 +7702,7 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends EventEmitter13 {
7514
7702
  await lsdBrowserContext.close();
7515
7703
  }
7516
7704
  await this.#browser.close();
7705
+ loginfo(`##browser LsdBrowser ${this.id()} is closed`);
7517
7706
  return true;
7518
7707
  }
7519
7708
  browserContexts() {
@@ -7539,7 +7728,7 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends EventEmitter13 {
7539
7728
  return this.#executablePath;
7540
7729
  }
7541
7730
  id() {
7542
- return `browser-${this.#browserType}-${this.#browserIdx}`;
7731
+ return `CamoufoxBrowser-${this.#browserType}-${this.#browserIdx}`;
7543
7732
  }
7544
7733
  isConnected() {
7545
7734
  return this.#browser.isConnected();
@@ -7701,22 +7890,22 @@ var LsdBrowserController = class _LsdBrowserController {
7701
7890
  const actOptions = { closeFreePagesIntervalSeconds, maxBrowserContextsPerBrowser, maxPagesPerBrowserContext, maxPageFreeSeconds, maxViewportOfNewPage, proxy, timeout, args, executablePath, maxWindowSize, headless, minBrowserContexts, incognito, proxyPerBrowserContext, userDataDir, userAgent };
7702
7891
  let idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--incoginto"));
7703
7892
  if (idx >= 0) {
7704
- logwarn(`Please use options.incognito instead when launching new browser.`);
7893
+ logwarn(`##browser controller Please use options.incognito instead when launching new browser.`);
7705
7894
  args.splice(idx, 1);
7706
7895
  }
7707
7896
  idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--proxy-server"));
7708
7897
  if (idx >= 0) {
7709
- logwarn(`Please use options.proxy instead when launching new browser.`);
7898
+ logwarn(`##browser controller Please use options.proxy instead when launching new browser.`);
7710
7899
  args.splice(idx, 1);
7711
7900
  }
7712
7901
  idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--user-data-dir"));
7713
7902
  if (idx >= 0) {
7714
- logwarn(`Please use options.userDataDir instead when launching new browser.`);
7903
+ logwarn(`##browser controller Please use options.userDataDir instead when launching new browser.`);
7715
7904
  args.splice(idx, 1);
7716
7905
  }
7717
7906
  idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--start-maximized"));
7718
7907
  if (idx >= 0) {
7719
- logwarn(`Please use options.maxWindowSize instead when launching new browser.`);
7908
+ logwarn(`##browser controller Please use options.maxWindowSize instead when launching new browser.`);
7720
7909
  args.splice(idx, 1);
7721
7910
  }
7722
7911
  let lsdBrowser;
@@ -7914,7 +8103,7 @@ var LsdBrowserController = class _LsdBrowserController {
7914
8103
  const pids = await getPidsListeningOnPort(port);
7915
8104
  let browserPid = 0;
7916
8105
  if (pids.length !== 1) {
7917
- logerr(`##browser pids.length ${pids.length} is not 1 when trying to connect to browserUrl ${browserUrl}`);
8106
+ logerr(`##browser controller pids.length ${pids.length} is not 1 when trying to connect to browserUrl ${browserUrl}`);
7918
8107
  } else {
7919
8108
  browserPid = pids[0];
7920
8109
  }
@@ -7958,6 +8147,10 @@ var controller = new LsdBrowserController();
7958
8147
  export {
7959
8148
  CheerioElement,
7960
8149
  CheerioPage,
8150
+ ControllerEvent,
8151
+ LsdBrowserContextEvent,
8152
+ LsdBrowserEvent,
8153
+ LsdPageEvent,
7961
8154
  PlaywrightBrowser,
7962
8155
  PlaywrightBrowserContext,
7963
8156
  PlaywrightElement,