@letsscrapedata/controller 0.0.46 → 0.0.48

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,6 +1316,9 @@ 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)();
1321
+ (0, import_utils3.loginfo)(`browserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
1312
1322
  await this.#browserContext.close();
1313
1323
  }
1314
1324
  return true;
@@ -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,17 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
1410
1423
  return null;
1411
1424
  }
1412
1425
  }
1426
+ free(clearStateData = false) {
1427
+ if (this.#status === "busy") {
1428
+ this.#status = "free";
1429
+ this.#lastStatusUpdateTime = (0, import_utils3.getCurrentUnixTime)();
1430
+ if (clearStateData) {
1431
+ }
1432
+ return true;
1433
+ } else {
1434
+ return false;
1435
+ }
1436
+ }
1413
1437
  hasFreePage(pageNum = 1) {
1414
1438
  if (this.#maxPagesPerBrowserContext - this.#lsdPages.length > pageNum) {
1415
1439
  return true;
@@ -1422,6 +1446,9 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
1422
1446
  id() {
1423
1447
  return `browserContext-${this.#browserIdx}-${this.#browserContextIdx}`;
1424
1448
  }
1449
+ isFree() {
1450
+ return this.#status === "free";
1451
+ }
1425
1452
  isIncognito() {
1426
1453
  return this.#incognito;
1427
1454
  }
@@ -1477,6 +1504,18 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
1477
1504
  return false;
1478
1505
  }
1479
1506
  }
1507
+ status() {
1508
+ return this.#status;
1509
+ }
1510
+ use() {
1511
+ if (this.#status === "free") {
1512
+ this.#status = "busy";
1513
+ this.#lastStatusUpdateTime = (0, import_utils3.getCurrentUnixTime)();
1514
+ return true;
1515
+ } else {
1516
+ return false;
1517
+ }
1518
+ }
1480
1519
  _origBrowserContext() {
1481
1520
  return this.#browserContext;
1482
1521
  }
@@ -1488,6 +1527,7 @@ var PlaywrightBrowser = class extends import_node_events3.default {
1488
1527
  #browser;
1489
1528
  #browserIdx;
1490
1529
  #pid;
1530
+ #createTime;
1491
1531
  #lsdBrowserContexts;
1492
1532
  #browserControllerType;
1493
1533
  #browserType;
@@ -1521,6 +1561,7 @@ var PlaywrightBrowser = class extends import_node_events3.default {
1521
1561
  this.#browser = browser;
1522
1562
  this.#browserIdx = browserIdx;
1523
1563
  this.#pid = pid;
1564
+ this.#createTime = (0, import_utils4.getCurrentUnixTime)();
1524
1565
  this.#lsdBrowserContexts = [];
1525
1566
  this.#browserControllerType = "playwright";
1526
1567
  this.#browserType = browerType;
@@ -1538,7 +1579,7 @@ var PlaywrightBrowser = class extends import_node_events3.default {
1538
1579
  }
1539
1580
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
1540
1581
  for (const browserContext of browserContexts) {
1541
- const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
1582
+ const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
1542
1583
  this.#lsdBrowserContexts.push(lsdBrowserContext);
1543
1584
  (0, import_utils4.loginfo)(`##browserContext ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
1544
1585
  }
@@ -1596,7 +1637,7 @@ var PlaywrightBrowser = class extends import_node_events3.default {
1596
1637
  }
1597
1638
  const browserContext = await this.#browser.newContext(browserContextOptions);
1598
1639
  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);
1640
+ const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
1600
1641
  this.#lsdBrowserContexts.push(lsdBrowserContext);
1601
1642
  (0, import_utils4.loginfo)(`##browser ${lsdBrowserContext.id()} created`);
1602
1643
  return lsdBrowserContext;
@@ -1623,6 +1664,9 @@ var PlaywrightBrowser = class extends import_node_events3.default {
1623
1664
  browserType() {
1624
1665
  return this.#browserType;
1625
1666
  }
1667
+ createTime() {
1668
+ return this.#createTime;
1669
+ }
1626
1670
  doesMeetBrowserContextRequirements(browserContextRequirements) {
1627
1671
  const { browserControllerTypes, browserTypes, browserHeadlesses } = browserContextRequirements;
1628
1672
  return (browserControllerTypes.length === 0 || browserControllerTypes.includes(this.#browserControllerType)) && (browserTypes.length === 0 || browserTypes.includes(this.#browserType)) && (browserHeadlesses.length === 0 || browserHeadlesses.includes(this.#headless));
@@ -2748,12 +2792,15 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
2748
2792
  #browserIdx;
2749
2793
  #browserContextIdx;
2750
2794
  #browserContext;
2795
+ #browserContextCreationMethod;
2751
2796
  /**
2752
2797
  * the userAgent of pages in this browserContext if userAgent
2753
2798
  * * Notice: it is not the actual userAgent if !#userAgent (ignored if !#userAgent)
2754
2799
  */
2755
2800
  #userAgent;
2756
2801
  #createTime;
2802
+ #lastStatusUpdateTime;
2803
+ #status;
2757
2804
  #incognito;
2758
2805
  #proxy;
2759
2806
  #maxPagesPerBrowserContext;
@@ -2782,7 +2829,7 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
2782
2829
  (0, import_utils7.loginfo)(`##browser ${lsdPage.id()} ${openType}ed`);
2783
2830
  }
2784
2831
  }
2785
- constructor(lsdBrowser, browserContext, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxViewportOfNewPage = true) {
2832
+ constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxViewportOfNewPage = true) {
2786
2833
  if (!lsdBrowser || typeof lsdBrowser.browserContexts !== "function") {
2787
2834
  throw new Error(`Invalid lsdBrowser parameter`);
2788
2835
  }
@@ -2794,8 +2841,12 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
2794
2841
  this.#browserIdx = browserIdx;
2795
2842
  this.#browserContextIdx = browserContextIdx;
2796
2843
  this.#browserContext = browserContext;
2844
+ this.#browserContextCreationMethod = browserContextCreationMethod;
2797
2845
  this.#userAgent = userAgent;
2798
- this.#createTime = (0, import_utils7.getCurrentUnixTime)();
2846
+ const currentTime = (0, import_utils7.getCurrentUnixTime)();
2847
+ this.#createTime = currentTime;
2848
+ this.#lastStatusUpdateTime = currentTime;
2849
+ this.#status = "free";
2799
2850
  this.#incognito = incognito === false ? false : true;
2800
2851
  this.#proxy = proxy?.proxyUrl ? proxy : null;
2801
2852
  this.#maxPagesPerBrowserContext = maxPagesPerBrowserContext;
@@ -2816,8 +2867,8 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
2816
2867
  const { browserIdx: browserIdx2, browserContextIdx: browserContextIdx2, pageIdx } = pageInfo;
2817
2868
  (0, import_utils7.logwarn)(`##browser page-${browserIdx2}-${browserContextIdx2}-${pageIdx} has been already created`);
2818
2869
  } 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: {} };
2870
+ const currentTime2 = (0, import_utils7.getCurrentUnixTime)();
2871
+ const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
2821
2872
  const lsdPage = new PuppeteerPage(this, page, pageInfo2);
2822
2873
  if (this.#maxViewportOfNewPage) {
2823
2874
  await lsdPage.maximizeViewport();
@@ -2855,7 +2906,12 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
2855
2906
  }
2856
2907
  async close() {
2857
2908
  if (this.#browserContext) {
2858
- await this.#browserContext.close();
2909
+ this.#status = "closed";
2910
+ this.#lastStatusUpdateTime = (0, import_utils7.getCurrentUnixTime)();
2911
+ (0, import_utils7.loginfo)(`browserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
2912
+ if (this.#browserContextCreationMethod !== "launch") {
2913
+ await this.#browserContext.close();
2914
+ }
2859
2915
  }
2860
2916
  return true;
2861
2917
  }
@@ -2907,6 +2963,9 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
2907
2963
  return false;
2908
2964
  }
2909
2965
  }
2966
+ creationMethod() {
2967
+ return this.#browserContextCreationMethod;
2968
+ }
2910
2969
  doesMeetBrowserContextRequirements(browserContextRequirements) {
2911
2970
  if (!this.#lsdBrowser.doesMeetBrowserContextRequirements(browserContextRequirements)) {
2912
2971
  return false;
@@ -2958,6 +3017,17 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
2958
3017
  return null;
2959
3018
  }
2960
3019
  }
3020
+ free(clearStateData = false) {
3021
+ if (this.#status === "busy") {
3022
+ this.#status = "free";
3023
+ this.#lastStatusUpdateTime = (0, import_utils7.getCurrentUnixTime)();
3024
+ if (clearStateData) {
3025
+ }
3026
+ return true;
3027
+ } else {
3028
+ return false;
3029
+ }
3030
+ }
2961
3031
  hasFreePage(pageNum = 1) {
2962
3032
  if (this.#maxPagesPerBrowserContext - this.#lsdPages.length > pageNum) {
2963
3033
  return true;
@@ -2973,6 +3043,9 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
2973
3043
  isIncognito() {
2974
3044
  return this.#incognito;
2975
3045
  }
3046
+ isFree() {
3047
+ return this.#status === "free";
3048
+ }
2976
3049
  page(pageIdx) {
2977
3050
  const lsdPage = this.#lsdPages.find((p) => p.pageInfo().pageIdx === pageIdx);
2978
3051
  return lsdPage ? lsdPage : null;
@@ -3025,6 +3098,18 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
3025
3098
  return false;
3026
3099
  }
3027
3100
  }
3101
+ status() {
3102
+ return this.#status;
3103
+ }
3104
+ use() {
3105
+ if (this.#status === "free") {
3106
+ this.#status = "busy";
3107
+ this.#lastStatusUpdateTime = (0, import_utils7.getCurrentUnixTime)();
3108
+ return true;
3109
+ } else {
3110
+ return false;
3111
+ }
3112
+ }
3028
3113
  _origBrowserContext() {
3029
3114
  return this.#browserContext;
3030
3115
  }
@@ -3036,6 +3121,7 @@ var PuppeteerBrowser = class extends import_node_events6.default {
3036
3121
  #browser;
3037
3122
  #browserIdx;
3038
3123
  #pid;
3124
+ #createTime;
3039
3125
  #lsdBrowserContexts;
3040
3126
  #browserControllerType;
3041
3127
  #browserType;
@@ -3072,6 +3158,7 @@ var PuppeteerBrowser = class extends import_node_events6.default {
3072
3158
  this.#browser = browser;
3073
3159
  this.#browserIdx = browserIdx;
3074
3160
  this.#pid = pid;
3161
+ this.#createTime = (0, import_utils8.getCurrentUnixTime)();
3075
3162
  this.#lsdBrowserContexts = [];
3076
3163
  this.#browserControllerType = "puppeteer";
3077
3164
  this.#browserType = browerType;
@@ -3086,7 +3173,7 @@ var PuppeteerBrowser = class extends import_node_events6.default {
3086
3173
  const browserContexts = browser.browserContexts();
3087
3174
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : false;
3088
3175
  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);
3176
+ const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), this.#userAgent(), maxViewportOfNewPage);
3090
3177
  this.#lsdBrowserContexts.push(lsdBrowserContext);
3091
3178
  (0, import_utils8.loginfo)(`##browser ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
3092
3179
  }
@@ -3138,7 +3225,7 @@ var PuppeteerBrowser = class extends import_node_events6.default {
3138
3225
  const browserContext = await this.#browser.createBrowserContext(browserContextOptions);
3139
3226
  const userAgent = options?.userAgent ? options.userAgent : "";
3140
3227
  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);
3228
+ const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxViewportOfNewPage);
3142
3229
  this.#lsdBrowserContexts.push(lsdBrowserContext);
3143
3230
  (0, import_utils8.loginfo)(`##browser ${lsdBrowserContext.id()} created`);
3144
3231
  return lsdBrowserContext;
@@ -3148,9 +3235,7 @@ var PuppeteerBrowser = class extends import_node_events6.default {
3148
3235
  clearInterval(this.#closeFreePagesIntervalId);
3149
3236
  }
3150
3237
  for (const lsdBrowserContext of this.#lsdBrowserContexts) {
3151
- if (lsdBrowserContext.isIncognito()) {
3152
- await lsdBrowserContext.close();
3153
- }
3238
+ await lsdBrowserContext.close();
3154
3239
  }
3155
3240
  await this.#browser.close();
3156
3241
  return true;
@@ -3167,6 +3252,9 @@ var PuppeteerBrowser = class extends import_node_events6.default {
3167
3252
  browserType() {
3168
3253
  return this.#browserType;
3169
3254
  }
3255
+ createTime() {
3256
+ return this.#createTime;
3257
+ }
3170
3258
  doesMeetBrowserContextRequirements(browserContextRequirements) {
3171
3259
  const { browserControllerTypes, browserTypes, browserHeadlesses } = browserContextRequirements;
3172
3260
  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,11 @@ interface LsdBrowserContext extends EventEmitter {
992
994
  * @param browserContextRequirements
993
995
  */
994
996
  doesMeetBrowserContextRequirements(browserContextRequirements: BrowserContextRequirements): boolean;
997
+ /**
998
+ * Free a busy LsdBrowserContext.
999
+ * @param clearStateData default false
1000
+ */
1001
+ free(clearStateData?: boolean): boolean;
995
1002
  /**
996
1003
  * get a free page from current pages or by creating a new page
997
1004
  */
@@ -1003,11 +1010,18 @@ interface LsdBrowserContext extends EventEmitter {
1003
1010
  */
1004
1011
  hasFreePage(pageNum?: number): boolean;
1005
1012
  id(): string;
1013
+ isFree(): boolean;
1006
1014
  isIncognito(): boolean;
1015
+ creationMethod(): BrowserContextCreationMethod;
1007
1016
  page(pageIdx: number): LsdPage | null;
1008
1017
  pages(): LsdPage[];
1009
1018
  proxy(): ProxyInController | null;
1010
1019
  setStateData(stateData: BrowserStateData): Promise<boolean>;
1020
+ status(): BrowserContextStatus;
1021
+ /**
1022
+ * start to use this LsdBrowserContext
1023
+ */
1024
+ use(): boolean;
1011
1025
  _origBrowserContext(): AllBrowserContext;
1012
1026
  }
1013
1027
  interface LsdBrowser extends EventEmitter {
@@ -1023,6 +1037,7 @@ interface LsdBrowser extends EventEmitter {
1023
1037
  browserControllerType(): BrowserControllerType;
1024
1038
  browserCreationMethod(): BrowserCreationMethod;
1025
1039
  browserType(): LsdBrowserType;
1040
+ createTime(): number;
1026
1041
  /**
1027
1042
  * doest this browser meet browserContextRequirements (incognitos ignored in browser)?
1028
1043
  * @param browserContextRequirements
@@ -1097,6 +1112,7 @@ declare class PlaywrightBrowser extends EventEmitter implements LsdBrowser {
1097
1112
  browserControllerType(): BrowserControllerType;
1098
1113
  browserCreationMethod(): BrowserCreationMethod;
1099
1114
  browserType(): LsdBrowserType;
1115
+ createTime(): number;
1100
1116
  doesMeetBrowserContextRequirements(browserContextRequirements: BrowserContextRequirements): boolean;
1101
1117
  executablePath(): string;
1102
1118
  id(): string;
@@ -1115,20 +1131,25 @@ declare class PlaywrightBrowser extends EventEmitter implements LsdBrowser {
1115
1131
 
1116
1132
  declare class PlaywrightBrowserContext extends EventEmitter implements LsdBrowserContext {
1117
1133
  #private;
1118
- constructor(lsdBrowser: LsdBrowser, browserContext: BrowserContext, incognito?: boolean, proxy?: ProxyInController | null, browserIdx?: number, browserContextIdx?: number, maxPagesPerBrowserContext?: number, maxPageFreeSeconds?: number, maxViewportOfNewPage?: boolean);
1134
+ constructor(lsdBrowser: LsdBrowser, browserContext: BrowserContext, browserContextCreationMethod: BrowserContextCreationMethod, incognito?: boolean, proxy?: ProxyInController | null, browserIdx?: number, browserContextIdx?: number, maxPagesPerBrowserContext?: number, maxPageFreeSeconds?: number, maxViewportOfNewPage?: boolean);
1119
1135
  apiContext(): LsdApiContext;
1120
1136
  browser(): LsdBrowser;
1121
1137
  close(): Promise<boolean>;
1122
1138
  closeFreePages(maxPageFreeSeconds?: number): Promise<boolean>;
1139
+ creationMethod(): BrowserContextCreationMethod;
1123
1140
  doesMeetBrowserContextRequirements(browserContextRequirements: BrowserContextRequirements): boolean;
1124
1141
  getPage(always?: boolean): Promise<LsdPage | null>;
1142
+ free(clearStateData?: boolean): boolean;
1125
1143
  hasFreePage(pageNum?: number): boolean;
1126
1144
  id(): string;
1145
+ isFree(): boolean;
1127
1146
  isIncognito(): boolean;
1128
1147
  page(pageIdx: number): LsdPage | null;
1129
1148
  pages(): LsdPage[];
1130
1149
  proxy(): ProxyInController | null;
1131
1150
  setStateData(stateData: BrowserStateData): Promise<boolean>;
1151
+ status(): BrowserContextStatus;
1152
+ use(): boolean;
1132
1153
  _origBrowserContext(): AllBrowserContext;
1133
1154
  }
1134
1155
 
@@ -1219,6 +1240,7 @@ declare class PuppeteerBrowser extends EventEmitter implements LsdBrowser {
1219
1240
  browserControllerType(): BrowserControllerType;
1220
1241
  browserCreationMethod(): BrowserCreationMethod;
1221
1242
  browserType(): LsdBrowserType;
1243
+ createTime(): number;
1222
1244
  doesMeetBrowserContextRequirements(browserContextRequirements: BrowserContextRequirements): boolean;
1223
1245
  executablePath(): string;
1224
1246
  id(): string;
@@ -1237,20 +1259,25 @@ declare class PuppeteerBrowser extends EventEmitter implements LsdBrowser {
1237
1259
 
1238
1260
  declare class PuppeteerBrowserContext extends EventEmitter implements LsdBrowserContext {
1239
1261
  #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);
1262
+ 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);
1241
1263
  apiContext(): LsdApiContext;
1242
1264
  browser(): LsdBrowser;
1243
1265
  close(): Promise<boolean>;
1244
1266
  closeFreePages(maxPageFreeSeconds?: number): Promise<boolean>;
1267
+ creationMethod(): BrowserContextCreationMethod;
1245
1268
  doesMeetBrowserContextRequirements(browserContextRequirements: BrowserContextRequirements): boolean;
1246
1269
  getPage(always?: boolean): Promise<LsdPage | null>;
1270
+ free(clearStateData?: boolean): boolean;
1247
1271
  hasFreePage(pageNum?: number): boolean;
1248
1272
  id(): string;
1249
1273
  isIncognito(): boolean;
1274
+ isFree(): boolean;
1250
1275
  page(pageIdx: number): LsdPage | null;
1251
1276
  pages(): LsdPage[];
1252
1277
  proxy(): ProxyInController | null;
1253
1278
  setStateData(stateData: BrowserStateData): Promise<boolean>;
1279
+ status(): BrowserContextStatus;
1280
+ use(): boolean;
1254
1281
  _origBrowserContext(): AllBrowserContext;
1255
1282
  }
1256
1283
 
@@ -1425,4 +1452,4 @@ declare class LsdBrowserController implements LsdBrowserController$1 {
1425
1452
  }
1426
1453
  declare const controller: LsdBrowserController;
1427
1454
 
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 };
1455
+ 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,11 @@ interface LsdBrowserContext extends EventEmitter {
992
994
  * @param browserContextRequirements
993
995
  */
994
996
  doesMeetBrowserContextRequirements(browserContextRequirements: BrowserContextRequirements): boolean;
997
+ /**
998
+ * Free a busy LsdBrowserContext.
999
+ * @param clearStateData default false
1000
+ */
1001
+ free(clearStateData?: boolean): boolean;
995
1002
  /**
996
1003
  * get a free page from current pages or by creating a new page
997
1004
  */
@@ -1003,11 +1010,18 @@ interface LsdBrowserContext extends EventEmitter {
1003
1010
  */
1004
1011
  hasFreePage(pageNum?: number): boolean;
1005
1012
  id(): string;
1013
+ isFree(): boolean;
1006
1014
  isIncognito(): boolean;
1015
+ creationMethod(): BrowserContextCreationMethod;
1007
1016
  page(pageIdx: number): LsdPage | null;
1008
1017
  pages(): LsdPage[];
1009
1018
  proxy(): ProxyInController | null;
1010
1019
  setStateData(stateData: BrowserStateData): Promise<boolean>;
1020
+ status(): BrowserContextStatus;
1021
+ /**
1022
+ * start to use this LsdBrowserContext
1023
+ */
1024
+ use(): boolean;
1011
1025
  _origBrowserContext(): AllBrowserContext;
1012
1026
  }
1013
1027
  interface LsdBrowser extends EventEmitter {
@@ -1023,6 +1037,7 @@ interface LsdBrowser extends EventEmitter {
1023
1037
  browserControllerType(): BrowserControllerType;
1024
1038
  browserCreationMethod(): BrowserCreationMethod;
1025
1039
  browserType(): LsdBrowserType;
1040
+ createTime(): number;
1026
1041
  /**
1027
1042
  * doest this browser meet browserContextRequirements (incognitos ignored in browser)?
1028
1043
  * @param browserContextRequirements
@@ -1097,6 +1112,7 @@ declare class PlaywrightBrowser extends EventEmitter implements LsdBrowser {
1097
1112
  browserControllerType(): BrowserControllerType;
1098
1113
  browserCreationMethod(): BrowserCreationMethod;
1099
1114
  browserType(): LsdBrowserType;
1115
+ createTime(): number;
1100
1116
  doesMeetBrowserContextRequirements(browserContextRequirements: BrowserContextRequirements): boolean;
1101
1117
  executablePath(): string;
1102
1118
  id(): string;
@@ -1115,20 +1131,25 @@ declare class PlaywrightBrowser extends EventEmitter implements LsdBrowser {
1115
1131
 
1116
1132
  declare class PlaywrightBrowserContext extends EventEmitter implements LsdBrowserContext {
1117
1133
  #private;
1118
- constructor(lsdBrowser: LsdBrowser, browserContext: BrowserContext, incognito?: boolean, proxy?: ProxyInController | null, browserIdx?: number, browserContextIdx?: number, maxPagesPerBrowserContext?: number, maxPageFreeSeconds?: number, maxViewportOfNewPage?: boolean);
1134
+ constructor(lsdBrowser: LsdBrowser, browserContext: BrowserContext, browserContextCreationMethod: BrowserContextCreationMethod, incognito?: boolean, proxy?: ProxyInController | null, browserIdx?: number, browserContextIdx?: number, maxPagesPerBrowserContext?: number, maxPageFreeSeconds?: number, maxViewportOfNewPage?: boolean);
1119
1135
  apiContext(): LsdApiContext;
1120
1136
  browser(): LsdBrowser;
1121
1137
  close(): Promise<boolean>;
1122
1138
  closeFreePages(maxPageFreeSeconds?: number): Promise<boolean>;
1139
+ creationMethod(): BrowserContextCreationMethod;
1123
1140
  doesMeetBrowserContextRequirements(browserContextRequirements: BrowserContextRequirements): boolean;
1124
1141
  getPage(always?: boolean): Promise<LsdPage | null>;
1142
+ free(clearStateData?: boolean): boolean;
1125
1143
  hasFreePage(pageNum?: number): boolean;
1126
1144
  id(): string;
1145
+ isFree(): boolean;
1127
1146
  isIncognito(): boolean;
1128
1147
  page(pageIdx: number): LsdPage | null;
1129
1148
  pages(): LsdPage[];
1130
1149
  proxy(): ProxyInController | null;
1131
1150
  setStateData(stateData: BrowserStateData): Promise<boolean>;
1151
+ status(): BrowserContextStatus;
1152
+ use(): boolean;
1132
1153
  _origBrowserContext(): AllBrowserContext;
1133
1154
  }
1134
1155
 
@@ -1219,6 +1240,7 @@ declare class PuppeteerBrowser extends EventEmitter implements LsdBrowser {
1219
1240
  browserControllerType(): BrowserControllerType;
1220
1241
  browserCreationMethod(): BrowserCreationMethod;
1221
1242
  browserType(): LsdBrowserType;
1243
+ createTime(): number;
1222
1244
  doesMeetBrowserContextRequirements(browserContextRequirements: BrowserContextRequirements): boolean;
1223
1245
  executablePath(): string;
1224
1246
  id(): string;
@@ -1237,20 +1259,25 @@ declare class PuppeteerBrowser extends EventEmitter implements LsdBrowser {
1237
1259
 
1238
1260
  declare class PuppeteerBrowserContext extends EventEmitter implements LsdBrowserContext {
1239
1261
  #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);
1262
+ 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);
1241
1263
  apiContext(): LsdApiContext;
1242
1264
  browser(): LsdBrowser;
1243
1265
  close(): Promise<boolean>;
1244
1266
  closeFreePages(maxPageFreeSeconds?: number): Promise<boolean>;
1267
+ creationMethod(): BrowserContextCreationMethod;
1245
1268
  doesMeetBrowserContextRequirements(browserContextRequirements: BrowserContextRequirements): boolean;
1246
1269
  getPage(always?: boolean): Promise<LsdPage | null>;
1270
+ free(clearStateData?: boolean): boolean;
1247
1271
  hasFreePage(pageNum?: number): boolean;
1248
1272
  id(): string;
1249
1273
  isIncognito(): boolean;
1274
+ isFree(): boolean;
1250
1275
  page(pageIdx: number): LsdPage | null;
1251
1276
  pages(): LsdPage[];
1252
1277
  proxy(): ProxyInController | null;
1253
1278
  setStateData(stateData: BrowserStateData): Promise<boolean>;
1279
+ status(): BrowserContextStatus;
1280
+ use(): boolean;
1254
1281
  _origBrowserContext(): AllBrowserContext;
1255
1282
  }
1256
1283
 
@@ -1425,4 +1452,4 @@ declare class LsdBrowserController implements LsdBrowserController$1 {
1425
1452
  }
1426
1453
  declare const controller: LsdBrowserController;
1427
1454
 
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 };
1455
+ 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,6 +1270,9 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1263
1270
  }
1264
1271
  async close() {
1265
1272
  if (this.#browserContext) {
1273
+ this.#status = "closed";
1274
+ this.#lastStatusUpdateTime = getCurrentUnixTime2();
1275
+ loginfo3(`browserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
1266
1276
  await this.#browserContext.close();
1267
1277
  }
1268
1278
  return true;
@@ -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,17 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1364
1377
  return null;
1365
1378
  }
1366
1379
  }
1380
+ free(clearStateData = false) {
1381
+ if (this.#status === "busy") {
1382
+ this.#status = "free";
1383
+ this.#lastStatusUpdateTime = getCurrentUnixTime2();
1384
+ if (clearStateData) {
1385
+ }
1386
+ return true;
1387
+ } else {
1388
+ return false;
1389
+ }
1390
+ }
1367
1391
  hasFreePage(pageNum = 1) {
1368
1392
  if (this.#maxPagesPerBrowserContext - this.#lsdPages.length > pageNum) {
1369
1393
  return true;
@@ -1376,6 +1400,9 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1376
1400
  id() {
1377
1401
  return `browserContext-${this.#browserIdx}-${this.#browserContextIdx}`;
1378
1402
  }
1403
+ isFree() {
1404
+ return this.#status === "free";
1405
+ }
1379
1406
  isIncognito() {
1380
1407
  return this.#incognito;
1381
1408
  }
@@ -1431,17 +1458,30 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1431
1458
  return false;
1432
1459
  }
1433
1460
  }
1461
+ status() {
1462
+ return this.#status;
1463
+ }
1464
+ use() {
1465
+ if (this.#status === "free") {
1466
+ this.#status = "busy";
1467
+ this.#lastStatusUpdateTime = getCurrentUnixTime2();
1468
+ return true;
1469
+ } else {
1470
+ return false;
1471
+ }
1472
+ }
1434
1473
  _origBrowserContext() {
1435
1474
  return this.#browserContext;
1436
1475
  }
1437
1476
  };
1438
1477
 
1439
1478
  // src/playwright/browser.ts
1440
- import { getPerformanceOfPidTree, logerr as logerr3, loginfo as loginfo4, logwarn as logwarn3 } from "@letsscrapedata/utils";
1479
+ import { getCurrentUnixTime as getCurrentUnixTime3, getPerformanceOfPidTree, logerr as logerr3, loginfo as loginfo4, logwarn as logwarn3 } from "@letsscrapedata/utils";
1441
1480
  var PlaywrightBrowser = class extends EventEmitter3 {
1442
1481
  #browser;
1443
1482
  #browserIdx;
1444
1483
  #pid;
1484
+ #createTime;
1445
1485
  #lsdBrowserContexts;
1446
1486
  #browserControllerType;
1447
1487
  #browserType;
@@ -1475,6 +1515,7 @@ var PlaywrightBrowser = class extends EventEmitter3 {
1475
1515
  this.#browser = browser;
1476
1516
  this.#browserIdx = browserIdx;
1477
1517
  this.#pid = pid;
1518
+ this.#createTime = getCurrentUnixTime3();
1478
1519
  this.#lsdBrowserContexts = [];
1479
1520
  this.#browserControllerType = "playwright";
1480
1521
  this.#browserType = browerType;
@@ -1492,7 +1533,7 @@ var PlaywrightBrowser = class extends EventEmitter3 {
1492
1533
  }
1493
1534
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
1494
1535
  for (const browserContext of browserContexts) {
1495
- const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
1536
+ const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
1496
1537
  this.#lsdBrowserContexts.push(lsdBrowserContext);
1497
1538
  loginfo4(`##browserContext ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
1498
1539
  }
@@ -1550,7 +1591,7 @@ var PlaywrightBrowser = class extends EventEmitter3 {
1550
1591
  }
1551
1592
  const browserContext = await this.#browser.newContext(browserContextOptions);
1552
1593
  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);
1594
+ const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
1554
1595
  this.#lsdBrowserContexts.push(lsdBrowserContext);
1555
1596
  loginfo4(`##browser ${lsdBrowserContext.id()} created`);
1556
1597
  return lsdBrowserContext;
@@ -1577,6 +1618,9 @@ var PlaywrightBrowser = class extends EventEmitter3 {
1577
1618
  browserType() {
1578
1619
  return this.#browserType;
1579
1620
  }
1621
+ createTime() {
1622
+ return this.#createTime;
1623
+ }
1580
1624
  doesMeetBrowserContextRequirements(browserContextRequirements) {
1581
1625
  const { browserControllerTypes, browserTypes, browserHeadlesses } = browserContextRequirements;
1582
1626
  return (browserControllerTypes.length === 0 || browserControllerTypes.includes(this.#browserControllerType)) && (browserTypes.length === 0 || browserTypes.includes(this.#browserType)) && (browserHeadlesses.length === 0 || browserHeadlesses.includes(this.#headless));
@@ -1900,7 +1944,7 @@ var PuppeteerElement = class _PuppeteerElement {
1900
1944
  };
1901
1945
 
1902
1946
  // src/puppeteer/page.ts
1903
- import { getCurrentUnixTime as getCurrentUnixTime3, logerr as logerr5, loginfo as loginfo5, unreachable as unreachable4 } from "@letsscrapedata/utils";
1947
+ import { getCurrentUnixTime as getCurrentUnixTime4, logerr as logerr5, loginfo as loginfo5, unreachable as unreachable4 } from "@letsscrapedata/utils";
1904
1948
  var PuppeteerPage = class extends EventEmitter4 {
1905
1949
  #lsdBrowserContext;
1906
1950
  #page;
@@ -2098,7 +2142,7 @@ var PuppeteerPage = class extends EventEmitter4 {
2098
2142
  this.#lsdBrowserContext = browserContext;
2099
2143
  this.#page = page;
2100
2144
  this.#status = "free";
2101
- const currentTime = getCurrentUnixTime3();
2145
+ const currentTime = getCurrentUnixTime4();
2102
2146
  const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
2103
2147
  this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId, relatedId, misc };
2104
2148
  this.#pageId = `page-${browserIdx}-${browserContextIdx}-${pageIdx}`;
@@ -2696,18 +2740,21 @@ var PuppeteerPage = class extends EventEmitter4 {
2696
2740
  };
2697
2741
 
2698
2742
  // src/puppeteer/context.ts
2699
- import { getCurrentUnixTime as getCurrentUnixTime4, logerr as logerr6, loginfo as loginfo6, logwarn as logwarn4, sleep as sleep2 } from "@letsscrapedata/utils";
2743
+ import { getCurrentUnixTime as getCurrentUnixTime5, logerr as logerr6, loginfo as loginfo6, logwarn as logwarn4, sleep as sleep2 } from "@letsscrapedata/utils";
2700
2744
  var PuppeteerBrowserContext = class extends EventEmitter5 {
2701
2745
  #lsdBrowser;
2702
2746
  #browserIdx;
2703
2747
  #browserContextIdx;
2704
2748
  #browserContext;
2749
+ #browserContextCreationMethod;
2705
2750
  /**
2706
2751
  * the userAgent of pages in this browserContext if userAgent
2707
2752
  * * Notice: it is not the actual userAgent if !#userAgent (ignored if !#userAgent)
2708
2753
  */
2709
2754
  #userAgent;
2710
2755
  #createTime;
2756
+ #lastStatusUpdateTime;
2757
+ #status;
2711
2758
  #incognito;
2712
2759
  #proxy;
2713
2760
  #maxPagesPerBrowserContext;
@@ -2722,7 +2769,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2722
2769
  }
2723
2770
  const pages = await this.#browserContext.pages();
2724
2771
  const openType = this.#lsdBrowser.browserCreationMethod();
2725
- const lastStatusUpdateTime = getCurrentUnixTime4();
2772
+ const lastStatusUpdateTime = getCurrentUnixTime5();
2726
2773
  for (const page of pages) {
2727
2774
  const pageInfo = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType, openTime: this.#createTime, lastStatusUpdateTime, taskId: 0, relatedId: 0, misc: {} };
2728
2775
  const lsdPage = new PuppeteerPage(this, page, pageInfo);
@@ -2736,7 +2783,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2736
2783
  loginfo6(`##browser ${lsdPage.id()} ${openType}ed`);
2737
2784
  }
2738
2785
  }
2739
- constructor(lsdBrowser, browserContext, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxViewportOfNewPage = true) {
2786
+ constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxViewportOfNewPage = true) {
2740
2787
  if (!lsdBrowser || typeof lsdBrowser.browserContexts !== "function") {
2741
2788
  throw new Error(`Invalid lsdBrowser parameter`);
2742
2789
  }
@@ -2748,8 +2795,12 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2748
2795
  this.#browserIdx = browserIdx;
2749
2796
  this.#browserContextIdx = browserContextIdx;
2750
2797
  this.#browserContext = browserContext;
2798
+ this.#browserContextCreationMethod = browserContextCreationMethod;
2751
2799
  this.#userAgent = userAgent;
2752
- this.#createTime = getCurrentUnixTime4();
2800
+ const currentTime = getCurrentUnixTime5();
2801
+ this.#createTime = currentTime;
2802
+ this.#lastStatusUpdateTime = currentTime;
2803
+ this.#status = "free";
2753
2804
  this.#incognito = incognito === false ? false : true;
2754
2805
  this.#proxy = proxy?.proxyUrl ? proxy : null;
2755
2806
  this.#maxPagesPerBrowserContext = maxPagesPerBrowserContext;
@@ -2770,8 +2821,8 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2770
2821
  const { browserIdx: browserIdx2, browserContextIdx: browserContextIdx2, pageIdx } = pageInfo;
2771
2822
  logwarn4(`##browser page-${browserIdx2}-${browserContextIdx2}-${pageIdx} has been already created`);
2772
2823
  } 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: {} };
2824
+ const currentTime2 = getCurrentUnixTime5();
2825
+ const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
2775
2826
  const lsdPage = new PuppeteerPage(this, page, pageInfo2);
2776
2827
  if (this.#maxViewportOfNewPage) {
2777
2828
  await lsdPage.maximizeViewport();
@@ -2809,7 +2860,12 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2809
2860
  }
2810
2861
  async close() {
2811
2862
  if (this.#browserContext) {
2812
- await this.#browserContext.close();
2863
+ this.#status = "closed";
2864
+ this.#lastStatusUpdateTime = getCurrentUnixTime5();
2865
+ loginfo6(`browserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
2866
+ if (this.#browserContextCreationMethod !== "launch") {
2867
+ await this.#browserContext.close();
2868
+ }
2813
2869
  }
2814
2870
  return true;
2815
2871
  }
@@ -2845,7 +2901,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2845
2901
  return false;
2846
2902
  }
2847
2903
  try {
2848
- const maxUpdateTime = getCurrentUnixTime4() - this.#maxPageFreeSeconds;
2904
+ const maxUpdateTime = getCurrentUnixTime5() - this.#maxPageFreeSeconds;
2849
2905
  let freePages = this.#lsdPages.filter((p) => p.isFree() && p.pageInfo().lastStatusUpdateTime < maxUpdateTime);
2850
2906
  if (freePages.length === this.#lsdPages.length) {
2851
2907
  freePages = freePages.slice(1);
@@ -2861,6 +2917,9 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2861
2917
  return false;
2862
2918
  }
2863
2919
  }
2920
+ creationMethod() {
2921
+ return this.#browserContextCreationMethod;
2922
+ }
2864
2923
  doesMeetBrowserContextRequirements(browserContextRequirements) {
2865
2924
  if (!this.#lsdBrowser.doesMeetBrowserContextRequirements(browserContextRequirements)) {
2866
2925
  return false;
@@ -2912,6 +2971,17 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2912
2971
  return null;
2913
2972
  }
2914
2973
  }
2974
+ free(clearStateData = false) {
2975
+ if (this.#status === "busy") {
2976
+ this.#status = "free";
2977
+ this.#lastStatusUpdateTime = getCurrentUnixTime5();
2978
+ if (clearStateData) {
2979
+ }
2980
+ return true;
2981
+ } else {
2982
+ return false;
2983
+ }
2984
+ }
2915
2985
  hasFreePage(pageNum = 1) {
2916
2986
  if (this.#maxPagesPerBrowserContext - this.#lsdPages.length > pageNum) {
2917
2987
  return true;
@@ -2927,6 +2997,9 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2927
2997
  isIncognito() {
2928
2998
  return this.#incognito;
2929
2999
  }
3000
+ isFree() {
3001
+ return this.#status === "free";
3002
+ }
2930
3003
  page(pageIdx) {
2931
3004
  const lsdPage = this.#lsdPages.find((p) => p.pageInfo().pageIdx === pageIdx);
2932
3005
  return lsdPage ? lsdPage : null;
@@ -2979,17 +3052,30 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2979
3052
  return false;
2980
3053
  }
2981
3054
  }
3055
+ status() {
3056
+ return this.#status;
3057
+ }
3058
+ use() {
3059
+ if (this.#status === "free") {
3060
+ this.#status = "busy";
3061
+ this.#lastStatusUpdateTime = getCurrentUnixTime5();
3062
+ return true;
3063
+ } else {
3064
+ return false;
3065
+ }
3066
+ }
2982
3067
  _origBrowserContext() {
2983
3068
  return this.#browserContext;
2984
3069
  }
2985
3070
  };
2986
3071
 
2987
3072
  // src/puppeteer/browser.ts
2988
- import { getPerformanceOfPidTree as getPerformanceOfPidTree2, logerr as logerr7, loginfo as loginfo7, logwarn as logwarn5 } from "@letsscrapedata/utils";
3073
+ import { getCurrentUnixTime as getCurrentUnixTime6, getPerformanceOfPidTree as getPerformanceOfPidTree2, logerr as logerr7, loginfo as loginfo7, logwarn as logwarn5 } from "@letsscrapedata/utils";
2989
3074
  var PuppeteerBrowser = class extends EventEmitter6 {
2990
3075
  #browser;
2991
3076
  #browserIdx;
2992
3077
  #pid;
3078
+ #createTime;
2993
3079
  #lsdBrowserContexts;
2994
3080
  #browserControllerType;
2995
3081
  #browserType;
@@ -3026,6 +3112,7 @@ var PuppeteerBrowser = class extends EventEmitter6 {
3026
3112
  this.#browser = browser;
3027
3113
  this.#browserIdx = browserIdx;
3028
3114
  this.#pid = pid;
3115
+ this.#createTime = getCurrentUnixTime6();
3029
3116
  this.#lsdBrowserContexts = [];
3030
3117
  this.#browserControllerType = "puppeteer";
3031
3118
  this.#browserType = browerType;
@@ -3040,7 +3127,7 @@ var PuppeteerBrowser = class extends EventEmitter6 {
3040
3127
  const browserContexts = browser.browserContexts();
3041
3128
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : false;
3042
3129
  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);
3130
+ const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), this.#userAgent(), maxViewportOfNewPage);
3044
3131
  this.#lsdBrowserContexts.push(lsdBrowserContext);
3045
3132
  loginfo7(`##browser ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
3046
3133
  }
@@ -3092,7 +3179,7 @@ var PuppeteerBrowser = class extends EventEmitter6 {
3092
3179
  const browserContext = await this.#browser.createBrowserContext(browserContextOptions);
3093
3180
  const userAgent = options?.userAgent ? options.userAgent : "";
3094
3181
  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);
3182
+ const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxViewportOfNewPage);
3096
3183
  this.#lsdBrowserContexts.push(lsdBrowserContext);
3097
3184
  loginfo7(`##browser ${lsdBrowserContext.id()} created`);
3098
3185
  return lsdBrowserContext;
@@ -3102,9 +3189,7 @@ var PuppeteerBrowser = class extends EventEmitter6 {
3102
3189
  clearInterval(this.#closeFreePagesIntervalId);
3103
3190
  }
3104
3191
  for (const lsdBrowserContext of this.#lsdBrowserContexts) {
3105
- if (lsdBrowserContext.isIncognito()) {
3106
- await lsdBrowserContext.close();
3107
- }
3192
+ await lsdBrowserContext.close();
3108
3193
  }
3109
3194
  await this.#browser.close();
3110
3195
  return true;
@@ -3121,6 +3206,9 @@ var PuppeteerBrowser = class extends EventEmitter6 {
3121
3206
  browserType() {
3122
3207
  return this.#browserType;
3123
3208
  }
3209
+ createTime() {
3210
+ return this.#createTime;
3211
+ }
3124
3212
  doesMeetBrowserContextRequirements(browserContextRequirements) {
3125
3213
  const { browserControllerTypes, browserTypes, browserHeadlesses } = browserContextRequirements;
3126
3214
  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.48",
4
4
  "description": "Unified browser / HTML controller interfaces that support playwright, puppeteer and cheerio",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",