@letsscrapedata/controller 0.0.46 → 0.0.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1214,8 +1214,11 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
1214
1214
  #browserIdx;
1215
1215
  #browserContextIdx;
1216
1216
  #browserContext;
1217
+ #browserContextCreationMethod;
1217
1218
  #apiContext;
1218
1219
  #createTime;
1220
+ #lastStatusUpdateTime;
1221
+ #status;
1219
1222
  #incognito;
1220
1223
  #proxy;
1221
1224
  #maxPagesPerBrowserContext;
@@ -1241,7 +1244,7 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
1241
1244
  (0, import_utils3.loginfo)(`##browser ${lsdPage.id()} ${openType}ed`);
1242
1245
  }
1243
1246
  }
1244
- constructor(lsdBrowser, browserContext, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, maxViewportOfNewPage = true) {
1247
+ constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, maxViewportOfNewPage = true) {
1245
1248
  if (!lsdBrowser || typeof lsdBrowser.browserContexts !== "function") {
1246
1249
  throw new Error(`Invalid lsdBrowser parameter`);
1247
1250
  }
@@ -1253,9 +1256,13 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
1253
1256
  this.#browserIdx = browserIdx;
1254
1257
  this.#browserContextIdx = browserContextIdx;
1255
1258
  this.#browserContext = browserContext;
1259
+ this.#browserContextCreationMethod = browserContextCreationMethod;
1256
1260
  const apiRequestContext = browserContext.request;
1257
1261
  this.#apiContext = new PlaywrightApiContext(apiRequestContext);
1258
- this.#createTime = (0, import_utils3.getCurrentUnixTime)();
1262
+ const currentTime = (0, import_utils3.getCurrentUnixTime)();
1263
+ this.#createTime = currentTime;
1264
+ this.#lastStatusUpdateTime = currentTime;
1265
+ this.#status = "free";
1259
1266
  this.#incognito = incognito === false ? false : true;
1260
1267
  this.#proxy = proxy?.proxyUrl ? proxy : null;
1261
1268
  this.#maxPagesPerBrowserContext = maxPagesPerBrowserContext;
@@ -1271,8 +1278,8 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
1271
1278
  const { browserIdx: browserIdx2, browserContextIdx: browserContextIdx2, pageIdx } = pageInfo;
1272
1279
  (0, import_utils3.logwarn)(`##browser page-${browserIdx2}-${browserContextIdx2}-${pageIdx} has been already created`);
1273
1280
  } else {
1274
- const currentTime = (0, import_utils3.getCurrentUnixTime)();
1275
- const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime, lastStatusUpdateTime: currentTime, taskId: 0, relatedId: 0, misc: {} };
1281
+ const currentTime2 = (0, import_utils3.getCurrentUnixTime)();
1282
+ const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
1276
1283
  const lsdPage = new PlaywrightPage(this, page, pageInfo2);
1277
1284
  if (this.#maxViewportOfNewPage) {
1278
1285
  await lsdPage.maximizeViewport();
@@ -1309,7 +1316,10 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
1309
1316
  }
1310
1317
  async close() {
1311
1318
  if (this.#browserContext) {
1319
+ this.#status = "closed";
1320
+ this.#lastStatusUpdateTime = (0, import_utils3.getCurrentUnixTime)();
1312
1321
  await this.#browserContext.close();
1322
+ (0, import_utils3.loginfo)(`browserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
1313
1323
  }
1314
1324
  return true;
1315
1325
  }
@@ -1361,6 +1371,9 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
1361
1371
  return false;
1362
1372
  }
1363
1373
  }
1374
+ creationMethod() {
1375
+ return this.#browserContextCreationMethod;
1376
+ }
1364
1377
  doesMeetBrowserContextRequirements(browserContextRequirements) {
1365
1378
  if (!this.#lsdBrowser.doesMeetBrowserContextRequirements(browserContextRequirements)) {
1366
1379
  return false;
@@ -1410,6 +1423,15 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
1410
1423
  return null;
1411
1424
  }
1412
1425
  }
1426
+ free() {
1427
+ if (this.#status === "busy") {
1428
+ this.#status = "free";
1429
+ this.#lastStatusUpdateTime = (0, import_utils3.getCurrentUnixTime)();
1430
+ return true;
1431
+ } else {
1432
+ return false;
1433
+ }
1434
+ }
1413
1435
  hasFreePage(pageNum = 1) {
1414
1436
  if (this.#maxPagesPerBrowserContext - this.#lsdPages.length > pageNum) {
1415
1437
  return true;
@@ -1477,6 +1499,18 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
1477
1499
  return false;
1478
1500
  }
1479
1501
  }
1502
+ status() {
1503
+ return this.#status;
1504
+ }
1505
+ use() {
1506
+ if (this.#status === "free") {
1507
+ this.#status = "busy";
1508
+ this.#lastStatusUpdateTime = (0, import_utils3.getCurrentUnixTime)();
1509
+ return true;
1510
+ } else {
1511
+ return false;
1512
+ }
1513
+ }
1480
1514
  _origBrowserContext() {
1481
1515
  return this.#browserContext;
1482
1516
  }
@@ -1488,6 +1522,7 @@ var PlaywrightBrowser = class extends import_node_events3.default {
1488
1522
  #browser;
1489
1523
  #browserIdx;
1490
1524
  #pid;
1525
+ #createTime;
1491
1526
  #lsdBrowserContexts;
1492
1527
  #browserControllerType;
1493
1528
  #browserType;
@@ -1521,6 +1556,7 @@ var PlaywrightBrowser = class extends import_node_events3.default {
1521
1556
  this.#browser = browser;
1522
1557
  this.#browserIdx = browserIdx;
1523
1558
  this.#pid = pid;
1559
+ this.#createTime = (0, import_utils4.getCurrentUnixTime)();
1524
1560
  this.#lsdBrowserContexts = [];
1525
1561
  this.#browserControllerType = "playwright";
1526
1562
  this.#browserType = browerType;
@@ -1538,7 +1574,7 @@ var PlaywrightBrowser = class extends import_node_events3.default {
1538
1574
  }
1539
1575
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
1540
1576
  for (const browserContext of browserContexts) {
1541
- const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
1577
+ const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
1542
1578
  this.#lsdBrowserContexts.push(lsdBrowserContext);
1543
1579
  (0, import_utils4.loginfo)(`##browserContext ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
1544
1580
  }
@@ -1596,7 +1632,7 @@ var PlaywrightBrowser = class extends import_node_events3.default {
1596
1632
  }
1597
1633
  const browserContext = await this.#browser.newContext(browserContextOptions);
1598
1634
  const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
1599
- const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
1635
+ const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
1600
1636
  this.#lsdBrowserContexts.push(lsdBrowserContext);
1601
1637
  (0, import_utils4.loginfo)(`##browser ${lsdBrowserContext.id()} created`);
1602
1638
  return lsdBrowserContext;
@@ -1623,6 +1659,9 @@ var PlaywrightBrowser = class extends import_node_events3.default {
1623
1659
  browserType() {
1624
1660
  return this.#browserType;
1625
1661
  }
1662
+ createTime() {
1663
+ return this.#createTime;
1664
+ }
1626
1665
  doesMeetBrowserContextRequirements(browserContextRequirements) {
1627
1666
  const { browserControllerTypes, browserTypes, browserHeadlesses } = browserContextRequirements;
1628
1667
  return (browserControllerTypes.length === 0 || browserControllerTypes.includes(this.#browserControllerType)) && (browserTypes.length === 0 || browserTypes.includes(this.#browserType)) && (browserHeadlesses.length === 0 || browserHeadlesses.includes(this.#headless));
@@ -2748,12 +2787,15 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
2748
2787
  #browserIdx;
2749
2788
  #browserContextIdx;
2750
2789
  #browserContext;
2790
+ #browserContextCreationMethod;
2751
2791
  /**
2752
2792
  * the userAgent of pages in this browserContext if userAgent
2753
2793
  * * Notice: it is not the actual userAgent if !#userAgent (ignored if !#userAgent)
2754
2794
  */
2755
2795
  #userAgent;
2756
2796
  #createTime;
2797
+ #lastStatusUpdateTime;
2798
+ #status;
2757
2799
  #incognito;
2758
2800
  #proxy;
2759
2801
  #maxPagesPerBrowserContext;
@@ -2782,7 +2824,7 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
2782
2824
  (0, import_utils7.loginfo)(`##browser ${lsdPage.id()} ${openType}ed`);
2783
2825
  }
2784
2826
  }
2785
- constructor(lsdBrowser, browserContext, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxViewportOfNewPage = true) {
2827
+ constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxViewportOfNewPage = true) {
2786
2828
  if (!lsdBrowser || typeof lsdBrowser.browserContexts !== "function") {
2787
2829
  throw new Error(`Invalid lsdBrowser parameter`);
2788
2830
  }
@@ -2794,8 +2836,12 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
2794
2836
  this.#browserIdx = browserIdx;
2795
2837
  this.#browserContextIdx = browserContextIdx;
2796
2838
  this.#browserContext = browserContext;
2839
+ this.#browserContextCreationMethod = browserContextCreationMethod;
2797
2840
  this.#userAgent = userAgent;
2798
- this.#createTime = (0, import_utils7.getCurrentUnixTime)();
2841
+ const currentTime = (0, import_utils7.getCurrentUnixTime)();
2842
+ this.#createTime = currentTime;
2843
+ this.#lastStatusUpdateTime = currentTime;
2844
+ this.#status = "free";
2799
2845
  this.#incognito = incognito === false ? false : true;
2800
2846
  this.#proxy = proxy?.proxyUrl ? proxy : null;
2801
2847
  this.#maxPagesPerBrowserContext = maxPagesPerBrowserContext;
@@ -2816,8 +2862,8 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
2816
2862
  const { browserIdx: browserIdx2, browserContextIdx: browserContextIdx2, pageIdx } = pageInfo;
2817
2863
  (0, import_utils7.logwarn)(`##browser page-${browserIdx2}-${browserContextIdx2}-${pageIdx} has been already created`);
2818
2864
  } else {
2819
- const currentTime = (0, import_utils7.getCurrentUnixTime)();
2820
- const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime, lastStatusUpdateTime: currentTime, taskId: 0, relatedId: 0, misc: {} };
2865
+ const currentTime2 = (0, import_utils7.getCurrentUnixTime)();
2866
+ const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
2821
2867
  const lsdPage = new PuppeteerPage(this, page, pageInfo2);
2822
2868
  if (this.#maxViewportOfNewPage) {
2823
2869
  await lsdPage.maximizeViewport();
@@ -2847,6 +2893,15 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
2847
2893
  return;
2848
2894
  });
2849
2895
  }
2896
+ free() {
2897
+ if (this.#status === "busy") {
2898
+ this.#status = "free";
2899
+ this.#lastStatusUpdateTime = (0, import_utils7.getCurrentUnixTime)();
2900
+ return true;
2901
+ } else {
2902
+ return false;
2903
+ }
2904
+ }
2850
2905
  apiContext() {
2851
2906
  throw new Error("Not supported in PuppeteerPage.");
2852
2907
  }
@@ -2855,7 +2910,10 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
2855
2910
  }
2856
2911
  async close() {
2857
2912
  if (this.#browserContext) {
2913
+ this.#status = "closed";
2914
+ this.#lastStatusUpdateTime = (0, import_utils7.getCurrentUnixTime)();
2858
2915
  await this.#browserContext.close();
2916
+ (0, import_utils7.loginfo)(`browserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
2859
2917
  }
2860
2918
  return true;
2861
2919
  }
@@ -2907,6 +2965,9 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
2907
2965
  return false;
2908
2966
  }
2909
2967
  }
2968
+ creationMethod() {
2969
+ return this.#browserContextCreationMethod;
2970
+ }
2910
2971
  doesMeetBrowserContextRequirements(browserContextRequirements) {
2911
2972
  if (!this.#lsdBrowser.doesMeetBrowserContextRequirements(browserContextRequirements)) {
2912
2973
  return false;
@@ -3025,6 +3086,18 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
3025
3086
  return false;
3026
3087
  }
3027
3088
  }
3089
+ status() {
3090
+ return this.#status;
3091
+ }
3092
+ use() {
3093
+ if (this.#status === "free") {
3094
+ this.#status = "busy";
3095
+ this.#lastStatusUpdateTime = (0, import_utils7.getCurrentUnixTime)();
3096
+ return true;
3097
+ } else {
3098
+ return false;
3099
+ }
3100
+ }
3028
3101
  _origBrowserContext() {
3029
3102
  return this.#browserContext;
3030
3103
  }
@@ -3036,6 +3109,7 @@ var PuppeteerBrowser = class extends import_node_events6.default {
3036
3109
  #browser;
3037
3110
  #browserIdx;
3038
3111
  #pid;
3112
+ #createTime;
3039
3113
  #lsdBrowserContexts;
3040
3114
  #browserControllerType;
3041
3115
  #browserType;
@@ -3072,6 +3146,7 @@ var PuppeteerBrowser = class extends import_node_events6.default {
3072
3146
  this.#browser = browser;
3073
3147
  this.#browserIdx = browserIdx;
3074
3148
  this.#pid = pid;
3149
+ this.#createTime = (0, import_utils8.getCurrentUnixTime)();
3075
3150
  this.#lsdBrowserContexts = [];
3076
3151
  this.#browserControllerType = "puppeteer";
3077
3152
  this.#browserType = browerType;
@@ -3086,7 +3161,7 @@ var PuppeteerBrowser = class extends import_node_events6.default {
3086
3161
  const browserContexts = browser.browserContexts();
3087
3162
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : false;
3088
3163
  for (const browserContext of browserContexts) {
3089
- const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), this.#userAgent(), maxViewportOfNewPage);
3164
+ const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), this.#userAgent(), maxViewportOfNewPage);
3090
3165
  this.#lsdBrowserContexts.push(lsdBrowserContext);
3091
3166
  (0, import_utils8.loginfo)(`##browser ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
3092
3167
  }
@@ -3138,7 +3213,7 @@ var PuppeteerBrowser = class extends import_node_events6.default {
3138
3213
  const browserContext = await this.#browser.createBrowserContext(browserContextOptions);
3139
3214
  const userAgent = options?.userAgent ? options.userAgent : "";
3140
3215
  const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
3141
- const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxViewportOfNewPage);
3216
+ const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxViewportOfNewPage);
3142
3217
  this.#lsdBrowserContexts.push(lsdBrowserContext);
3143
3218
  (0, import_utils8.loginfo)(`##browser ${lsdBrowserContext.id()} created`);
3144
3219
  return lsdBrowserContext;
@@ -3167,6 +3242,9 @@ var PuppeteerBrowser = class extends import_node_events6.default {
3167
3242
  browserType() {
3168
3243
  return this.#browserType;
3169
3244
  }
3245
+ createTime() {
3246
+ return this.#createTime;
3247
+ }
3170
3248
  doesMeetBrowserContextRequirements(browserContextRequirements) {
3171
3249
  const { browserControllerTypes, browserTypes, browserHeadlesses } = browserContextRequirements;
3172
3250
  return (browserControllerTypes.length === 0 || browserControllerTypes.includes(this.#browserControllerType)) && (browserTypes.length === 0 || browserTypes.includes(this.#browserType)) && (browserHeadlesses.length === 0 || browserHeadlesses.includes(this.#headless));
package/dist/index.d.cts CHANGED
@@ -12,6 +12,8 @@ type AllApiRequestContext = APIRequestContext;
12
12
  type CheerioNode = cheerio.Cheerio;
13
13
  type BrowserControllerType = "puppeteer" | "playwright";
14
14
  type BrowserCreationMethod = "launch" | "connect";
15
+ type BrowserContextCreationMethod = "launch" | "new";
16
+ type BrowserContextStatus = "free" | "busy" | "closed";
15
17
  type LsdBrowserType = "chromium" | "firefox" | "webkit";
16
18
  interface BrowserContextRequirements {
17
19
  browserControllerTypes: BrowserControllerType[];
@@ -992,6 +994,10 @@ interface LsdBrowserContext extends EventEmitter {
992
994
  * @param browserContextRequirements
993
995
  */
994
996
  doesMeetBrowserContextRequirements(browserContextRequirements: BrowserContextRequirements): boolean;
997
+ /**
998
+ * Free a busy LsdBrowserContext.
999
+ */
1000
+ free(): boolean;
995
1001
  /**
996
1002
  * get a free page from current pages or by creating a new page
997
1003
  */
@@ -1004,10 +1010,16 @@ interface LsdBrowserContext extends EventEmitter {
1004
1010
  hasFreePage(pageNum?: number): boolean;
1005
1011
  id(): string;
1006
1012
  isIncognito(): boolean;
1013
+ creationMethod(): BrowserContextCreationMethod;
1007
1014
  page(pageIdx: number): LsdPage | null;
1008
1015
  pages(): LsdPage[];
1009
1016
  proxy(): ProxyInController | null;
1010
1017
  setStateData(stateData: BrowserStateData): Promise<boolean>;
1018
+ status(): BrowserContextStatus;
1019
+ /**
1020
+ * start to use this LsdBrowserContext
1021
+ */
1022
+ use(): boolean;
1011
1023
  _origBrowserContext(): AllBrowserContext;
1012
1024
  }
1013
1025
  interface LsdBrowser extends EventEmitter {
@@ -1023,6 +1035,7 @@ interface LsdBrowser extends EventEmitter {
1023
1035
  browserControllerType(): BrowserControllerType;
1024
1036
  browserCreationMethod(): BrowserCreationMethod;
1025
1037
  browserType(): LsdBrowserType;
1038
+ createTime(): number;
1026
1039
  /**
1027
1040
  * doest this browser meet browserContextRequirements (incognitos ignored in browser)?
1028
1041
  * @param browserContextRequirements
@@ -1097,6 +1110,7 @@ declare class PlaywrightBrowser extends EventEmitter implements LsdBrowser {
1097
1110
  browserControllerType(): BrowserControllerType;
1098
1111
  browserCreationMethod(): BrowserCreationMethod;
1099
1112
  browserType(): LsdBrowserType;
1113
+ createTime(): number;
1100
1114
  doesMeetBrowserContextRequirements(browserContextRequirements: BrowserContextRequirements): boolean;
1101
1115
  executablePath(): string;
1102
1116
  id(): string;
@@ -1115,13 +1129,15 @@ declare class PlaywrightBrowser extends EventEmitter implements LsdBrowser {
1115
1129
 
1116
1130
  declare class PlaywrightBrowserContext extends EventEmitter implements LsdBrowserContext {
1117
1131
  #private;
1118
- constructor(lsdBrowser: LsdBrowser, browserContext: BrowserContext, incognito?: boolean, proxy?: ProxyInController | null, browserIdx?: number, browserContextIdx?: number, maxPagesPerBrowserContext?: number, maxPageFreeSeconds?: number, maxViewportOfNewPage?: boolean);
1132
+ constructor(lsdBrowser: LsdBrowser, browserContext: BrowserContext, browserContextCreationMethod: BrowserContextCreationMethod, incognito?: boolean, proxy?: ProxyInController | null, browserIdx?: number, browserContextIdx?: number, maxPagesPerBrowserContext?: number, maxPageFreeSeconds?: number, maxViewportOfNewPage?: boolean);
1119
1133
  apiContext(): LsdApiContext;
1120
1134
  browser(): LsdBrowser;
1121
1135
  close(): Promise<boolean>;
1122
1136
  closeFreePages(maxPageFreeSeconds?: number): Promise<boolean>;
1137
+ creationMethod(): BrowserContextCreationMethod;
1123
1138
  doesMeetBrowserContextRequirements(browserContextRequirements: BrowserContextRequirements): boolean;
1124
1139
  getPage(always?: boolean): Promise<LsdPage | null>;
1140
+ free(): boolean;
1125
1141
  hasFreePage(pageNum?: number): boolean;
1126
1142
  id(): string;
1127
1143
  isIncognito(): boolean;
@@ -1129,6 +1145,8 @@ declare class PlaywrightBrowserContext extends EventEmitter implements LsdBrowse
1129
1145
  pages(): LsdPage[];
1130
1146
  proxy(): ProxyInController | null;
1131
1147
  setStateData(stateData: BrowserStateData): Promise<boolean>;
1148
+ status(): BrowserContextStatus;
1149
+ use(): boolean;
1132
1150
  _origBrowserContext(): AllBrowserContext;
1133
1151
  }
1134
1152
 
@@ -1219,6 +1237,7 @@ declare class PuppeteerBrowser extends EventEmitter implements LsdBrowser {
1219
1237
  browserControllerType(): BrowserControllerType;
1220
1238
  browserCreationMethod(): BrowserCreationMethod;
1221
1239
  browserType(): LsdBrowserType;
1240
+ createTime(): number;
1222
1241
  doesMeetBrowserContextRequirements(browserContextRequirements: BrowserContextRequirements): boolean;
1223
1242
  executablePath(): string;
1224
1243
  id(): string;
@@ -1237,11 +1256,13 @@ declare class PuppeteerBrowser extends EventEmitter implements LsdBrowser {
1237
1256
 
1238
1257
  declare class PuppeteerBrowserContext extends EventEmitter implements LsdBrowserContext {
1239
1258
  #private;
1240
- constructor(lsdBrowser: LsdBrowser, browserContext: BrowserContext$1, incognito?: boolean, proxy?: ProxyInController | null, browserIdx?: number, browserContextIdx?: number, maxPagesPerBrowserContext?: number, maxPageFreeSeconds?: number, userAgent?: string, maxViewportOfNewPage?: boolean);
1259
+ constructor(lsdBrowser: LsdBrowser, browserContext: BrowserContext$1, browserContextCreationMethod: BrowserContextCreationMethod, incognito?: boolean, proxy?: ProxyInController | null, browserIdx?: number, browserContextIdx?: number, maxPagesPerBrowserContext?: number, maxPageFreeSeconds?: number, userAgent?: string, maxViewportOfNewPage?: boolean);
1260
+ free(): boolean;
1241
1261
  apiContext(): LsdApiContext;
1242
1262
  browser(): LsdBrowser;
1243
1263
  close(): Promise<boolean>;
1244
1264
  closeFreePages(maxPageFreeSeconds?: number): Promise<boolean>;
1265
+ creationMethod(): BrowserContextCreationMethod;
1245
1266
  doesMeetBrowserContextRequirements(browserContextRequirements: BrowserContextRequirements): boolean;
1246
1267
  getPage(always?: boolean): Promise<LsdPage | null>;
1247
1268
  hasFreePage(pageNum?: number): boolean;
@@ -1251,6 +1272,8 @@ declare class PuppeteerBrowserContext extends EventEmitter implements LsdBrowser
1251
1272
  pages(): LsdPage[];
1252
1273
  proxy(): ProxyInController | null;
1253
1274
  setStateData(stateData: BrowserStateData): Promise<boolean>;
1275
+ status(): BrowserContextStatus;
1276
+ use(): boolean;
1254
1277
  _origBrowserContext(): AllBrowserContext;
1255
1278
  }
1256
1279
 
@@ -1425,4 +1448,4 @@ declare class LsdBrowserController implements LsdBrowserController$1 {
1425
1448
  }
1426
1449
  declare const controller: LsdBrowserController;
1427
1450
 
1428
- export { type AllApiRequestContext, type AllBrowser, type AllBrowserContext, type AllElement, type AllFrame, type AllPage, type AllResponse, type BrowserContextRequirements, type BrowserControllerType, type BrowserCreationMethod, type BrowserLaunchMethod, type BrowserStateData, CheerioElement, type CheerioNode, CheerioPage, type ClientCertificate, type CookieItem, type GotoOptions, type IframeOption, type InputOptions, type KeyInput, type KeyPressOptions, type LocalStorageItem, type LocalStorageOrigin, type LowerCasePaperFormat, type LsdApiContext, type LsdApiContextOptions, type LsdApiResponse, type LsdBrowser, type LsdBrowserContext, type LsdBrowserContextOptions, type LsdBrowserController$1 as LsdBrowserController, type LsdBrowserType, type LsdConnectOptions, type LsdElement, type LsdFetchOptions, type LsdLaunchOptions, type LsdPage, type MouseClickOptions, type MouseClickType, type NavigationWaitUntil, type PDFMargin, type PDFOptions, type PageEvent, type PageExtInPlaywright, type PageExtInPuppeteer, type PageInfo, type PageOpenType, type PageStatus, type PaperFormat, PlaywrightBrowser, PlaywrightBrowserContext, type PlaywrightBrowserTypes, PlaywrightElement, PlaywrightPage, type ProxyInController, PuppeteerBrowser, PuppeteerBrowserContext, PuppeteerElement, PuppeteerPage, type RequestInterceptionAction, type RequestInterceptionOption, type RequestMatch, type RequestMethod, type RequestResourceType, type ResponseHandler, type ResponseHandlerOptions, type ResponseInterceptionItem, type ResponseInterceptionOption, type ResponseMatch, type ResponsePageData, type ScreenshotOptions, type SelectOptions, type UpdatablePageInfo, type ViewportSize, type WaitElementOptions, type WaitElementState, type WaitNavigationOptions, controller };
1451
+ export { type AllApiRequestContext, type AllBrowser, type AllBrowserContext, type AllElement, type AllFrame, type AllPage, type AllResponse, type BrowserContextCreationMethod, type BrowserContextRequirements, type BrowserContextStatus, type BrowserControllerType, type BrowserCreationMethod, type BrowserLaunchMethod, type BrowserStateData, CheerioElement, type CheerioNode, CheerioPage, type ClientCertificate, type CookieItem, type GotoOptions, type IframeOption, type InputOptions, type KeyInput, type KeyPressOptions, type LocalStorageItem, type LocalStorageOrigin, type LowerCasePaperFormat, type LsdApiContext, type LsdApiContextOptions, type LsdApiResponse, type LsdBrowser, type LsdBrowserContext, type LsdBrowserContextOptions, type LsdBrowserController$1 as LsdBrowserController, type LsdBrowserType, type LsdConnectOptions, type LsdElement, type LsdFetchOptions, type LsdLaunchOptions, type LsdPage, type MouseClickOptions, type MouseClickType, type NavigationWaitUntil, type PDFMargin, type PDFOptions, type PageEvent, type PageExtInPlaywright, type PageExtInPuppeteer, type PageInfo, type PageOpenType, type PageStatus, type PaperFormat, PlaywrightBrowser, PlaywrightBrowserContext, type PlaywrightBrowserTypes, PlaywrightElement, PlaywrightPage, type ProxyInController, PuppeteerBrowser, PuppeteerBrowserContext, PuppeteerElement, PuppeteerPage, type RequestInterceptionAction, type RequestInterceptionOption, type RequestMatch, type RequestMethod, type RequestResourceType, type ResponseHandler, type ResponseHandlerOptions, type ResponseInterceptionItem, type ResponseInterceptionOption, type ResponseMatch, type ResponsePageData, type ScreenshotOptions, type SelectOptions, type UpdatablePageInfo, type ViewportSize, type WaitElementOptions, type WaitElementState, type WaitNavigationOptions, controller };
package/dist/index.d.ts CHANGED
@@ -12,6 +12,8 @@ type AllApiRequestContext = APIRequestContext;
12
12
  type CheerioNode = cheerio.Cheerio;
13
13
  type BrowserControllerType = "puppeteer" | "playwright";
14
14
  type BrowserCreationMethod = "launch" | "connect";
15
+ type BrowserContextCreationMethod = "launch" | "new";
16
+ type BrowserContextStatus = "free" | "busy" | "closed";
15
17
  type LsdBrowserType = "chromium" | "firefox" | "webkit";
16
18
  interface BrowserContextRequirements {
17
19
  browserControllerTypes: BrowserControllerType[];
@@ -992,6 +994,10 @@ interface LsdBrowserContext extends EventEmitter {
992
994
  * @param browserContextRequirements
993
995
  */
994
996
  doesMeetBrowserContextRequirements(browserContextRequirements: BrowserContextRequirements): boolean;
997
+ /**
998
+ * Free a busy LsdBrowserContext.
999
+ */
1000
+ free(): boolean;
995
1001
  /**
996
1002
  * get a free page from current pages or by creating a new page
997
1003
  */
@@ -1004,10 +1010,16 @@ interface LsdBrowserContext extends EventEmitter {
1004
1010
  hasFreePage(pageNum?: number): boolean;
1005
1011
  id(): string;
1006
1012
  isIncognito(): boolean;
1013
+ creationMethod(): BrowserContextCreationMethod;
1007
1014
  page(pageIdx: number): LsdPage | null;
1008
1015
  pages(): LsdPage[];
1009
1016
  proxy(): ProxyInController | null;
1010
1017
  setStateData(stateData: BrowserStateData): Promise<boolean>;
1018
+ status(): BrowserContextStatus;
1019
+ /**
1020
+ * start to use this LsdBrowserContext
1021
+ */
1022
+ use(): boolean;
1011
1023
  _origBrowserContext(): AllBrowserContext;
1012
1024
  }
1013
1025
  interface LsdBrowser extends EventEmitter {
@@ -1023,6 +1035,7 @@ interface LsdBrowser extends EventEmitter {
1023
1035
  browserControllerType(): BrowserControllerType;
1024
1036
  browserCreationMethod(): BrowserCreationMethod;
1025
1037
  browserType(): LsdBrowserType;
1038
+ createTime(): number;
1026
1039
  /**
1027
1040
  * doest this browser meet browserContextRequirements (incognitos ignored in browser)?
1028
1041
  * @param browserContextRequirements
@@ -1097,6 +1110,7 @@ declare class PlaywrightBrowser extends EventEmitter implements LsdBrowser {
1097
1110
  browserControllerType(): BrowserControllerType;
1098
1111
  browserCreationMethod(): BrowserCreationMethod;
1099
1112
  browserType(): LsdBrowserType;
1113
+ createTime(): number;
1100
1114
  doesMeetBrowserContextRequirements(browserContextRequirements: BrowserContextRequirements): boolean;
1101
1115
  executablePath(): string;
1102
1116
  id(): string;
@@ -1115,13 +1129,15 @@ declare class PlaywrightBrowser extends EventEmitter implements LsdBrowser {
1115
1129
 
1116
1130
  declare class PlaywrightBrowserContext extends EventEmitter implements LsdBrowserContext {
1117
1131
  #private;
1118
- constructor(lsdBrowser: LsdBrowser, browserContext: BrowserContext, incognito?: boolean, proxy?: ProxyInController | null, browserIdx?: number, browserContextIdx?: number, maxPagesPerBrowserContext?: number, maxPageFreeSeconds?: number, maxViewportOfNewPage?: boolean);
1132
+ constructor(lsdBrowser: LsdBrowser, browserContext: BrowserContext, browserContextCreationMethod: BrowserContextCreationMethod, incognito?: boolean, proxy?: ProxyInController | null, browserIdx?: number, browserContextIdx?: number, maxPagesPerBrowserContext?: number, maxPageFreeSeconds?: number, maxViewportOfNewPage?: boolean);
1119
1133
  apiContext(): LsdApiContext;
1120
1134
  browser(): LsdBrowser;
1121
1135
  close(): Promise<boolean>;
1122
1136
  closeFreePages(maxPageFreeSeconds?: number): Promise<boolean>;
1137
+ creationMethod(): BrowserContextCreationMethod;
1123
1138
  doesMeetBrowserContextRequirements(browserContextRequirements: BrowserContextRequirements): boolean;
1124
1139
  getPage(always?: boolean): Promise<LsdPage | null>;
1140
+ free(): boolean;
1125
1141
  hasFreePage(pageNum?: number): boolean;
1126
1142
  id(): string;
1127
1143
  isIncognito(): boolean;
@@ -1129,6 +1145,8 @@ declare class PlaywrightBrowserContext extends EventEmitter implements LsdBrowse
1129
1145
  pages(): LsdPage[];
1130
1146
  proxy(): ProxyInController | null;
1131
1147
  setStateData(stateData: BrowserStateData): Promise<boolean>;
1148
+ status(): BrowserContextStatus;
1149
+ use(): boolean;
1132
1150
  _origBrowserContext(): AllBrowserContext;
1133
1151
  }
1134
1152
 
@@ -1219,6 +1237,7 @@ declare class PuppeteerBrowser extends EventEmitter implements LsdBrowser {
1219
1237
  browserControllerType(): BrowserControllerType;
1220
1238
  browserCreationMethod(): BrowserCreationMethod;
1221
1239
  browserType(): LsdBrowserType;
1240
+ createTime(): number;
1222
1241
  doesMeetBrowserContextRequirements(browserContextRequirements: BrowserContextRequirements): boolean;
1223
1242
  executablePath(): string;
1224
1243
  id(): string;
@@ -1237,11 +1256,13 @@ declare class PuppeteerBrowser extends EventEmitter implements LsdBrowser {
1237
1256
 
1238
1257
  declare class PuppeteerBrowserContext extends EventEmitter implements LsdBrowserContext {
1239
1258
  #private;
1240
- constructor(lsdBrowser: LsdBrowser, browserContext: BrowserContext$1, incognito?: boolean, proxy?: ProxyInController | null, browserIdx?: number, browserContextIdx?: number, maxPagesPerBrowserContext?: number, maxPageFreeSeconds?: number, userAgent?: string, maxViewportOfNewPage?: boolean);
1259
+ constructor(lsdBrowser: LsdBrowser, browserContext: BrowserContext$1, browserContextCreationMethod: BrowserContextCreationMethod, incognito?: boolean, proxy?: ProxyInController | null, browserIdx?: number, browserContextIdx?: number, maxPagesPerBrowserContext?: number, maxPageFreeSeconds?: number, userAgent?: string, maxViewportOfNewPage?: boolean);
1260
+ free(): boolean;
1241
1261
  apiContext(): LsdApiContext;
1242
1262
  browser(): LsdBrowser;
1243
1263
  close(): Promise<boolean>;
1244
1264
  closeFreePages(maxPageFreeSeconds?: number): Promise<boolean>;
1265
+ creationMethod(): BrowserContextCreationMethod;
1245
1266
  doesMeetBrowserContextRequirements(browserContextRequirements: BrowserContextRequirements): boolean;
1246
1267
  getPage(always?: boolean): Promise<LsdPage | null>;
1247
1268
  hasFreePage(pageNum?: number): boolean;
@@ -1251,6 +1272,8 @@ declare class PuppeteerBrowserContext extends EventEmitter implements LsdBrowser
1251
1272
  pages(): LsdPage[];
1252
1273
  proxy(): ProxyInController | null;
1253
1274
  setStateData(stateData: BrowserStateData): Promise<boolean>;
1275
+ status(): BrowserContextStatus;
1276
+ use(): boolean;
1254
1277
  _origBrowserContext(): AllBrowserContext;
1255
1278
  }
1256
1279
 
@@ -1425,4 +1448,4 @@ declare class LsdBrowserController implements LsdBrowserController$1 {
1425
1448
  }
1426
1449
  declare const controller: LsdBrowserController;
1427
1450
 
1428
- export { type AllApiRequestContext, type AllBrowser, type AllBrowserContext, type AllElement, type AllFrame, type AllPage, type AllResponse, type BrowserContextRequirements, type BrowserControllerType, type BrowserCreationMethod, type BrowserLaunchMethod, type BrowserStateData, CheerioElement, type CheerioNode, CheerioPage, type ClientCertificate, type CookieItem, type GotoOptions, type IframeOption, type InputOptions, type KeyInput, type KeyPressOptions, type LocalStorageItem, type LocalStorageOrigin, type LowerCasePaperFormat, type LsdApiContext, type LsdApiContextOptions, type LsdApiResponse, type LsdBrowser, type LsdBrowserContext, type LsdBrowserContextOptions, type LsdBrowserController$1 as LsdBrowserController, type LsdBrowserType, type LsdConnectOptions, type LsdElement, type LsdFetchOptions, type LsdLaunchOptions, type LsdPage, type MouseClickOptions, type MouseClickType, type NavigationWaitUntil, type PDFMargin, type PDFOptions, type PageEvent, type PageExtInPlaywright, type PageExtInPuppeteer, type PageInfo, type PageOpenType, type PageStatus, type PaperFormat, PlaywrightBrowser, PlaywrightBrowserContext, type PlaywrightBrowserTypes, PlaywrightElement, PlaywrightPage, type ProxyInController, PuppeteerBrowser, PuppeteerBrowserContext, PuppeteerElement, PuppeteerPage, type RequestInterceptionAction, type RequestInterceptionOption, type RequestMatch, type RequestMethod, type RequestResourceType, type ResponseHandler, type ResponseHandlerOptions, type ResponseInterceptionItem, type ResponseInterceptionOption, type ResponseMatch, type ResponsePageData, type ScreenshotOptions, type SelectOptions, type UpdatablePageInfo, type ViewportSize, type WaitElementOptions, type WaitElementState, type WaitNavigationOptions, controller };
1451
+ export { type AllApiRequestContext, type AllBrowser, type AllBrowserContext, type AllElement, type AllFrame, type AllPage, type AllResponse, type BrowserContextCreationMethod, type BrowserContextRequirements, type BrowserContextStatus, type BrowserControllerType, type BrowserCreationMethod, type BrowserLaunchMethod, type BrowserStateData, CheerioElement, type CheerioNode, CheerioPage, type ClientCertificate, type CookieItem, type GotoOptions, type IframeOption, type InputOptions, type KeyInput, type KeyPressOptions, type LocalStorageItem, type LocalStorageOrigin, type LowerCasePaperFormat, type LsdApiContext, type LsdApiContextOptions, type LsdApiResponse, type LsdBrowser, type LsdBrowserContext, type LsdBrowserContextOptions, type LsdBrowserController$1 as LsdBrowserController, type LsdBrowserType, type LsdConnectOptions, type LsdElement, type LsdFetchOptions, type LsdLaunchOptions, type LsdPage, type MouseClickOptions, type MouseClickType, type NavigationWaitUntil, type PDFMargin, type PDFOptions, type PageEvent, type PageExtInPlaywright, type PageExtInPuppeteer, type PageInfo, type PageOpenType, type PageStatus, type PaperFormat, PlaywrightBrowser, PlaywrightBrowserContext, type PlaywrightBrowserTypes, PlaywrightElement, PlaywrightPage, type ProxyInController, PuppeteerBrowser, PuppeteerBrowserContext, PuppeteerElement, PuppeteerPage, type RequestInterceptionAction, type RequestInterceptionOption, type RequestMatch, type RequestMethod, type RequestResourceType, type ResponseHandler, type ResponseHandlerOptions, type ResponseInterceptionItem, type ResponseInterceptionOption, type ResponseMatch, type ResponsePageData, type ScreenshotOptions, type SelectOptions, type UpdatablePageInfo, type ViewportSize, type WaitElementOptions, type WaitElementState, type WaitNavigationOptions, controller };
package/dist/index.js CHANGED
@@ -1168,8 +1168,11 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1168
1168
  #browserIdx;
1169
1169
  #browserContextIdx;
1170
1170
  #browserContext;
1171
+ #browserContextCreationMethod;
1171
1172
  #apiContext;
1172
1173
  #createTime;
1174
+ #lastStatusUpdateTime;
1175
+ #status;
1173
1176
  #incognito;
1174
1177
  #proxy;
1175
1178
  #maxPagesPerBrowserContext;
@@ -1195,7 +1198,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1195
1198
  loginfo3(`##browser ${lsdPage.id()} ${openType}ed`);
1196
1199
  }
1197
1200
  }
1198
- constructor(lsdBrowser, browserContext, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, maxViewportOfNewPage = true) {
1201
+ constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, maxViewportOfNewPage = true) {
1199
1202
  if (!lsdBrowser || typeof lsdBrowser.browserContexts !== "function") {
1200
1203
  throw new Error(`Invalid lsdBrowser parameter`);
1201
1204
  }
@@ -1207,9 +1210,13 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1207
1210
  this.#browserIdx = browserIdx;
1208
1211
  this.#browserContextIdx = browserContextIdx;
1209
1212
  this.#browserContext = browserContext;
1213
+ this.#browserContextCreationMethod = browserContextCreationMethod;
1210
1214
  const apiRequestContext = browserContext.request;
1211
1215
  this.#apiContext = new PlaywrightApiContext(apiRequestContext);
1212
- this.#createTime = getCurrentUnixTime2();
1216
+ const currentTime = getCurrentUnixTime2();
1217
+ this.#createTime = currentTime;
1218
+ this.#lastStatusUpdateTime = currentTime;
1219
+ this.#status = "free";
1213
1220
  this.#incognito = incognito === false ? false : true;
1214
1221
  this.#proxy = proxy?.proxyUrl ? proxy : null;
1215
1222
  this.#maxPagesPerBrowserContext = maxPagesPerBrowserContext;
@@ -1225,8 +1232,8 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1225
1232
  const { browserIdx: browserIdx2, browserContextIdx: browserContextIdx2, pageIdx } = pageInfo;
1226
1233
  logwarn2(`##browser page-${browserIdx2}-${browserContextIdx2}-${pageIdx} has been already created`);
1227
1234
  } else {
1228
- const currentTime = getCurrentUnixTime2();
1229
- const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime, lastStatusUpdateTime: currentTime, taskId: 0, relatedId: 0, misc: {} };
1235
+ const currentTime2 = getCurrentUnixTime2();
1236
+ const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
1230
1237
  const lsdPage = new PlaywrightPage(this, page, pageInfo2);
1231
1238
  if (this.#maxViewportOfNewPage) {
1232
1239
  await lsdPage.maximizeViewport();
@@ -1263,7 +1270,10 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1263
1270
  }
1264
1271
  async close() {
1265
1272
  if (this.#browserContext) {
1273
+ this.#status = "closed";
1274
+ this.#lastStatusUpdateTime = getCurrentUnixTime2();
1266
1275
  await this.#browserContext.close();
1276
+ loginfo3(`browserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
1267
1277
  }
1268
1278
  return true;
1269
1279
  }
@@ -1315,6 +1325,9 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1315
1325
  return false;
1316
1326
  }
1317
1327
  }
1328
+ creationMethod() {
1329
+ return this.#browserContextCreationMethod;
1330
+ }
1318
1331
  doesMeetBrowserContextRequirements(browserContextRequirements) {
1319
1332
  if (!this.#lsdBrowser.doesMeetBrowserContextRequirements(browserContextRequirements)) {
1320
1333
  return false;
@@ -1364,6 +1377,15 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1364
1377
  return null;
1365
1378
  }
1366
1379
  }
1380
+ free() {
1381
+ if (this.#status === "busy") {
1382
+ this.#status = "free";
1383
+ this.#lastStatusUpdateTime = getCurrentUnixTime2();
1384
+ return true;
1385
+ } else {
1386
+ return false;
1387
+ }
1388
+ }
1367
1389
  hasFreePage(pageNum = 1) {
1368
1390
  if (this.#maxPagesPerBrowserContext - this.#lsdPages.length > pageNum) {
1369
1391
  return true;
@@ -1431,17 +1453,30 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1431
1453
  return false;
1432
1454
  }
1433
1455
  }
1456
+ status() {
1457
+ return this.#status;
1458
+ }
1459
+ use() {
1460
+ if (this.#status === "free") {
1461
+ this.#status = "busy";
1462
+ this.#lastStatusUpdateTime = getCurrentUnixTime2();
1463
+ return true;
1464
+ } else {
1465
+ return false;
1466
+ }
1467
+ }
1434
1468
  _origBrowserContext() {
1435
1469
  return this.#browserContext;
1436
1470
  }
1437
1471
  };
1438
1472
 
1439
1473
  // src/playwright/browser.ts
1440
- import { getPerformanceOfPidTree, logerr as logerr3, loginfo as loginfo4, logwarn as logwarn3 } from "@letsscrapedata/utils";
1474
+ import { getCurrentUnixTime as getCurrentUnixTime3, getPerformanceOfPidTree, logerr as logerr3, loginfo as loginfo4, logwarn as logwarn3 } from "@letsscrapedata/utils";
1441
1475
  var PlaywrightBrowser = class extends EventEmitter3 {
1442
1476
  #browser;
1443
1477
  #browserIdx;
1444
1478
  #pid;
1479
+ #createTime;
1445
1480
  #lsdBrowserContexts;
1446
1481
  #browserControllerType;
1447
1482
  #browserType;
@@ -1475,6 +1510,7 @@ var PlaywrightBrowser = class extends EventEmitter3 {
1475
1510
  this.#browser = browser;
1476
1511
  this.#browserIdx = browserIdx;
1477
1512
  this.#pid = pid;
1513
+ this.#createTime = getCurrentUnixTime3();
1478
1514
  this.#lsdBrowserContexts = [];
1479
1515
  this.#browserControllerType = "playwright";
1480
1516
  this.#browserType = browerType;
@@ -1492,7 +1528,7 @@ var PlaywrightBrowser = class extends EventEmitter3 {
1492
1528
  }
1493
1529
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
1494
1530
  for (const browserContext of browserContexts) {
1495
- const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
1531
+ const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
1496
1532
  this.#lsdBrowserContexts.push(lsdBrowserContext);
1497
1533
  loginfo4(`##browserContext ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
1498
1534
  }
@@ -1550,7 +1586,7 @@ var PlaywrightBrowser = class extends EventEmitter3 {
1550
1586
  }
1551
1587
  const browserContext = await this.#browser.newContext(browserContextOptions);
1552
1588
  const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
1553
- const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
1589
+ const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
1554
1590
  this.#lsdBrowserContexts.push(lsdBrowserContext);
1555
1591
  loginfo4(`##browser ${lsdBrowserContext.id()} created`);
1556
1592
  return lsdBrowserContext;
@@ -1577,6 +1613,9 @@ var PlaywrightBrowser = class extends EventEmitter3 {
1577
1613
  browserType() {
1578
1614
  return this.#browserType;
1579
1615
  }
1616
+ createTime() {
1617
+ return this.#createTime;
1618
+ }
1580
1619
  doesMeetBrowserContextRequirements(browserContextRequirements) {
1581
1620
  const { browserControllerTypes, browserTypes, browserHeadlesses } = browserContextRequirements;
1582
1621
  return (browserControllerTypes.length === 0 || browserControllerTypes.includes(this.#browserControllerType)) && (browserTypes.length === 0 || browserTypes.includes(this.#browserType)) && (browserHeadlesses.length === 0 || browserHeadlesses.includes(this.#headless));
@@ -1900,7 +1939,7 @@ var PuppeteerElement = class _PuppeteerElement {
1900
1939
  };
1901
1940
 
1902
1941
  // src/puppeteer/page.ts
1903
- import { getCurrentUnixTime as getCurrentUnixTime3, logerr as logerr5, loginfo as loginfo5, unreachable as unreachable4 } from "@letsscrapedata/utils";
1942
+ import { getCurrentUnixTime as getCurrentUnixTime4, logerr as logerr5, loginfo as loginfo5, unreachable as unreachable4 } from "@letsscrapedata/utils";
1904
1943
  var PuppeteerPage = class extends EventEmitter4 {
1905
1944
  #lsdBrowserContext;
1906
1945
  #page;
@@ -2098,7 +2137,7 @@ var PuppeteerPage = class extends EventEmitter4 {
2098
2137
  this.#lsdBrowserContext = browserContext;
2099
2138
  this.#page = page;
2100
2139
  this.#status = "free";
2101
- const currentTime = getCurrentUnixTime3();
2140
+ const currentTime = getCurrentUnixTime4();
2102
2141
  const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
2103
2142
  this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId, relatedId, misc };
2104
2143
  this.#pageId = `page-${browserIdx}-${browserContextIdx}-${pageIdx}`;
@@ -2696,18 +2735,21 @@ var PuppeteerPage = class extends EventEmitter4 {
2696
2735
  };
2697
2736
 
2698
2737
  // src/puppeteer/context.ts
2699
- import { getCurrentUnixTime as getCurrentUnixTime4, logerr as logerr6, loginfo as loginfo6, logwarn as logwarn4, sleep as sleep2 } from "@letsscrapedata/utils";
2738
+ import { getCurrentUnixTime as getCurrentUnixTime5, logerr as logerr6, loginfo as loginfo6, logwarn as logwarn4, sleep as sleep2 } from "@letsscrapedata/utils";
2700
2739
  var PuppeteerBrowserContext = class extends EventEmitter5 {
2701
2740
  #lsdBrowser;
2702
2741
  #browserIdx;
2703
2742
  #browserContextIdx;
2704
2743
  #browserContext;
2744
+ #browserContextCreationMethod;
2705
2745
  /**
2706
2746
  * the userAgent of pages in this browserContext if userAgent
2707
2747
  * * Notice: it is not the actual userAgent if !#userAgent (ignored if !#userAgent)
2708
2748
  */
2709
2749
  #userAgent;
2710
2750
  #createTime;
2751
+ #lastStatusUpdateTime;
2752
+ #status;
2711
2753
  #incognito;
2712
2754
  #proxy;
2713
2755
  #maxPagesPerBrowserContext;
@@ -2722,7 +2764,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2722
2764
  }
2723
2765
  const pages = await this.#browserContext.pages();
2724
2766
  const openType = this.#lsdBrowser.browserCreationMethod();
2725
- const lastStatusUpdateTime = getCurrentUnixTime4();
2767
+ const lastStatusUpdateTime = getCurrentUnixTime5();
2726
2768
  for (const page of pages) {
2727
2769
  const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, lastStatusUpdateTime, taskId: 0, relatedId: 0, misc: {} };
2728
2770
  const lsdPage = new PuppeteerPage(this, page, pageInfo);
@@ -2736,7 +2778,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2736
2778
  loginfo6(`##browser ${lsdPage.id()} ${openType}ed`);
2737
2779
  }
2738
2780
  }
2739
- constructor(lsdBrowser, browserContext, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxViewportOfNewPage = true) {
2781
+ constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxViewportOfNewPage = true) {
2740
2782
  if (!lsdBrowser || typeof lsdBrowser.browserContexts !== "function") {
2741
2783
  throw new Error(`Invalid lsdBrowser parameter`);
2742
2784
  }
@@ -2748,8 +2790,12 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2748
2790
  this.#browserIdx = browserIdx;
2749
2791
  this.#browserContextIdx = browserContextIdx;
2750
2792
  this.#browserContext = browserContext;
2793
+ this.#browserContextCreationMethod = browserContextCreationMethod;
2751
2794
  this.#userAgent = userAgent;
2752
- this.#createTime = getCurrentUnixTime4();
2795
+ const currentTime = getCurrentUnixTime5();
2796
+ this.#createTime = currentTime;
2797
+ this.#lastStatusUpdateTime = currentTime;
2798
+ this.#status = "free";
2753
2799
  this.#incognito = incognito === false ? false : true;
2754
2800
  this.#proxy = proxy?.proxyUrl ? proxy : null;
2755
2801
  this.#maxPagesPerBrowserContext = maxPagesPerBrowserContext;
@@ -2770,8 +2816,8 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2770
2816
  const { browserIdx: browserIdx2, browserContextIdx: browserContextIdx2, pageIdx } = pageInfo;
2771
2817
  logwarn4(`##browser page-${browserIdx2}-${browserContextIdx2}-${pageIdx} has been already created`);
2772
2818
  } else {
2773
- const currentTime = getCurrentUnixTime4();
2774
- const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime, lastStatusUpdateTime: currentTime, taskId: 0, relatedId: 0, misc: {} };
2819
+ const currentTime2 = getCurrentUnixTime5();
2820
+ const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
2775
2821
  const lsdPage = new PuppeteerPage(this, page, pageInfo2);
2776
2822
  if (this.#maxViewportOfNewPage) {
2777
2823
  await lsdPage.maximizeViewport();
@@ -2801,6 +2847,15 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2801
2847
  return;
2802
2848
  });
2803
2849
  }
2850
+ free() {
2851
+ if (this.#status === "busy") {
2852
+ this.#status = "free";
2853
+ this.#lastStatusUpdateTime = getCurrentUnixTime5();
2854
+ return true;
2855
+ } else {
2856
+ return false;
2857
+ }
2858
+ }
2804
2859
  apiContext() {
2805
2860
  throw new Error("Not supported in PuppeteerPage.");
2806
2861
  }
@@ -2809,7 +2864,10 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2809
2864
  }
2810
2865
  async close() {
2811
2866
  if (this.#browserContext) {
2867
+ this.#status = "closed";
2868
+ this.#lastStatusUpdateTime = getCurrentUnixTime5();
2812
2869
  await this.#browserContext.close();
2870
+ loginfo6(`browserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
2813
2871
  }
2814
2872
  return true;
2815
2873
  }
@@ -2845,7 +2903,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2845
2903
  return false;
2846
2904
  }
2847
2905
  try {
2848
- const maxUpdateTime = getCurrentUnixTime4() - this.#maxPageFreeSeconds;
2906
+ const maxUpdateTime = getCurrentUnixTime5() - this.#maxPageFreeSeconds;
2849
2907
  let freePages = this.#lsdPages.filter((p) => p.isFree() && p.pageInfo().lastStatusUpdateTime < maxUpdateTime);
2850
2908
  if (freePages.length === this.#lsdPages.length) {
2851
2909
  freePages = freePages.slice(1);
@@ -2861,6 +2919,9 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2861
2919
  return false;
2862
2920
  }
2863
2921
  }
2922
+ creationMethod() {
2923
+ return this.#browserContextCreationMethod;
2924
+ }
2864
2925
  doesMeetBrowserContextRequirements(browserContextRequirements) {
2865
2926
  if (!this.#lsdBrowser.doesMeetBrowserContextRequirements(browserContextRequirements)) {
2866
2927
  return false;
@@ -2979,17 +3040,30 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2979
3040
  return false;
2980
3041
  }
2981
3042
  }
3043
+ status() {
3044
+ return this.#status;
3045
+ }
3046
+ use() {
3047
+ if (this.#status === "free") {
3048
+ this.#status = "busy";
3049
+ this.#lastStatusUpdateTime = getCurrentUnixTime5();
3050
+ return true;
3051
+ } else {
3052
+ return false;
3053
+ }
3054
+ }
2982
3055
  _origBrowserContext() {
2983
3056
  return this.#browserContext;
2984
3057
  }
2985
3058
  };
2986
3059
 
2987
3060
  // src/puppeteer/browser.ts
2988
- import { getPerformanceOfPidTree as getPerformanceOfPidTree2, logerr as logerr7, loginfo as loginfo7, logwarn as logwarn5 } from "@letsscrapedata/utils";
3061
+ import { getCurrentUnixTime as getCurrentUnixTime6, getPerformanceOfPidTree as getPerformanceOfPidTree2, logerr as logerr7, loginfo as loginfo7, logwarn as logwarn5 } from "@letsscrapedata/utils";
2989
3062
  var PuppeteerBrowser = class extends EventEmitter6 {
2990
3063
  #browser;
2991
3064
  #browserIdx;
2992
3065
  #pid;
3066
+ #createTime;
2993
3067
  #lsdBrowserContexts;
2994
3068
  #browserControllerType;
2995
3069
  #browserType;
@@ -3026,6 +3100,7 @@ var PuppeteerBrowser = class extends EventEmitter6 {
3026
3100
  this.#browser = browser;
3027
3101
  this.#browserIdx = browserIdx;
3028
3102
  this.#pid = pid;
3103
+ this.#createTime = getCurrentUnixTime6();
3029
3104
  this.#lsdBrowserContexts = [];
3030
3105
  this.#browserControllerType = "puppeteer";
3031
3106
  this.#browserType = browerType;
@@ -3040,7 +3115,7 @@ var PuppeteerBrowser = class extends EventEmitter6 {
3040
3115
  const browserContexts = browser.browserContexts();
3041
3116
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : false;
3042
3117
  for (const browserContext of browserContexts) {
3043
- const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), this.#userAgent(), maxViewportOfNewPage);
3118
+ const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), this.#userAgent(), maxViewportOfNewPage);
3044
3119
  this.#lsdBrowserContexts.push(lsdBrowserContext);
3045
3120
  loginfo7(`##browser ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
3046
3121
  }
@@ -3092,7 +3167,7 @@ var PuppeteerBrowser = class extends EventEmitter6 {
3092
3167
  const browserContext = await this.#browser.createBrowserContext(browserContextOptions);
3093
3168
  const userAgent = options?.userAgent ? options.userAgent : "";
3094
3169
  const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
3095
- const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxViewportOfNewPage);
3170
+ const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxViewportOfNewPage);
3096
3171
  this.#lsdBrowserContexts.push(lsdBrowserContext);
3097
3172
  loginfo7(`##browser ${lsdBrowserContext.id()} created`);
3098
3173
  return lsdBrowserContext;
@@ -3121,6 +3196,9 @@ var PuppeteerBrowser = class extends EventEmitter6 {
3121
3196
  browserType() {
3122
3197
  return this.#browserType;
3123
3198
  }
3199
+ createTime() {
3200
+ return this.#createTime;
3201
+ }
3124
3202
  doesMeetBrowserContextRequirements(browserContextRequirements) {
3125
3203
  const { browserControllerTypes, browserTypes, browserHeadlesses } = browserContextRequirements;
3126
3204
  return (browserControllerTypes.length === 0 || browserControllerTypes.includes(this.#browserControllerType)) && (browserTypes.length === 0 || browserTypes.includes(this.#browserType)) && (browserHeadlesses.length === 0 || browserHeadlesses.includes(this.#headless));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@letsscrapedata/controller",
3
- "version": "0.0.46",
3
+ "version": "0.0.47",
4
4
  "description": "Unified browser / HTML controller interfaces that support playwright, puppeteer and cheerio",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",