@letsscrapedata/controller 0.2.0 → 0.6.0

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
@@ -23,6 +23,7 @@ var LsdBrowserEvent = /* @__PURE__ */ ((LsdBrowserEvent2) => {
23
23
  LsdBrowserEvent2["BROWSER_CONTEXT_CLOSE"] = "browserContextClose";
24
24
  return LsdBrowserEvent2;
25
25
  })(LsdBrowserEvent || {});
26
+ var POPUP_TASK_ID = 7;
26
27
 
27
28
  // src/utils/log.ts
28
29
  import { log, LogLevel } from "@letsscrapedata/utils";
@@ -379,6 +380,7 @@ var PlaywrightPage = class extends EventEmitter {
379
380
  #lsdBrowserContext;
380
381
  #page;
381
382
  #status;
383
+ #lastStatusUpdateTime;
382
384
  #pageId;
383
385
  #closeWhenFree;
384
386
  #resquestInterceptionOptions;
@@ -621,12 +623,12 @@ var PlaywrightPage = class extends EventEmitter {
621
623
  const pageInfo = p.pageInfo;
622
624
  let popupPageId = "page";
623
625
  if (pageInfo) {
624
- const { browserIdx, browserContextIdx, pageIdx } = pageInfo;
626
+ const { taskId, browserIdx, browserContextIdx, pageIdx } = pageInfo;
625
627
  popupPageId = `page-${browserIdx}-${browserContextIdx}-${pageIdx}`;
626
628
  pageInfo.openType = "popup";
627
629
  evtData = this.browserContext().page(pageIdx);
628
- if (evtData && page.pageInfo?.taskId) {
629
- pageInfo.relatedId = page.pageInfo.taskId;
630
+ if (evtData) {
631
+ evtData.setPageInfo({ taskId: POPUP_TASK_ID, relatedId: taskId });
630
632
  }
631
633
  } else {
632
634
  logerr(`##browser page ${pageId} has popup without page.pageInfo @LsdPage`);
@@ -643,12 +645,13 @@ var PlaywrightPage = class extends EventEmitter {
643
645
  throw new Error("Invalid paras in new LsdPage");
644
646
  }
645
647
  super();
648
+ const currentTime = getCurrentUnixTime();
646
649
  this.#lsdBrowserContext = browserContext;
647
650
  this.#page = page;
648
651
  this.#status = "free";
649
- const currentTime = getCurrentUnixTime();
650
- const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
651
- this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId, relatedId, misc };
652
+ this.#lastStatusUpdateTime = currentTime;
653
+ const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
654
+ this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, taskId, relatedId, misc };
652
655
  this.#pageId = `PlaywrightPage-${browserIdx}-${browserContextIdx}-${pageIdx}`;
653
656
  this.#closeWhenFree = false;
654
657
  this.#resquestInterceptionOptions = [];
@@ -748,6 +751,7 @@ var PlaywrightPage = class extends EventEmitter {
748
751
  await this.#page.close();
749
752
  this.#page = null;
750
753
  this.#status = "closed";
754
+ this.#lastStatusUpdateTime = getCurrentUnixTime();
751
755
  loginfo(`##browser LsdPage ${this.#pageId} is closed`);
752
756
  return true;
753
757
  }
@@ -837,6 +841,7 @@ var PlaywrightPage = class extends EventEmitter {
837
841
  logwarn(`##browser LsdPage ${this.#pageId} is already free.`);
838
842
  }
839
843
  this.#status = "free";
844
+ this.#lastStatusUpdateTime = getCurrentUnixTime();
840
845
  logdbg(`##browser LsdPage ${this.#pageId} is freed`);
841
846
  await this.clearRequestInterceptions();
842
847
  await this.clearResponseInterceptions();
@@ -872,8 +877,25 @@ var PlaywrightPage = class extends EventEmitter {
872
877
  id() {
873
878
  return this.#pageId;
874
879
  }
875
- isFree() {
876
- return this.#status === "free";
880
+ isAvailable(domainName = "") {
881
+ if (domainName) {
882
+ return this.#status === "free" && this.url().includes(domainName);
883
+ } else if (this.#status !== "free") {
884
+ return false;
885
+ } else {
886
+ const url = this.url();
887
+ if (!url || url === "about:blank") {
888
+ return true;
889
+ }
890
+ const maxReservedSeconds = this.#lsdBrowserContext.maxReservedSeconds();
891
+ if (maxReservedSeconds <= 0) {
892
+ return true;
893
+ }
894
+ return getCurrentUnixTime() - this.#lastStatusUpdateTime >= maxReservedSeconds;
895
+ }
896
+ }
897
+ lastStatusUpdateTime() {
898
+ return this.#lastStatusUpdateTime;
877
899
  }
878
900
  async localStroage() {
879
901
  if (!this.#page) {
@@ -1068,10 +1090,7 @@ var PlaywrightPage = class extends EventEmitter {
1068
1090
  throw new Error("Invalid paras in setPageInfo");
1069
1091
  }
1070
1092
  const actPageInfo = this.#page.pageInfo;
1071
- const { lastStatusUpdateTime, taskId, relatedId, misc } = pageInfo;
1072
- if (typeof lastStatusUpdateTime === "number") {
1073
- actPageInfo.lastStatusUpdateTime = lastStatusUpdateTime;
1074
- }
1093
+ const { taskId, relatedId, misc } = pageInfo;
1075
1094
  if (typeof taskId === "number") {
1076
1095
  actPageInfo.taskId = taskId;
1077
1096
  const debug = this.#page && this.#page.pageInfo && this.#page.pageInfo.taskId < 0;
@@ -1302,6 +1321,7 @@ var PlaywrightPage = class extends EventEmitter {
1302
1321
  throw new Error(`Page ${this.#pageId} is already busy!!!`);
1303
1322
  }
1304
1323
  this.#status = "busy";
1324
+ this.#lastStatusUpdateTime = getCurrentUnixTime();
1305
1325
  logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
1306
1326
  return true;
1307
1327
  }
@@ -1423,6 +1443,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1423
1443
  #browserContext;
1424
1444
  #browserContextCreationMethod;
1425
1445
  #userAgent;
1446
+ #maxReservedSeconds;
1426
1447
  #apiContext;
1427
1448
  #createTime;
1428
1449
  #lastStatusUpdateTime;
@@ -1441,9 +1462,8 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1441
1462
  }
1442
1463
  const pages = this.#browserContext.pages();
1443
1464
  const openType = this.#lsdBrowser.browserCreationMethod();
1444
- const lastStatusUpdateTime = getCurrentUnixTime2();
1445
1465
  for (const page of pages) {
1446
- const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, lastStatusUpdateTime, taskId: 0, relatedId: 0, misc: {} };
1466
+ const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, taskId: 0, relatedId: 0, misc: {} };
1447
1467
  const lsdPage = new PlaywrightPage(this, page, pageInfo);
1448
1468
  this.#lsdPages.push(lsdPage);
1449
1469
  if (this.#maxViewportOfNewPage) {
@@ -1458,7 +1478,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1458
1478
  }
1459
1479
  }
1460
1480
  }
1461
- constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxViewportOfNewPage = true) {
1481
+ constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxReservedSeconds = 0, maxViewportOfNewPage = true) {
1462
1482
  if (!lsdBrowser || typeof lsdBrowser.browserContexts !== "function") {
1463
1483
  throw new Error(`Invalid lsdBrowser parameter`);
1464
1484
  }
@@ -1472,6 +1492,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1472
1492
  this.#browserContext = browserContext;
1473
1493
  this.#browserContextCreationMethod = browserContextCreationMethod;
1474
1494
  this.#userAgent = userAgent;
1495
+ this.#maxReservedSeconds = maxReservedSeconds;
1475
1496
  const apiRequestContext = browserContext.request;
1476
1497
  this.#apiContext = new PlaywrightApiContext(apiRequestContext);
1477
1498
  const currentTime = getCurrentUnixTime2();
@@ -1495,7 +1516,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1495
1516
  logwarn(`##browser page-${browserIdx2}-${browserContextIdx2}-${pageIdx} has been already created`);
1496
1517
  } else {
1497
1518
  const currentTime2 = getCurrentUnixTime2();
1498
- const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
1519
+ const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
1499
1520
  const lsdPage = new PlaywrightPage(this, page, pageInfo2);
1500
1521
  this.#lsdPages.push(lsdPage);
1501
1522
  if (this.#maxViewportOfNewPage) {
@@ -1561,7 +1582,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1561
1582
  if (maxPageFreeSeconds <= 0) {
1562
1583
  maxPageFreeSeconds = this.#maxPageFreeSeconds;
1563
1584
  }
1564
- if (maxPageFreeSeconds <= 0) {
1585
+ if (maxPageFreeSeconds <= 0 || maxPageFreeSeconds < this.#maxReservedSeconds + 60) {
1565
1586
  logwarn(`##browser LsdBrowserContext please set valid maxPageFreeSeconds to close free pages`);
1566
1587
  return false;
1567
1588
  }
@@ -1571,7 +1592,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1571
1592
  }
1572
1593
  try {
1573
1594
  const maxUpdateTime = getCurrentUnixTime2() - this.#maxPageFreeSeconds;
1574
- let freePages = this.#lsdPages.filter((p) => p.isFree() && p.pageInfo().lastStatusUpdateTime < maxUpdateTime);
1595
+ let freePages = this.#lsdPages.filter((p) => p.status() === "free" && p.lastStatusUpdateTime() < maxUpdateTime);
1575
1596
  if (freePages.length === this.#lsdPages.length) {
1576
1597
  freePages = freePages.slice(1);
1577
1598
  }
@@ -1596,7 +1617,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1596
1617
  const { browserIncognitos: incognitos } = browserContextRequirements;
1597
1618
  return incognitos.length === 0 || incognitos.includes(this.#incognito);
1598
1619
  }
1599
- async getPage(always = false) {
1620
+ async getPage(domainName = "", always = false) {
1600
1621
  if (!this.#browserContext) {
1601
1622
  throw new Error("Invalid browserContext");
1602
1623
  }
@@ -1605,7 +1626,10 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1605
1626
  return null;
1606
1627
  }
1607
1628
  try {
1608
- let lsdPage = this.#lsdPages.find((p) => p.isFree());
1629
+ let lsdPage = this.#lsdPages.find((p) => p.isAvailable(domainName));
1630
+ if (!lsdPage && domainName) {
1631
+ lsdPage = this.#lsdPages.find((p) => p.isAvailable());
1632
+ }
1609
1633
  if (lsdPage) {
1610
1634
  lsdPage.use();
1611
1635
  this.#freeGettingLock();
@@ -1623,7 +1647,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1623
1647
  } else {
1624
1648
  pageInfo.openType = "newpage";
1625
1649
  }
1626
- lsdPage = this.#lsdPages.find((p) => p.isFree());
1650
+ lsdPage = this.#lsdPages.find((p) => p.isAvailable());
1627
1651
  if (lsdPage) {
1628
1652
  if (!this.#userAgent) {
1629
1653
  const userAgent = await lsdPage.evaluate(() => navigator.userAgent);
@@ -1658,7 +1682,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1658
1682
  hasFreePage(pageNum = 1) {
1659
1683
  if (this.#maxPagesPerBrowserContext - this.#lsdPages.length > pageNum) {
1660
1684
  return true;
1661
- } else if (this.#maxPagesPerBrowserContext - this.#lsdPages.filter((p) => !p.isFree()).length > pageNum) {
1685
+ } else if (this.#maxPagesPerBrowserContext - this.#lsdPages.filter((p) => !p.isAvailable()).length > pageNum) {
1662
1686
  return true;
1663
1687
  } else {
1664
1688
  return false;
@@ -1673,6 +1697,9 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1673
1697
  isIncognito() {
1674
1698
  return this.#incognito;
1675
1699
  }
1700
+ maxReservedSeconds() {
1701
+ return this.#maxReservedSeconds;
1702
+ }
1676
1703
  page(pageIdx) {
1677
1704
  const lsdPage = this.#lsdPages.find((p) => p.pageInfo().pageIdx === pageIdx);
1678
1705
  return lsdPage ? lsdPage : null;
@@ -1784,7 +1811,7 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends EventEmitter3 {
1784
1811
  throw new Error(`Invalid playwright browser parameter`);
1785
1812
  }
1786
1813
  super();
1787
- const { closeFreePagesIntervalSeconds = 300, maxPageFreeSeconds = 900, maxViewportOfNewPage = true, headless = false, executablePath = "" } = options;
1814
+ const { closeFreePagesIntervalSeconds = 300, maxPageFreeSeconds = 900, maxReservedSeconds = 0, maxViewportOfNewPage = true, headless = false, executablePath = "" } = options;
1788
1815
  this.#browser = browser;
1789
1816
  this.#browserIdx = browserIdx;
1790
1817
  this.#pid = pid;
@@ -1809,7 +1836,7 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends EventEmitter3 {
1809
1836
  }
1810
1837
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
1811
1838
  for (const browserContext of browserContexts) {
1812
- const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), "", maxViewportOfNewPage);
1839
+ const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), "", maxReservedSeconds, maxViewportOfNewPage);
1813
1840
  this.#lsdBrowserContexts.push(lsdBrowserContext);
1814
1841
  }
1815
1842
  browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
@@ -1870,8 +1897,8 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends EventEmitter3 {
1870
1897
  browserContextOptions.userAgent = userAgent;
1871
1898
  }
1872
1899
  const browserContext = await this.#browser.newContext(browserContextOptions);
1873
- const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
1874
- const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxViewportOfNewPage);
1900
+ const { maxReservedSeconds, maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
1901
+ const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxReservedSeconds, maxViewportOfNewPage);
1875
1902
  this.#lsdBrowserContexts.push(lsdBrowserContext);
1876
1903
  return lsdBrowserContext;
1877
1904
  }
@@ -2253,6 +2280,7 @@ var PuppeteerPage = class extends EventEmitter4 {
2253
2280
  #lsdBrowserContext;
2254
2281
  #page;
2255
2282
  #status;
2283
+ #lastStatusUpdateTime;
2256
2284
  #pageId;
2257
2285
  #userAgent;
2258
2286
  #closeWhenFree;
@@ -2459,12 +2487,12 @@ var PuppeteerPage = class extends EventEmitter4 {
2459
2487
  const pageInfo = p.pageInfo;
2460
2488
  let popupPageId = "page";
2461
2489
  if (pageInfo) {
2462
- const { browserIdx, browserContextIdx, pageIdx } = pageInfo;
2490
+ const { taskId, browserIdx, browserContextIdx, pageIdx } = pageInfo;
2463
2491
  popupPageId = `page-${browserIdx}-${browserContextIdx}-${pageIdx}`;
2464
2492
  pageInfo.openType = "popup";
2465
2493
  evtData = this.browserContext().page(pageIdx);
2466
- if (evtData && page.pageInfo?.taskId) {
2467
- pageInfo.relatedId = page.pageInfo.taskId;
2494
+ if (evtData) {
2495
+ evtData.setPageInfo({ taskId: POPUP_TASK_ID, relatedId: taskId });
2468
2496
  }
2469
2497
  } else {
2470
2498
  logerr(`##browser page ${pageId} has popup without page.pageInfo @LsdPage`);
@@ -2481,12 +2509,13 @@ var PuppeteerPage = class extends EventEmitter4 {
2481
2509
  throw new Error("Invalid paras in new LsdPage");
2482
2510
  }
2483
2511
  super();
2512
+ const currentTime = getCurrentUnixTime4();
2484
2513
  this.#lsdBrowserContext = browserContext;
2485
2514
  this.#page = page;
2486
2515
  this.#status = "free";
2487
- const currentTime = getCurrentUnixTime4();
2488
- const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
2489
- this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId, relatedId, misc };
2516
+ this.#lastStatusUpdateTime = currentTime;
2517
+ const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
2518
+ this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, taskId, relatedId, misc };
2490
2519
  this.#pageId = `PuppeteerPage-${browserIdx}-${browserContextIdx}-${pageIdx}`;
2491
2520
  this.#userAgent = browserContext.userAgent();
2492
2521
  this.#closeWhenFree = false;
@@ -2583,6 +2612,7 @@ var PuppeteerPage = class extends EventEmitter4 {
2583
2612
  await this.#page.close();
2584
2613
  this.#page = null;
2585
2614
  this.#status = "closed";
2615
+ this.#lastStatusUpdateTime = getCurrentUnixTime4();
2586
2616
  loginfo(`##browser LsdPage ${this.#pageId} is closed`);
2587
2617
  return true;
2588
2618
  }
@@ -2672,6 +2702,7 @@ var PuppeteerPage = class extends EventEmitter4 {
2672
2702
  logwarn(`##browser LsdPage ${this.#pageId} is already free.`);
2673
2703
  }
2674
2704
  this.#status = "free";
2705
+ this.#lastStatusUpdateTime = getCurrentUnixTime4();
2675
2706
  logdbg(`##browser LsdPage ${this.#pageId} is freed`);
2676
2707
  await this.clearRequestInterceptions();
2677
2708
  await this.clearResponseInterceptions();
@@ -2711,8 +2742,25 @@ var PuppeteerPage = class extends EventEmitter4 {
2711
2742
  id() {
2712
2743
  return this.#pageId;
2713
2744
  }
2714
- isFree() {
2715
- return this.#status === "free";
2745
+ isAvailable(domainName = "") {
2746
+ if (domainName) {
2747
+ return this.#status === "free" && this.url().includes(domainName);
2748
+ } else if (this.#status !== "free") {
2749
+ return false;
2750
+ } else {
2751
+ const url = this.url();
2752
+ if (!url || url === "about:blank") {
2753
+ return true;
2754
+ }
2755
+ const maxReservedSeconds = this.#lsdBrowserContext.maxReservedSeconds();
2756
+ if (maxReservedSeconds <= 0) {
2757
+ return true;
2758
+ }
2759
+ return getCurrentUnixTime4() - this.#lastStatusUpdateTime >= maxReservedSeconds;
2760
+ }
2761
+ }
2762
+ lastStatusUpdateTime() {
2763
+ return this.#lastStatusUpdateTime;
2716
2764
  }
2717
2765
  async localStroage() {
2718
2766
  if (!this.#page) {
@@ -2906,10 +2954,7 @@ var PuppeteerPage = class extends EventEmitter4 {
2906
2954
  throw new Error("Invalid paras in setPageInfo");
2907
2955
  }
2908
2956
  const actPageInfo = this.#page.pageInfo;
2909
- const { lastStatusUpdateTime, taskId, relatedId, misc } = pageInfo;
2910
- if (typeof lastStatusUpdateTime === "number") {
2911
- actPageInfo.lastStatusUpdateTime = lastStatusUpdateTime;
2912
- }
2957
+ const { taskId, relatedId, misc } = pageInfo;
2913
2958
  if (typeof taskId === "number") {
2914
2959
  actPageInfo.taskId = taskId;
2915
2960
  const debug = this.#page && this.#page.pageInfo && this.#page.pageInfo.taskId < 0;
@@ -3127,6 +3172,7 @@ var PuppeteerPage = class extends EventEmitter4 {
3127
3172
  throw new Error(`Page ${this.#pageId} is already busy!!!`);
3128
3173
  }
3129
3174
  this.#status = "busy";
3175
+ this.#lastStatusUpdateTime = getCurrentUnixTime4();
3130
3176
  logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
3131
3177
  return true;
3132
3178
  }
@@ -3220,6 +3266,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3220
3266
  */
3221
3267
  #bcUserAgent;
3222
3268
  #userAgent;
3269
+ #maxReservedSeconds;
3223
3270
  #createTime;
3224
3271
  #lastStatusUpdateTime;
3225
3272
  #status;
@@ -3237,9 +3284,8 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3237
3284
  }
3238
3285
  const pages = await this.#browserContext.pages();
3239
3286
  const openType = this.#lsdBrowser.browserCreationMethod();
3240
- const lastStatusUpdateTime = getCurrentUnixTime5();
3241
3287
  for (const page of pages) {
3242
- const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, lastStatusUpdateTime, taskId: 0, relatedId: 0, misc: {} };
3288
+ const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, taskId: 0, relatedId: 0, misc: {} };
3243
3289
  const lsdPage = new PuppeteerPage(this, page, pageInfo);
3244
3290
  this.#lsdPages.push(lsdPage);
3245
3291
  if (this.#maxViewportOfNewPage) {
@@ -3257,7 +3303,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3257
3303
  }
3258
3304
  }
3259
3305
  }
3260
- constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxViewportOfNewPage = true) {
3306
+ constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxReservedSeconds = 0, maxViewportOfNewPage = true) {
3261
3307
  if (!lsdBrowser || typeof lsdBrowser.browserContexts !== "function") {
3262
3308
  throw new Error(`Invalid lsdBrowser parameter`);
3263
3309
  }
@@ -3272,6 +3318,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3272
3318
  this.#browserContextCreationMethod = browserContextCreationMethod;
3273
3319
  this.#bcUserAgent = userAgent;
3274
3320
  this.#userAgent = userAgent;
3321
+ this.#maxReservedSeconds = maxReservedSeconds;
3275
3322
  const currentTime = getCurrentUnixTime5();
3276
3323
  this.#createTime = currentTime;
3277
3324
  this.#lastStatusUpdateTime = currentTime;
@@ -3298,7 +3345,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3298
3345
  logwarn(`##browser page-${browserIdx2}-${browserContextIdx2}-${pageIdx} has been already created`);
3299
3346
  } else {
3300
3347
  const currentTime2 = getCurrentUnixTime5();
3301
- const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
3348
+ const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
3302
3349
  const lsdPage = new PuppeteerPage(this, page, pageInfo2);
3303
3350
  this.#lsdPages.push(lsdPage);
3304
3351
  if (this.#maxViewportOfNewPage) {
@@ -3371,7 +3418,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3371
3418
  if (maxPageFreeSeconds <= 0) {
3372
3419
  maxPageFreeSeconds = this.#maxPageFreeSeconds;
3373
3420
  }
3374
- if (maxPageFreeSeconds <= 0) {
3421
+ if (maxPageFreeSeconds <= 0 || maxPageFreeSeconds < this.#maxReservedSeconds + 60) {
3375
3422
  logwarn(`##browser LsdBrowserContext please set valid maxPageFreeSeconds to close free pages`);
3376
3423
  return false;
3377
3424
  }
@@ -3381,7 +3428,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3381
3428
  }
3382
3429
  try {
3383
3430
  const maxUpdateTime = getCurrentUnixTime5() - this.#maxPageFreeSeconds;
3384
- let freePages = this.#lsdPages.filter((p) => p.isFree() && p.pageInfo().lastStatusUpdateTime < maxUpdateTime);
3431
+ let freePages = this.#lsdPages.filter((p) => p.status() === "free" && p.lastStatusUpdateTime() < maxUpdateTime);
3385
3432
  if (freePages.length === this.#lsdPages.length) {
3386
3433
  freePages = freePages.slice(1);
3387
3434
  }
@@ -3406,7 +3453,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3406
3453
  const { browserIncognitos: incognitos } = browserContextRequirements;
3407
3454
  return incognitos.length === 0 || incognitos.includes(this.#incognito);
3408
3455
  }
3409
- async getPage(always = false) {
3456
+ async getPage(domainName = "", always = false) {
3410
3457
  if (!this.#browserContext) {
3411
3458
  throw new Error("Invalid browserContext");
3412
3459
  }
@@ -3418,7 +3465,10 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3418
3465
  if (this.#lsdPages.length === 0) {
3419
3466
  await sleep2(1e3);
3420
3467
  }
3421
- let lsdPage = this.#lsdPages.find((p) => p.isFree());
3468
+ let lsdPage = this.#lsdPages.find((p) => p.isAvailable(domainName));
3469
+ if (!lsdPage && domainName) {
3470
+ lsdPage = this.#lsdPages.find((p) => p.isAvailable());
3471
+ }
3422
3472
  if (lsdPage) {
3423
3473
  lsdPage.use();
3424
3474
  this.#freeGettingLock();
@@ -3438,7 +3488,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3438
3488
  } else {
3439
3489
  pageInfo.openType = "newpage";
3440
3490
  }
3441
- lsdPage = this.#lsdPages.find((p) => p.isFree());
3491
+ lsdPage = this.#lsdPages.find((p) => p.isAvailable());
3442
3492
  if (lsdPage) {
3443
3493
  if (!this.#userAgent) {
3444
3494
  const userAgent = await lsdPage.evaluate(() => navigator.userAgent);
@@ -3473,7 +3523,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3473
3523
  hasFreePage(pageNum = 1) {
3474
3524
  if (this.#maxPagesPerBrowserContext - this.#lsdPages.length > pageNum) {
3475
3525
  return true;
3476
- } else if (this.#maxPagesPerBrowserContext - this.#lsdPages.filter((p) => !p.isFree()).length > pageNum) {
3526
+ } else if (this.#maxPagesPerBrowserContext - this.#lsdPages.filter((p) => !p.isAvailable()).length > pageNum) {
3477
3527
  return true;
3478
3528
  } else {
3479
3529
  return false;
@@ -3488,6 +3538,9 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3488
3538
  isFree() {
3489
3539
  return this.#status === "free";
3490
3540
  }
3541
+ maxReservedSeconds() {
3542
+ return this.#maxReservedSeconds;
3543
+ }
3491
3544
  page(pageIdx) {
3492
3545
  const lsdPage = this.#lsdPages.find((p) => p.pageInfo().pageIdx === pageIdx);
3493
3546
  return lsdPage ? lsdPage : null;
@@ -3602,7 +3655,7 @@ var PuppeteerBrowser = class _PuppeteerBrowser extends EventEmitter6 {
3602
3655
  throw new Error(`Invalid puppeteer browser parameter`);
3603
3656
  }
3604
3657
  super();
3605
- const { closeFreePagesIntervalSeconds = 300, maxPageFreeSeconds = 900, maxViewportOfNewPage = true, headless = false, executablePath = "" } = options;
3658
+ const { closeFreePagesIntervalSeconds = 300, maxPageFreeSeconds = 900, maxReservedSeconds = 0, maxViewportOfNewPage = true, headless = false, executablePath = "" } = options;
3606
3659
  this.#browser = browser;
3607
3660
  this.#browserIdx = browserIdx;
3608
3661
  this.#pid = pid;
@@ -3624,7 +3677,7 @@ var PuppeteerBrowser = class _PuppeteerBrowser extends EventEmitter6 {
3624
3677
  const browserContexts = browser.browserContexts();
3625
3678
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : false;
3626
3679
  for (const browserContext of browserContexts) {
3627
- const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), this.#userAgent(), maxViewportOfNewPage);
3680
+ const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), this.#userAgent(), maxReservedSeconds, maxViewportOfNewPage);
3628
3681
  this.#lsdBrowserContexts.push(lsdBrowserContext);
3629
3682
  }
3630
3683
  browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
@@ -3678,8 +3731,8 @@ var PuppeteerBrowser = class _PuppeteerBrowser extends EventEmitter6 {
3678
3731
  userAgent = lsdLaunchOptions.headlessUserAgent;
3679
3732
  }
3680
3733
  const browserContext = await this.#browser.createBrowserContext(browserContextOptions);
3681
- const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
3682
- const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxViewportOfNewPage);
3734
+ const { maxReservedSeconds, maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
3735
+ const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxReservedSeconds, maxViewportOfNewPage);
3683
3736
  this.#lsdBrowserContexts.push(lsdBrowserContext);
3684
3737
  return lsdBrowserContext;
3685
3738
  }
@@ -4010,7 +4063,10 @@ var CheerioPage = class extends EventEmitter7 {
4010
4063
  id() {
4011
4064
  throw new Error("Not supported in CheerioPage.");
4012
4065
  }
4013
- isFree() {
4066
+ isAvailable() {
4067
+ throw new Error("Not supported in CheerioPage.");
4068
+ }
4069
+ lastStatusUpdateTime() {
4014
4070
  throw new Error("Not supported in CheerioPage.");
4015
4071
  }
4016
4072
  load(html, isHtml = true) {
@@ -4443,6 +4499,7 @@ var PatchrightPage = class extends EventEmitter8 {
4443
4499
  #lsdBrowserContext;
4444
4500
  #page;
4445
4501
  #status;
4502
+ #lastStatusUpdateTime;
4446
4503
  #pageId;
4447
4504
  #closeWhenFree;
4448
4505
  #resquestInterceptionOptions;
@@ -4685,12 +4742,12 @@ var PatchrightPage = class extends EventEmitter8 {
4685
4742
  const pageInfo = p.pageInfo;
4686
4743
  let popupPageId = "page";
4687
4744
  if (pageInfo) {
4688
- const { browserIdx, browserContextIdx, pageIdx } = pageInfo;
4745
+ const { taskId, browserIdx, browserContextIdx, pageIdx } = pageInfo;
4689
4746
  popupPageId = `page-${browserIdx}-${browserContextIdx}-${pageIdx}`;
4690
4747
  pageInfo.openType = "popup";
4691
4748
  evtData = this.browserContext().page(pageIdx);
4692
- if (evtData && page.pageInfo?.taskId) {
4693
- pageInfo.relatedId = page.pageInfo.taskId;
4749
+ if (evtData) {
4750
+ evtData.setPageInfo({ taskId: POPUP_TASK_ID, relatedId: taskId });
4694
4751
  }
4695
4752
  } else {
4696
4753
  logerr(`##browser page ${pageId} has popup without page.pageInfo @LsdPage`);
@@ -4707,12 +4764,13 @@ var PatchrightPage = class extends EventEmitter8 {
4707
4764
  throw new Error("Invalid paras in new LsdPage");
4708
4765
  }
4709
4766
  super();
4767
+ const currentTime = getCurrentUnixTime7();
4710
4768
  this.#lsdBrowserContext = browserContext;
4711
4769
  this.#page = page;
4712
4770
  this.#status = "free";
4713
- const currentTime = getCurrentUnixTime7();
4714
- const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
4715
- this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId, relatedId, misc };
4771
+ this.#lastStatusUpdateTime = currentTime;
4772
+ const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
4773
+ this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, taskId, relatedId, misc };
4716
4774
  this.#pageId = `PatchrightPage-${browserIdx}-${browserContextIdx}-${pageIdx}`;
4717
4775
  this.#closeWhenFree = false;
4718
4776
  this.#resquestInterceptionOptions = [];
@@ -4812,6 +4870,7 @@ var PatchrightPage = class extends EventEmitter8 {
4812
4870
  await this.#page.close();
4813
4871
  this.#page = null;
4814
4872
  this.#status = "closed";
4873
+ this.#lastStatusUpdateTime = getCurrentUnixTime7();
4815
4874
  loginfo(`##browser LsdPage ${this.#pageId} is closed`);
4816
4875
  return true;
4817
4876
  }
@@ -4900,6 +4959,7 @@ var PatchrightPage = class extends EventEmitter8 {
4900
4959
  logwarn(`##browser LsdPage ${this.#pageId} is already free.`);
4901
4960
  }
4902
4961
  this.#status = "free";
4962
+ this.#lastStatusUpdateTime = getCurrentUnixTime7();
4903
4963
  logdbg(`##browser LsdPage ${this.#pageId} is freed`);
4904
4964
  await this.clearRequestInterceptions();
4905
4965
  await this.clearResponseInterceptions();
@@ -4935,8 +4995,25 @@ var PatchrightPage = class extends EventEmitter8 {
4935
4995
  id() {
4936
4996
  return this.#pageId;
4937
4997
  }
4938
- isFree() {
4939
- return this.#status === "free";
4998
+ isAvailable(domainName = "") {
4999
+ if (domainName) {
5000
+ return this.#status === "free" && this.url().includes(domainName);
5001
+ } else if (this.#status !== "free") {
5002
+ return false;
5003
+ } else {
5004
+ const url = this.url();
5005
+ if (!url || url === "about:blank") {
5006
+ return true;
5007
+ }
5008
+ const maxReservedSeconds = this.#lsdBrowserContext.maxReservedSeconds();
5009
+ if (maxReservedSeconds <= 0) {
5010
+ return true;
5011
+ }
5012
+ return getCurrentUnixTime7() - this.#lastStatusUpdateTime >= maxReservedSeconds;
5013
+ }
5014
+ }
5015
+ lastStatusUpdateTime() {
5016
+ return this.#lastStatusUpdateTime;
4940
5017
  }
4941
5018
  async localStroage() {
4942
5019
  if (!this.#page) {
@@ -5131,10 +5208,7 @@ var PatchrightPage = class extends EventEmitter8 {
5131
5208
  throw new Error("Invalid paras in setPageInfo");
5132
5209
  }
5133
5210
  const actPageInfo = this.#page.pageInfo;
5134
- const { lastStatusUpdateTime, taskId, relatedId, misc } = pageInfo;
5135
- if (typeof lastStatusUpdateTime === "number") {
5136
- actPageInfo.lastStatusUpdateTime = lastStatusUpdateTime;
5137
- }
5211
+ const { taskId, relatedId, misc } = pageInfo;
5138
5212
  if (typeof taskId === "number") {
5139
5213
  actPageInfo.taskId = taskId;
5140
5214
  const debug = this.#page && this.#page.pageInfo && this.#page.pageInfo.taskId < 0;
@@ -5365,6 +5439,7 @@ var PatchrightPage = class extends EventEmitter8 {
5365
5439
  throw new Error(`Page ${this.#pageId} is already busy!!!`);
5366
5440
  }
5367
5441
  this.#status = "busy";
5442
+ this.#lastStatusUpdateTime = getCurrentUnixTime7();
5368
5443
  logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
5369
5444
  return true;
5370
5445
  }
@@ -5487,10 +5562,11 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
5487
5562
  #browserContext;
5488
5563
  #browserContextCreationMethod;
5489
5564
  #userAgent;
5565
+ #maxReservedSeconds;
5490
5566
  #apiContext;
5491
5567
  #createTime;
5492
- #lastStatusUpdateTime;
5493
5568
  #status;
5569
+ #lastStatusUpdateTime;
5494
5570
  #incognito;
5495
5571
  #proxy;
5496
5572
  #maxPagesPerBrowserContext;
@@ -5505,9 +5581,8 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
5505
5581
  }
5506
5582
  const pages = this.#browserContext.pages();
5507
5583
  const openType = this.#lsdBrowser.browserCreationMethod();
5508
- const lastStatusUpdateTime = getCurrentUnixTime8();
5509
5584
  for (const page of pages) {
5510
- const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, lastStatusUpdateTime, taskId: 0, relatedId: 0, misc: {} };
5585
+ const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, taskId: 0, relatedId: 0, misc: {} };
5511
5586
  const lsdPage = new PatchrightPage(this, page, pageInfo);
5512
5587
  this.#lsdPages.push(lsdPage);
5513
5588
  if (this.#maxViewportOfNewPage) {
@@ -5522,7 +5597,7 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
5522
5597
  }
5523
5598
  }
5524
5599
  }
5525
- constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxViewportOfNewPage = true) {
5600
+ constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxReservedSeconds = 0, maxViewportOfNewPage = true) {
5526
5601
  if (!lsdBrowser || typeof lsdBrowser.browserContexts !== "function") {
5527
5602
  throw new Error(`Invalid lsdBrowser parameter`);
5528
5603
  }
@@ -5536,12 +5611,13 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
5536
5611
  this.#browserContext = browserContext;
5537
5612
  this.#browserContextCreationMethod = browserContextCreationMethod;
5538
5613
  this.#userAgent = userAgent;
5614
+ this.#maxReservedSeconds = maxReservedSeconds;
5539
5615
  const apiRequestContext = browserContext.request;
5540
5616
  this.#apiContext = new PatchrightApiContext(apiRequestContext);
5541
5617
  const currentTime = getCurrentUnixTime8();
5542
5618
  this.#createTime = currentTime;
5543
- this.#lastStatusUpdateTime = currentTime;
5544
5619
  this.#status = "free";
5620
+ this.#lastStatusUpdateTime = currentTime;
5545
5621
  this.#incognito = incognito === false ? false : true;
5546
5622
  this.#proxy = proxy?.proxyUrl ? proxy : null;
5547
5623
  this.#maxPagesPerBrowserContext = maxPagesPerBrowserContext;
@@ -5559,7 +5635,7 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
5559
5635
  logwarn(`##browser page-${browserIdx2}-${browserContextIdx2}-${pageIdx} has been already created`);
5560
5636
  } else {
5561
5637
  const currentTime2 = getCurrentUnixTime8();
5562
- const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
5638
+ const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
5563
5639
  const lsdPage = new PatchrightPage(this, page, pageInfo2);
5564
5640
  this.#lsdPages.push(lsdPage);
5565
5641
  if (this.#maxViewportOfNewPage) {
@@ -5625,7 +5701,7 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
5625
5701
  if (maxPageFreeSeconds <= 0) {
5626
5702
  maxPageFreeSeconds = this.#maxPageFreeSeconds;
5627
5703
  }
5628
- if (maxPageFreeSeconds <= 0) {
5704
+ if (maxPageFreeSeconds <= 0 || maxPageFreeSeconds < this.#maxReservedSeconds + 60) {
5629
5705
  logwarn(`##browser LsdBrowserContext please set valid maxPageFreeSeconds to close free pages`);
5630
5706
  return false;
5631
5707
  }
@@ -5635,7 +5711,7 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
5635
5711
  }
5636
5712
  try {
5637
5713
  const maxUpdateTime = getCurrentUnixTime8() - this.#maxPageFreeSeconds;
5638
- let freePages = this.#lsdPages.filter((p) => p.isFree() && p.pageInfo().lastStatusUpdateTime < maxUpdateTime);
5714
+ let freePages = this.#lsdPages.filter((p) => p.status() === "free" && p.lastStatusUpdateTime() < maxUpdateTime);
5639
5715
  if (freePages.length === this.#lsdPages.length) {
5640
5716
  freePages = freePages.slice(1);
5641
5717
  }
@@ -5660,7 +5736,7 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
5660
5736
  const { browserIncognitos: incognitos } = browserContextRequirements;
5661
5737
  return incognitos.length === 0 || incognitos.includes(this.#incognito);
5662
5738
  }
5663
- async getPage(always = false) {
5739
+ async getPage(domainName = "", always = false) {
5664
5740
  if (!this.#browserContext) {
5665
5741
  throw new Error("Invalid browserContext");
5666
5742
  }
@@ -5669,7 +5745,10 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
5669
5745
  return null;
5670
5746
  }
5671
5747
  try {
5672
- let lsdPage = this.#lsdPages.find((p) => p.isFree());
5748
+ let lsdPage = this.#lsdPages.find((p) => p.isAvailable(domainName));
5749
+ if (!lsdPage && domainName) {
5750
+ lsdPage = this.#lsdPages.find((p) => p.isAvailable());
5751
+ }
5673
5752
  if (lsdPage) {
5674
5753
  lsdPage.use();
5675
5754
  this.#freeGettingLock();
@@ -5687,7 +5766,7 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
5687
5766
  } else {
5688
5767
  pageInfo.openType = "newpage";
5689
5768
  }
5690
- lsdPage = this.#lsdPages.find((p) => p.isFree());
5769
+ lsdPage = this.#lsdPages.find((p) => p.isAvailable());
5691
5770
  if (lsdPage) {
5692
5771
  if (!this.#userAgent) {
5693
5772
  const userAgent = await lsdPage.evaluate(() => navigator.userAgent);
@@ -5722,7 +5801,7 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
5722
5801
  hasFreePage(pageNum = 1) {
5723
5802
  if (this.#maxPagesPerBrowserContext - this.#lsdPages.length > pageNum) {
5724
5803
  return true;
5725
- } else if (this.#maxPagesPerBrowserContext - this.#lsdPages.filter((p) => !p.isFree()).length > pageNum) {
5804
+ } else if (this.#maxPagesPerBrowserContext - this.#lsdPages.filter((p) => !p.isAvailable()).length > pageNum) {
5726
5805
  return true;
5727
5806
  } else {
5728
5807
  return false;
@@ -5737,6 +5816,9 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
5737
5816
  isIncognito() {
5738
5817
  return this.#incognito;
5739
5818
  }
5819
+ maxReservedSeconds() {
5820
+ return this.#maxReservedSeconds;
5821
+ }
5740
5822
  page(pageIdx) {
5741
5823
  const lsdPage = this.#lsdPages.find((p) => p.pageInfo().pageIdx === pageIdx);
5742
5824
  return lsdPage ? lsdPage : null;
@@ -5848,7 +5930,7 @@ var PatchrightBrowser = class _PatchrightBrowser extends EventEmitter10 {
5848
5930
  throw new Error(`Invalid playwright browser parameter`);
5849
5931
  }
5850
5932
  super();
5851
- const { closeFreePagesIntervalSeconds = 300, maxPageFreeSeconds = 900, maxViewportOfNewPage = true, headless = false, executablePath = "" } = options;
5933
+ const { closeFreePagesIntervalSeconds = 300, maxPageFreeSeconds = 900, maxReservedSeconds = 0, maxViewportOfNewPage = true, headless = false, executablePath = "" } = options;
5852
5934
  this.#browser = browser;
5853
5935
  this.#browserIdx = browserIdx;
5854
5936
  this.#pid = pid;
@@ -5873,7 +5955,7 @@ var PatchrightBrowser = class _PatchrightBrowser extends EventEmitter10 {
5873
5955
  }
5874
5956
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
5875
5957
  for (const browserContext of browserContexts) {
5876
- const lsdBrowserContext = new PatchrightBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), "", maxViewportOfNewPage);
5958
+ const lsdBrowserContext = new PatchrightBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), "", maxReservedSeconds, maxViewportOfNewPage);
5877
5959
  this.#lsdBrowserContexts.push(lsdBrowserContext);
5878
5960
  }
5879
5961
  browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
@@ -5934,8 +6016,8 @@ var PatchrightBrowser = class _PatchrightBrowser extends EventEmitter10 {
5934
6016
  browserContextOptions.userAgent = userAgent;
5935
6017
  }
5936
6018
  const browserContext = await this.#browser.newContext(browserContextOptions);
5937
- const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
5938
- const lsdBrowserContext = new PatchrightBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxViewportOfNewPage);
6019
+ const { maxReservedSeconds, maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
6020
+ const lsdBrowserContext = new PatchrightBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxReservedSeconds, maxViewportOfNewPage);
5939
6021
  this.#lsdBrowserContexts.push(lsdBrowserContext);
5940
6022
  return lsdBrowserContext;
5941
6023
  }
@@ -6323,6 +6405,7 @@ var CamoufoxPage = class extends EventEmitter11 {
6323
6405
  #lsdBrowserContext;
6324
6406
  #page;
6325
6407
  #status;
6408
+ #lastStatusUpdateTime;
6326
6409
  #pageId;
6327
6410
  #closeWhenFree;
6328
6411
  #resquestInterceptionOptions;
@@ -6565,12 +6648,12 @@ var CamoufoxPage = class extends EventEmitter11 {
6565
6648
  const pageInfo = p.pageInfo;
6566
6649
  let popupPageId = "page";
6567
6650
  if (pageInfo) {
6568
- const { browserIdx, browserContextIdx, pageIdx } = pageInfo;
6651
+ const { taskId, browserIdx, browserContextIdx, pageIdx } = pageInfo;
6569
6652
  popupPageId = `page-${browserIdx}-${browserContextIdx}-${pageIdx}`;
6570
6653
  pageInfo.openType = "popup";
6571
6654
  evtData = this.browserContext().page(pageIdx);
6572
- if (evtData && page.pageInfo?.taskId) {
6573
- pageInfo.relatedId = page.pageInfo.taskId;
6655
+ if (evtData) {
6656
+ evtData.setPageInfo({ taskId: POPUP_TASK_ID, relatedId: taskId });
6574
6657
  }
6575
6658
  } else {
6576
6659
  logerr(`##browser page ${pageId} has popup without page.pageInfo @LsdPage`);
@@ -6587,12 +6670,13 @@ var CamoufoxPage = class extends EventEmitter11 {
6587
6670
  throw new Error("Invalid paras in new LsdPage");
6588
6671
  }
6589
6672
  super();
6673
+ const currentTime = getCurrentUnixTime10();
6590
6674
  this.#lsdBrowserContext = browserContext;
6591
6675
  this.#page = page;
6592
6676
  this.#status = "free";
6593
- const currentTime = getCurrentUnixTime10();
6594
- const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
6595
- this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId, relatedId, misc };
6677
+ this.#lastStatusUpdateTime = currentTime;
6678
+ const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
6679
+ this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, taskId, relatedId, misc };
6596
6680
  this.#pageId = `CamoufoxPage-${browserIdx}-${browserContextIdx}-${pageIdx}`;
6597
6681
  this.#closeWhenFree = false;
6598
6682
  this.#resquestInterceptionOptions = [];
@@ -6678,6 +6762,7 @@ var CamoufoxPage = class extends EventEmitter11 {
6678
6762
  await this.#page.close();
6679
6763
  this.#page = null;
6680
6764
  this.#status = "closed";
6765
+ this.#lastStatusUpdateTime = getCurrentUnixTime10();
6681
6766
  loginfo(`##browser LsdPage ${this.#pageId} is closed`);
6682
6767
  return true;
6683
6768
  }
@@ -6767,6 +6852,7 @@ var CamoufoxPage = class extends EventEmitter11 {
6767
6852
  logwarn(`##browser LsdPage ${this.#pageId} is already free.`);
6768
6853
  }
6769
6854
  this.#status = "free";
6855
+ this.#lastStatusUpdateTime = getCurrentUnixTime10();
6770
6856
  logdbg(`##browser LsdPage ${this.#pageId} is freed`);
6771
6857
  await this.clearRequestInterceptions();
6772
6858
  await this.clearResponseInterceptions();
@@ -6802,8 +6888,25 @@ var CamoufoxPage = class extends EventEmitter11 {
6802
6888
  id() {
6803
6889
  return this.#pageId;
6804
6890
  }
6805
- isFree() {
6806
- return this.#status === "free";
6891
+ isAvailable(domainName = "") {
6892
+ if (domainName) {
6893
+ return this.#status === "free" && this.url().includes(domainName);
6894
+ } else if (this.#status !== "free") {
6895
+ return false;
6896
+ } else {
6897
+ const url = this.url();
6898
+ if (!url || url === "about:blank") {
6899
+ return true;
6900
+ }
6901
+ const maxReservedSeconds = this.#lsdBrowserContext.maxReservedSeconds();
6902
+ if (maxReservedSeconds <= 0) {
6903
+ return true;
6904
+ }
6905
+ return getCurrentUnixTime10() - this.#lastStatusUpdateTime >= maxReservedSeconds;
6906
+ }
6907
+ }
6908
+ lastStatusUpdateTime() {
6909
+ return this.#lastStatusUpdateTime;
6807
6910
  }
6808
6911
  async localStroage() {
6809
6912
  if (!this.#page) {
@@ -6983,10 +7086,7 @@ var CamoufoxPage = class extends EventEmitter11 {
6983
7086
  throw new Error("Invalid paras in setPageInfo");
6984
7087
  }
6985
7088
  const actPageInfo = this.#page.pageInfo;
6986
- const { lastStatusUpdateTime, taskId, relatedId, misc } = pageInfo;
6987
- if (typeof lastStatusUpdateTime === "number") {
6988
- actPageInfo.lastStatusUpdateTime = lastStatusUpdateTime;
6989
- }
7089
+ const { taskId, relatedId, misc } = pageInfo;
6990
7090
  if (typeof taskId === "number") {
6991
7091
  actPageInfo.taskId = taskId;
6992
7092
  const debug = this.#page && this.#page.pageInfo && this.#page.pageInfo.taskId < 0;
@@ -7217,6 +7317,7 @@ var CamoufoxPage = class extends EventEmitter11 {
7217
7317
  throw new Error(`Page ${this.#pageId} is already busy!!!`);
7218
7318
  }
7219
7319
  this.#status = "busy";
7320
+ this.#lastStatusUpdateTime = getCurrentUnixTime10();
7220
7321
  logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
7221
7322
  return true;
7222
7323
  }
@@ -7338,10 +7439,11 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
7338
7439
  #browserContext;
7339
7440
  #browserContextCreationMethod;
7340
7441
  #userAgent;
7442
+ #maxReservedSeconds;
7341
7443
  #apiContext;
7342
7444
  #createTime;
7343
- #lastStatusUpdateTime;
7344
7445
  #status;
7446
+ #lastStatusUpdateTime;
7345
7447
  #incognito;
7346
7448
  #proxy;
7347
7449
  #maxPagesPerBrowserContext;
@@ -7356,9 +7458,8 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
7356
7458
  }
7357
7459
  const pages = this.#browserContext.pages();
7358
7460
  const openType = this.#lsdBrowser.browserCreationMethod();
7359
- const lastStatusUpdateTime = getCurrentUnixTime11();
7360
7461
  for (const page of pages) {
7361
- const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, lastStatusUpdateTime, taskId: 0, relatedId: 0, misc: {} };
7462
+ const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, taskId: 0, relatedId: 0, misc: {} };
7362
7463
  const lsdPage = new CamoufoxPage(this, page, pageInfo);
7363
7464
  this.#lsdPages.push(lsdPage);
7364
7465
  if (this.#maxViewportOfNewPage) {
@@ -7373,7 +7474,7 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
7373
7474
  }
7374
7475
  }
7375
7476
  }
7376
- constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxViewportOfNewPage = true) {
7477
+ constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxReservedSeconds = 0, maxViewportOfNewPage = true) {
7377
7478
  if (!lsdBrowser || typeof lsdBrowser.browserContexts !== "function") {
7378
7479
  throw new Error(`Invalid lsdBrowser parameter`);
7379
7480
  }
@@ -7387,12 +7488,13 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
7387
7488
  this.#browserContext = browserContext;
7388
7489
  this.#browserContextCreationMethod = browserContextCreationMethod;
7389
7490
  this.#userAgent = userAgent;
7491
+ this.#maxReservedSeconds = maxReservedSeconds;
7390
7492
  const apiRequestContext = browserContext.request;
7391
7493
  this.#apiContext = new CamoufoxApiContext(apiRequestContext);
7392
7494
  const currentTime = getCurrentUnixTime11();
7393
7495
  this.#createTime = currentTime;
7394
- this.#lastStatusUpdateTime = currentTime;
7395
7496
  this.#status = "free";
7497
+ this.#lastStatusUpdateTime = currentTime;
7396
7498
  this.#incognito = incognito === false ? false : true;
7397
7499
  this.#proxy = proxy?.proxyUrl ? proxy : null;
7398
7500
  this.#maxPagesPerBrowserContext = maxPagesPerBrowserContext;
@@ -7410,7 +7512,7 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
7410
7512
  logwarn(`##browser page-${browserIdx2}-${browserContextIdx2}-${pageIdx} has been already created`);
7411
7513
  } else {
7412
7514
  const currentTime2 = getCurrentUnixTime11();
7413
- const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
7515
+ const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
7414
7516
  const lsdPage = new CamoufoxPage(this, page, pageInfo2);
7415
7517
  this.#lsdPages.push(lsdPage);
7416
7518
  if (this.#maxViewportOfNewPage) {
@@ -7476,7 +7578,7 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
7476
7578
  if (maxPageFreeSeconds <= 0) {
7477
7579
  maxPageFreeSeconds = this.#maxPageFreeSeconds;
7478
7580
  }
7479
- if (maxPageFreeSeconds <= 0) {
7581
+ if (maxPageFreeSeconds <= 0 || maxPageFreeSeconds < this.#maxReservedSeconds + 60) {
7480
7582
  logwarn(`##browser LsdBrowserContext please set valid maxPageFreeSeconds to close free pages`);
7481
7583
  return false;
7482
7584
  }
@@ -7486,7 +7588,7 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
7486
7588
  }
7487
7589
  try {
7488
7590
  const maxUpdateTime = getCurrentUnixTime11() - this.#maxPageFreeSeconds;
7489
- let freePages = this.#lsdPages.filter((p) => p.isFree() && p.pageInfo().lastStatusUpdateTime < maxUpdateTime);
7591
+ let freePages = this.#lsdPages.filter((p) => p.status() === "free" && p.lastStatusUpdateTime() < maxUpdateTime);
7490
7592
  if (freePages.length === this.#lsdPages.length) {
7491
7593
  freePages = freePages.slice(1);
7492
7594
  }
@@ -7511,7 +7613,7 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
7511
7613
  const { browserIncognitos: incognitos } = browserContextRequirements;
7512
7614
  return incognitos.length === 0 || incognitos.includes(this.#incognito);
7513
7615
  }
7514
- async getPage(always = false) {
7616
+ async getPage(domainName = "", always = false) {
7515
7617
  if (!this.#browserContext) {
7516
7618
  throw new Error("Invalid browserContext");
7517
7619
  }
@@ -7520,7 +7622,10 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
7520
7622
  return null;
7521
7623
  }
7522
7624
  try {
7523
- let lsdPage = this.#lsdPages.find((p) => p.isFree());
7625
+ let lsdPage = this.#lsdPages.find((p) => p.isAvailable(domainName));
7626
+ if (!lsdPage && domainName) {
7627
+ lsdPage = this.#lsdPages.find((p) => p.isAvailable());
7628
+ }
7524
7629
  if (lsdPage) {
7525
7630
  lsdPage.use();
7526
7631
  this.#freeGettingLock();
@@ -7538,7 +7643,7 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
7538
7643
  } else {
7539
7644
  pageInfo.openType = "newpage";
7540
7645
  }
7541
- lsdPage = this.#lsdPages.find((p) => p.isFree());
7646
+ lsdPage = this.#lsdPages.find((p) => p.isAvailable());
7542
7647
  if (lsdPage) {
7543
7648
  if (!this.#userAgent) {
7544
7649
  const userAgent = await lsdPage.evaluate(() => navigator.userAgent);
@@ -7573,7 +7678,7 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
7573
7678
  hasFreePage(pageNum = 1) {
7574
7679
  if (this.#maxPagesPerBrowserContext - this.#lsdPages.length > pageNum) {
7575
7680
  return true;
7576
- } else if (this.#maxPagesPerBrowserContext - this.#lsdPages.filter((p) => !p.isFree()).length > pageNum) {
7681
+ } else if (this.#maxPagesPerBrowserContext - this.#lsdPages.filter((p) => !p.isAvailable()).length > pageNum) {
7577
7682
  return true;
7578
7683
  } else {
7579
7684
  return false;
@@ -7588,6 +7693,9 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
7588
7693
  isIncognito() {
7589
7694
  return this.#incognito;
7590
7695
  }
7696
+ maxReservedSeconds() {
7697
+ return this.#maxReservedSeconds;
7698
+ }
7591
7699
  page(pageIdx) {
7592
7700
  const lsdPage = this.#lsdPages.find((p) => p.pageInfo().pageIdx === pageIdx);
7593
7701
  return lsdPage ? lsdPage : null;
@@ -7699,7 +7807,7 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends EventEmitter13 {
7699
7807
  throw new Error(`Invalid camoufox browser parameter`);
7700
7808
  }
7701
7809
  super();
7702
- const { closeFreePagesIntervalSeconds = 300, maxPageFreeSeconds = 900, maxViewportOfNewPage = true, headless = false, executablePath = "" } = options;
7810
+ const { closeFreePagesIntervalSeconds = 300, maxPageFreeSeconds = 900, maxReservedSeconds = 0, maxViewportOfNewPage = true, headless = false, executablePath = "" } = options;
7703
7811
  this.#browser = browser;
7704
7812
  this.#browserIdx = browserIdx;
7705
7813
  this.#pid = pid;
@@ -7724,7 +7832,7 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends EventEmitter13 {
7724
7832
  }
7725
7833
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
7726
7834
  for (const browserContext of browserContexts) {
7727
- const lsdBrowserContext = new CamoufoxBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), "", maxViewportOfNewPage);
7835
+ const lsdBrowserContext = new CamoufoxBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), "", maxReservedSeconds, maxViewportOfNewPage);
7728
7836
  this.#lsdBrowserContexts.push(lsdBrowserContext);
7729
7837
  }
7730
7838
  browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
@@ -7785,8 +7893,8 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends EventEmitter13 {
7785
7893
  browserContextOptions.userAgent = userAgent;
7786
7894
  }
7787
7895
  const browserContext = await this.#browser.newContext(browserContextOptions);
7788
- const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
7789
- const lsdBrowserContext = new CamoufoxBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxViewportOfNewPage);
7896
+ const { maxReservedSeconds, maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
7897
+ const lsdBrowserContext = new CamoufoxBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxReservedSeconds, maxViewportOfNewPage);
7790
7898
  this.#lsdBrowserContexts.push(lsdBrowserContext);
7791
7899
  return lsdBrowserContext;
7792
7900
  }
@@ -7972,6 +8080,7 @@ var LsdBrowserController = class _LsdBrowserController {
7972
8080
  maxBrowserContextsPerBrowser = 10,
7973
8081
  maxPagesPerBrowserContext = 20,
7974
8082
  maxPageFreeSeconds = 900,
8083
+ maxReservedSeconds = 0,
7975
8084
  maxViewportOfNewPage = true,
7976
8085
  proxy = null,
7977
8086
  timeout = 3e4,
@@ -7988,7 +8097,7 @@ var LsdBrowserController = class _LsdBrowserController {
7988
8097
  } = options ? options : {};
7989
8098
  let browserPid = 0;
7990
8099
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : browserControllerType === "puppeteer" ? false : true;
7991
- const actOptions = { closeFreePagesIntervalSeconds, maxBrowserContextsPerBrowser, maxPagesPerBrowserContext, maxPageFreeSeconds, maxViewportOfNewPage, proxy, timeout, args, executablePath, maxWindowSize, headless, minBrowserContexts, incognito, proxyPerBrowserContext, userDataDir, userAgent, headlessUserAgent };
8100
+ const actOptions = { closeFreePagesIntervalSeconds, maxBrowserContextsPerBrowser, maxPagesPerBrowserContext, maxPageFreeSeconds, maxReservedSeconds, maxViewportOfNewPage, proxy, timeout, args, executablePath, maxWindowSize, headless, minBrowserContexts, incognito, proxyPerBrowserContext, userDataDir, userAgent, headlessUserAgent };
7992
8101
  let idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--incoginto"));
7993
8102
  if (idx >= 0) {
7994
8103
  logwarn(`##browser controller Please use options.incognito instead when launching new browser.`);
@@ -8263,6 +8372,7 @@ export {
8263
8372
  LsdBrowserContextEvent,
8264
8373
  LsdBrowserEvent,
8265
8374
  LsdPageEvent,
8375
+ POPUP_TASK_ID,
8266
8376
  PlaywrightBrowser,
8267
8377
  PlaywrightBrowserContext,
8268
8378
  PlaywrightElement,