@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.cjs +221 -110
- package/dist/index.d.cts +41 -12
- package/dist/index.d.ts +41 -12
- package/dist/index.js +220 -110
- package/package.json +2 -2
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
|
|
629
|
-
|
|
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
|
-
|
|
650
|
-
const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime,
|
|
651
|
-
this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime,
|
|
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
|
-
|
|
876
|
-
|
|
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 {
|
|
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,
|
|
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,
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
2467
|
-
|
|
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
|
-
|
|
2488
|
-
const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime,
|
|
2489
|
-
this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime,
|
|
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
|
-
|
|
2715
|
-
|
|
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 {
|
|
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,
|
|
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,
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
|
4693
|
-
|
|
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
|
-
|
|
4714
|
-
const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime,
|
|
4715
|
-
this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime,
|
|
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
|
-
|
|
4939
|
-
|
|
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 {
|
|
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,
|
|
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,
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
6573
|
-
|
|
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
|
-
|
|
6594
|
-
const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime,
|
|
6595
|
-
this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime,
|
|
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
|
-
|
|
6806
|
-
|
|
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 {
|
|
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,
|
|
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,
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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,
|