@letsscrapedata/controller 0.0.34 → 0.0.36

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
@@ -1446,6 +1446,7 @@ var import_utils4 = require("@letsscrapedata/utils");
1446
1446
  var PlaywrightBrowser = class extends import_node_events3.default {
1447
1447
  #browser;
1448
1448
  #browserIdx;
1449
+ #pid;
1449
1450
  #lsdBrowserContexts;
1450
1451
  #browserControllerType;
1451
1452
  #browserType;
@@ -1470,7 +1471,7 @@ var PlaywrightBrowser = class extends import_node_events3.default {
1470
1471
  return this.#options.maxPageFreeSeconds ? this.#options.maxPageFreeSeconds : 900;
1471
1472
  }
1472
1473
  // 构造函数:缺省只能由LsdBrowserController.launch/connect调用创建实例!!!
1473
- constructor(browser, browerType, browserCreateMethod, options, browserIdx = 0) {
1474
+ constructor(browser, browerType, browserCreateMethod, options, browserIdx = 0, pid = 0) {
1474
1475
  if (!browser || typeof browser.contexts !== "function") {
1475
1476
  throw new Error(`Invalid playwright browser parameter`);
1476
1477
  }
@@ -1478,6 +1479,7 @@ var PlaywrightBrowser = class extends import_node_events3.default {
1478
1479
  const { closeFreePagesIntervalSeconds = 300, maxPageFreeSeconds = 900, maxViewportOfNewPage = true, headless = false, executablePath = "" } = options;
1479
1480
  this.#browser = browser;
1480
1481
  this.#browserIdx = browserIdx;
1482
+ this.#pid = pid;
1481
1483
  this.#lsdBrowserContexts = [];
1482
1484
  this.#browserControllerType = "playwright";
1483
1485
  this.#browserType = browerType;
@@ -1597,6 +1599,17 @@ var PlaywrightBrowser = class extends import_node_events3.default {
1597
1599
  options() {
1598
1600
  return this.#options;
1599
1601
  }
1602
+ pid() {
1603
+ return this.#pid;
1604
+ }
1605
+ async pidUsage() {
1606
+ if (this.#pid > 0) {
1607
+ const usage = await (0, import_utils4.getPerformanceOfPidTree)(this.#pid, "MB");
1608
+ return usage;
1609
+ } else {
1610
+ return { cpu: 0, memory: 0 };
1611
+ }
1612
+ }
1600
1613
  async version() {
1601
1614
  const version = await this.#browser.version();
1602
1615
  return version;
@@ -2953,6 +2966,7 @@ var import_utils8 = require("@letsscrapedata/utils");
2953
2966
  var PuppeteerBrowser = class extends import_node_events6.default {
2954
2967
  #browser;
2955
2968
  #browserIdx;
2969
+ #pid;
2956
2970
  #lsdBrowserContexts;
2957
2971
  #browserControllerType;
2958
2972
  #browserType;
@@ -2980,7 +2994,7 @@ var PuppeteerBrowser = class extends import_node_events6.default {
2980
2994
  return this.#options.userAgent ? this.#options.userAgent : "";
2981
2995
  }
2982
2996
  // 构造函数:缺省只能由LsdBrowserController.launch/connect调用创建实例!!!
2983
- constructor(browser, browerType, browserCreateMethod, options, browserIdx = 0) {
2997
+ constructor(browser, browerType, browserCreateMethod, options, browserIdx = 0, pid = 0) {
2984
2998
  if (!browser || typeof browser.browserContexts !== "function") {
2985
2999
  throw new Error(`Invalid puppeteer browser parameter`);
2986
3000
  }
@@ -2988,6 +3002,7 @@ var PuppeteerBrowser = class extends import_node_events6.default {
2988
3002
  const { closeFreePagesIntervalSeconds = 300, maxPageFreeSeconds = 900, maxViewportOfNewPage = true, headless = false, executablePath = "" } = options;
2989
3003
  this.#browser = browser;
2990
3004
  this.#browserIdx = browserIdx;
3005
+ this.#pid = pid;
2991
3006
  this.#lsdBrowserContexts = [];
2992
3007
  this.#browserControllerType = "puppeteer";
2993
3008
  this.#browserType = browerType;
@@ -3100,6 +3115,17 @@ var PuppeteerBrowser = class extends import_node_events6.default {
3100
3115
  options() {
3101
3116
  return this.#options;
3102
3117
  }
3118
+ pid() {
3119
+ return this.#pid;
3120
+ }
3121
+ async pidUsage() {
3122
+ if (this.#pid > 0) {
3123
+ const usage = await (0, import_utils8.getPerformanceOfPidTree)(this.#pid, "MB");
3124
+ return usage;
3125
+ } else {
3126
+ return { cpu: 0, memory: 0 };
3127
+ }
3128
+ }
3103
3129
  async version() {
3104
3130
  const version = await this.#browser.version();
3105
3131
  return version;
@@ -17382,6 +17408,7 @@ var LsdBrowserController = class _LsdBrowserController {
17382
17408
  userDataDir = "",
17383
17409
  userAgent = ""
17384
17410
  } = options ? options : {};
17411
+ let browserPid = 0;
17385
17412
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : browserControllerType === "puppeteer" ? false : true;
17386
17413
  const actOptions = { closeFreePagesIntervalSeconds, maxBrowserContextsPerBrowser, maxPagesPerBrowserContext, maxPageFreeSeconds, maxViewportOfNewPage, proxy, timeout, args, executablePath, maxWindowSize, headless, minBrowserContexts, incognito, proxyPerBrowserContext, userDataDir, userAgent };
17387
17414
  let idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--incoginto"));
@@ -17433,8 +17460,19 @@ var LsdBrowserController = class _LsdBrowserController {
17433
17460
  if (!actOptions.executablePath) {
17434
17461
  actOptions.executablePath = playwrightBrowserType.executablePath();
17435
17462
  }
17436
- const browser = await playwrightBrowserType.launch(launchOptions);
17437
- lsdBrowser = new PlaywrightBrowser(browser, browserType, "launch", actOptions, this.#nextBrowserIdx++);
17463
+ if (options.launchMethod === "launchServer") {
17464
+ const browserServer = await playwrightBrowserType.launchServer(launchOptions);
17465
+ const process = browserServer.process();
17466
+ if (process?.pid) {
17467
+ browserPid = process.pid;
17468
+ }
17469
+ const wsEndpoint = browserServer.wsEndpoint();
17470
+ const browser = await playwrightBrowserType.connect(wsEndpoint);
17471
+ lsdBrowser = new PlaywrightBrowser(browser, browserType, "launch", actOptions, this.#nextBrowserIdx++, browserPid);
17472
+ } else {
17473
+ const browser = await playwrightBrowserType.launch(launchOptions);
17474
+ lsdBrowser = new PlaywrightBrowser(browser, browserType, "launch", actOptions, this.#nextBrowserIdx++, browserPid);
17475
+ }
17438
17476
  } else if (browserControllerType === "puppeteer") {
17439
17477
  const product = this.#puppeteerProduct(browserType);
17440
17478
  const launchOptions = { headless, timeout, product };
@@ -17467,7 +17505,11 @@ var LsdBrowserController = class _LsdBrowserController {
17467
17505
  actOptions.executablePath = this.#puppeteer.executablePath();
17468
17506
  }
17469
17507
  const browser = await this.#puppeteer.launch(launchOptions);
17470
- lsdBrowser = new PuppeteerBrowser(browser, browserType, "launch", actOptions, this.#nextBrowserIdx++);
17508
+ const browserProcess = browser.process();
17509
+ if (browserProcess?.pid) {
17510
+ browserPid = browserProcess.pid;
17511
+ }
17512
+ lsdBrowser = new PuppeteerBrowser(browser, browserType, "launch", actOptions, this.#nextBrowserIdx++, browserPid);
17471
17513
  } else {
17472
17514
  throw new Error(`Invalid browserControllerType: ${browserControllerType} in launch`);
17473
17515
  }
@@ -17494,16 +17536,25 @@ var LsdBrowserController = class _LsdBrowserController {
17494
17536
  if (typeof browserUrl !== "string" || !browserUrl.toLowerCase().startsWith("http://")) {
17495
17537
  throw new Error(`Invalid browserUrl ${browserUrl} in connect`);
17496
17538
  }
17539
+ const u = new URL(browserUrl);
17540
+ const port = u.port ? parseInt(u.port) : 80;
17541
+ const pids = await (0, import_utils15.getPidsListeningOnPort)(port);
17542
+ let browserPid = 0;
17543
+ if (pids.length !== 1) {
17544
+ (0, import_utils15.logerr)(`##browser pids.length ${pids.length} is not 1 when trying to connect to browserUrl ${browserUrl}`);
17545
+ } else {
17546
+ browserPid = pids[0];
17547
+ }
17497
17548
  const actOptions = { closeFreePagesIntervalSeconds, maxBrowserContextsPerBrowser, maxPagesPerBrowserContext, maxPageFreeSeconds, maxViewportOfNewPage, proxy, timeout, browserUrl, executablePath, headless, incognito, userAgent };
17498
17549
  if (browserControllerType === "playwright") {
17499
17550
  const playwrightBrowserType = this.#playwrightBrowserType(browserType, true);
17500
17551
  const browser = await playwrightBrowserType.connectOverCDP(browserUrl);
17501
- const lsdBrowser = new PlaywrightBrowser(browser, browserType, "connect", actOptions, this.#nextBrowserIdx++);
17552
+ const lsdBrowser = new PlaywrightBrowser(browser, browserType, "connect", actOptions, this.#nextBrowserIdx++, browserPid);
17502
17553
  return lsdBrowser;
17503
17554
  } else if (browserControllerType === "puppeteer") {
17504
17555
  this.#puppeteerProduct(browserType);
17505
17556
  const browser = await this.#puppeteer.connect({ browserURL: browserUrl });
17506
- const lsdBrowser = new PuppeteerBrowser(browser, browserType, "connect", options, this.#nextBrowserIdx++);
17557
+ const lsdBrowser = new PuppeteerBrowser(browser, browserType, "connect", options, this.#nextBrowserIdx++, browserPid);
17507
17558
  ;
17508
17559
  return lsdBrowser;
17509
17560
  } else {
package/dist/index.d.cts CHANGED
@@ -31,9 +31,6 @@ interface PlaywrightBrowserTypes {
31
31
  firefox: BrowserType;
32
32
  webkit: BrowserType;
33
33
  }
34
- type BrowserControllerOptions = {
35
- browserControllerType: BrowserControllerType;
36
- };
37
34
  interface BrowserOptions {
38
35
  /**
39
36
  * Interval between closing free pages (seconds) if greater than 0
@@ -71,6 +68,11 @@ interface BrowserOptions {
71
68
  */
72
69
  timeout?: number;
73
70
  }
71
+ /**
72
+ * * puppeteer: launchServer is the same as launch
73
+ * * playwright: use "launchServer" if it's necessary to call LsdBrowser.pid()/pidUsage()
74
+ */
75
+ type BrowserLaunchMethod = "launch" | "launchServer";
74
76
  interface LsdLaunchOptions extends BrowserOptions {
75
77
  args?: string[];
76
78
  executablePath?: string;
@@ -102,6 +104,10 @@ interface LsdLaunchOptions extends BrowserOptions {
102
104
  */
103
105
  userAgent?: string;
104
106
  userDataDir?: string;
107
+ /**
108
+ * @default "launch"
109
+ */
110
+ launchMethod?: BrowserLaunchMethod;
105
111
  }
106
112
  interface LsdConnectOptions extends BrowserOptions {
107
113
  /**
@@ -419,7 +425,7 @@ interface LocalStorageOrigin {
419
425
  origin: string;
420
426
  localStorage: LocalStorageItem[];
421
427
  }
422
- interface StateData {
428
+ interface BrowserStateData {
423
429
  cookies: CookieItem[];
424
430
  localStorage: LocalStorageOrigin[];
425
431
  }
@@ -875,14 +881,14 @@ interface LsdPage extends EventEmitter {
875
881
  * Shortcut for LsdPage.browserContext().setStateData(stateData)
876
882
  * @param stateData
877
883
  */
878
- setStateData(stateData: StateData): Promise<boolean>;
884
+ setStateData(stateData: BrowserStateData): Promise<boolean>;
879
885
  /**
880
886
  * valid only in puppeteer
881
887
  * @param userAgent
882
888
  */
883
889
  setUserAgent(userAgent: string): Promise<boolean>;
884
890
  setViewportSize(viewPortSize: ViewportSize): Promise<boolean>;
885
- stateData(): Promise<StateData>;
891
+ stateData(): Promise<BrowserStateData>;
886
892
  status(): PageStatus;
887
893
  title(): Promise<string>;
888
894
  url(): string;
@@ -933,7 +939,7 @@ interface LsdBrowserContext extends EventEmitter {
933
939
  page(pageIdx: number): LsdPage | null;
934
940
  pages(): LsdPage[];
935
941
  proxy(): ProxyInController | null;
936
- setStateData(stateData: StateData): Promise<boolean>;
942
+ setStateData(stateData: BrowserStateData): Promise<boolean>;
937
943
  _origBrowserContext(): AllBrowserContext;
938
944
  }
939
945
  interface LsdBrowser extends EventEmitter {
@@ -962,6 +968,18 @@ interface LsdBrowser extends EventEmitter {
962
968
  isConnected(): boolean;
963
969
  isHeadless(): boolean;
964
970
  options(): LsdLaunchOptions | LsdConnectOptions;
971
+ /**
972
+ * * puppeteer: return pid of connected or launched browser
973
+ * * playwright: return pid of connected browser that is launched manually or using launchServer, or else return 0
974
+ */
975
+ pid(): number;
976
+ /**
977
+ * get the cpu utility(%) and memory usage(MB) of browser processes if pid is greater than 0 (refer to pid())
978
+ */
979
+ pidUsage(): Promise<{
980
+ cpu: number;
981
+ memory: number;
982
+ }>;
965
983
  version(): Promise<string>;
966
984
  _origBrowser(): AllBrowser;
967
985
  }
@@ -1025,7 +1043,7 @@ interface BrowserManager {
1025
1043
 
1026
1044
  declare class PlaywrightBrowser extends EventEmitter implements LsdBrowser {
1027
1045
  #private;
1028
- constructor(browser: Browser, browerType: LsdBrowserType, browserCreateMethod: BrowserCreationMethod, options: LsdLaunchOptions | LsdConnectOptions, browserIdx?: number);
1046
+ constructor(browser: Browser, browerType: LsdBrowserType, browserCreateMethod: BrowserCreationMethod, options: LsdLaunchOptions | LsdConnectOptions, browserIdx?: number, pid?: number);
1029
1047
  newBrowserContext(options?: LsdBrowserContextOptions): Promise<LsdBrowserContext | null>;
1030
1048
  close(): Promise<boolean>;
1031
1049
  browserContexts(): LsdBrowserContext[];
@@ -1037,6 +1055,11 @@ declare class PlaywrightBrowser extends EventEmitter implements LsdBrowser {
1037
1055
  isConnected(): boolean;
1038
1056
  isHeadless(): boolean;
1039
1057
  options(): LsdLaunchOptions | LsdConnectOptions;
1058
+ pid(): number;
1059
+ pidUsage(): Promise<{
1060
+ cpu: number;
1061
+ memory: number;
1062
+ }>;
1040
1063
  version(): Promise<string>;
1041
1064
  _origBrowser(): AllBrowser;
1042
1065
  }
@@ -1054,7 +1077,7 @@ declare class PlaywrightBrowserContext extends EventEmitter implements LsdBrowse
1054
1077
  page(pageIdx: number): LsdPage | null;
1055
1078
  pages(): LsdPage[];
1056
1079
  proxy(): ProxyInController | null;
1057
- setStateData(stateData: StateData): Promise<boolean>;
1080
+ setStateData(stateData: BrowserStateData): Promise<boolean>;
1058
1081
  _origBrowserContext(): AllBrowserContext;
1059
1082
  }
1060
1083
 
@@ -1098,10 +1121,10 @@ declare class PlaywrightPage extends EventEmitter implements LsdPage {
1098
1121
  setPageInfo(pageInfo: UpdatablePageInfo): boolean;
1099
1122
  setRequestInterception(options: RequestInterceptionOption | RequestInterceptionOption[]): Promise<boolean>;
1100
1123
  setResponseInterception(options: ResponseInterceptionOption | ResponseInterceptionOption[]): Promise<boolean>;
1101
- setStateData(stateData: StateData): Promise<boolean>;
1124
+ setStateData(stateData: BrowserStateData): Promise<boolean>;
1102
1125
  setUserAgent(userAgent: string): Promise<boolean>;
1103
1126
  setViewportSize(viewPortSize: ViewportSize): Promise<boolean>;
1104
- stateData(): Promise<StateData>;
1127
+ stateData(): Promise<BrowserStateData>;
1105
1128
  status(): PageStatus;
1106
1129
  title(): Promise<string>;
1107
1130
  url(): string;
@@ -1136,7 +1159,7 @@ declare class PlaywrightElement implements LsdElement {
1136
1159
 
1137
1160
  declare class PuppeteerBrowser extends EventEmitter implements LsdBrowser {
1138
1161
  #private;
1139
- constructor(browser: Browser$1, browerType: LsdBrowserType, browserCreateMethod: BrowserCreationMethod, options: LsdLaunchOptions | LsdConnectOptions, browserIdx?: number);
1162
+ constructor(browser: Browser$1, browerType: LsdBrowserType, browserCreateMethod: BrowserCreationMethod, options: LsdLaunchOptions | LsdConnectOptions, browserIdx?: number, pid?: number);
1140
1163
  newBrowserContext(options?: LsdBrowserContextOptions | undefined): Promise<LsdBrowserContext | null>;
1141
1164
  close(): Promise<boolean>;
1142
1165
  browserContexts(): LsdBrowserContext[];
@@ -1148,6 +1171,11 @@ declare class PuppeteerBrowser extends EventEmitter implements LsdBrowser {
1148
1171
  isConnected(): boolean;
1149
1172
  isHeadless(): boolean;
1150
1173
  options(): LsdLaunchOptions | LsdConnectOptions;
1174
+ pid(): number;
1175
+ pidUsage(): Promise<{
1176
+ cpu: number;
1177
+ memory: number;
1178
+ }>;
1151
1179
  version(): Promise<string>;
1152
1180
  _origBrowser(): AllBrowser;
1153
1181
  }
@@ -1165,7 +1193,7 @@ declare class PuppeteerBrowserContext extends EventEmitter implements LsdBrowser
1165
1193
  page(pageIdx: number): LsdPage | null;
1166
1194
  pages(): LsdPage[];
1167
1195
  proxy(): ProxyInController | null;
1168
- setStateData(stateData: StateData): Promise<boolean>;
1196
+ setStateData(stateData: BrowserStateData): Promise<boolean>;
1169
1197
  _origBrowserContext(): AllBrowserContext;
1170
1198
  }
1171
1199
 
@@ -1209,10 +1237,10 @@ declare class PuppeteerPage extends EventEmitter implements LsdPage {
1209
1237
  setPageInfo(pageInfo: UpdatablePageInfo): boolean;
1210
1238
  setRequestInterception(options: RequestInterceptionOption | RequestInterceptionOption[]): Promise<boolean>;
1211
1239
  setResponseInterception(options: ResponseInterceptionOption | ResponseInterceptionOption[]): Promise<boolean>;
1212
- setStateData(stateData: StateData): Promise<boolean>;
1240
+ setStateData(stateData: BrowserStateData): Promise<boolean>;
1213
1241
  setUserAgent(userAgent: string): Promise<boolean>;
1214
1242
  setViewportSize(viewPortSize: ViewportSize): Promise<boolean>;
1215
- stateData(): Promise<StateData>;
1243
+ stateData(): Promise<BrowserStateData>;
1216
1244
  status(): PageStatus;
1217
1245
  title(): Promise<string>;
1218
1246
  url(): string;
@@ -1293,7 +1321,7 @@ declare class CheerioPage extends EventEmitter implements LsdPage {
1293
1321
  setStateData(): Promise<boolean>;
1294
1322
  setUserAgent(): Promise<boolean>;
1295
1323
  setViewportSize(): Promise<boolean>;
1296
- stateData(): Promise<StateData>;
1324
+ stateData(): Promise<BrowserStateData>;
1297
1325
  status(): PageStatus;
1298
1326
  title(): Promise<string>;
1299
1327
  url(): string;
@@ -1336,4 +1364,4 @@ declare class LsdBrowserController implements LsdBrowserController$1 {
1336
1364
  }
1337
1365
  declare const controller: LsdBrowserController;
1338
1366
 
1339
- export { type AllApiRequestContext, type AllBrowser, type AllBrowserContext, type AllFrame, type AllPage, type AllResponse, type BrowserControllerOptions, type BrowserControllerType, type BrowserCreationMethod, type BrowserManager, CheerioElement, type CheerioNode, CheerioPage, type CookieItem, type GotoOptions, type IframeOption, type InputOptions, type KeyInput, type KeyPressOptions, type LocalStorageItem, type LocalStorageOrigin, type LowerCasePaperFormat, type LsdBrowser, type LsdBrowserContext, type LsdBrowserContextOptions, type LsdBrowserController$1 as LsdBrowserController, type LsdBrowserType, type LsdConnectOptions, type LsdElement, 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 StateData, type UpdatablePageInfo, type ViewportSize, type WaitElementOptions, type WaitElementState, type WaitNavigationOptions, controller };
1367
+ export { type AllApiRequestContext, type AllBrowser, type AllBrowserContext, type AllFrame, type AllPage, type AllResponse, type BrowserControllerType, type BrowserCreationMethod, type BrowserLaunchMethod, type BrowserManager, type BrowserStateData, CheerioElement, type CheerioNode, CheerioPage, type CookieItem, type GotoOptions, type IframeOption, type InputOptions, type KeyInput, type KeyPressOptions, type LocalStorageItem, type LocalStorageOrigin, type LowerCasePaperFormat, type LsdBrowser, type LsdBrowserContext, type LsdBrowserContextOptions, type LsdBrowserController$1 as LsdBrowserController, type LsdBrowserType, type LsdConnectOptions, type LsdElement, 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
@@ -31,9 +31,6 @@ interface PlaywrightBrowserTypes {
31
31
  firefox: BrowserType;
32
32
  webkit: BrowserType;
33
33
  }
34
- type BrowserControllerOptions = {
35
- browserControllerType: BrowserControllerType;
36
- };
37
34
  interface BrowserOptions {
38
35
  /**
39
36
  * Interval between closing free pages (seconds) if greater than 0
@@ -71,6 +68,11 @@ interface BrowserOptions {
71
68
  */
72
69
  timeout?: number;
73
70
  }
71
+ /**
72
+ * * puppeteer: launchServer is the same as launch
73
+ * * playwright: use "launchServer" if it's necessary to call LsdBrowser.pid()/pidUsage()
74
+ */
75
+ type BrowserLaunchMethod = "launch" | "launchServer";
74
76
  interface LsdLaunchOptions extends BrowserOptions {
75
77
  args?: string[];
76
78
  executablePath?: string;
@@ -102,6 +104,10 @@ interface LsdLaunchOptions extends BrowserOptions {
102
104
  */
103
105
  userAgent?: string;
104
106
  userDataDir?: string;
107
+ /**
108
+ * @default "launch"
109
+ */
110
+ launchMethod?: BrowserLaunchMethod;
105
111
  }
106
112
  interface LsdConnectOptions extends BrowserOptions {
107
113
  /**
@@ -419,7 +425,7 @@ interface LocalStorageOrigin {
419
425
  origin: string;
420
426
  localStorage: LocalStorageItem[];
421
427
  }
422
- interface StateData {
428
+ interface BrowserStateData {
423
429
  cookies: CookieItem[];
424
430
  localStorage: LocalStorageOrigin[];
425
431
  }
@@ -875,14 +881,14 @@ interface LsdPage extends EventEmitter {
875
881
  * Shortcut for LsdPage.browserContext().setStateData(stateData)
876
882
  * @param stateData
877
883
  */
878
- setStateData(stateData: StateData): Promise<boolean>;
884
+ setStateData(stateData: BrowserStateData): Promise<boolean>;
879
885
  /**
880
886
  * valid only in puppeteer
881
887
  * @param userAgent
882
888
  */
883
889
  setUserAgent(userAgent: string): Promise<boolean>;
884
890
  setViewportSize(viewPortSize: ViewportSize): Promise<boolean>;
885
- stateData(): Promise<StateData>;
891
+ stateData(): Promise<BrowserStateData>;
886
892
  status(): PageStatus;
887
893
  title(): Promise<string>;
888
894
  url(): string;
@@ -933,7 +939,7 @@ interface LsdBrowserContext extends EventEmitter {
933
939
  page(pageIdx: number): LsdPage | null;
934
940
  pages(): LsdPage[];
935
941
  proxy(): ProxyInController | null;
936
- setStateData(stateData: StateData): Promise<boolean>;
942
+ setStateData(stateData: BrowserStateData): Promise<boolean>;
937
943
  _origBrowserContext(): AllBrowserContext;
938
944
  }
939
945
  interface LsdBrowser extends EventEmitter {
@@ -962,6 +968,18 @@ interface LsdBrowser extends EventEmitter {
962
968
  isConnected(): boolean;
963
969
  isHeadless(): boolean;
964
970
  options(): LsdLaunchOptions | LsdConnectOptions;
971
+ /**
972
+ * * puppeteer: return pid of connected or launched browser
973
+ * * playwright: return pid of connected browser that is launched manually or using launchServer, or else return 0
974
+ */
975
+ pid(): number;
976
+ /**
977
+ * get the cpu utility(%) and memory usage(MB) of browser processes if pid is greater than 0 (refer to pid())
978
+ */
979
+ pidUsage(): Promise<{
980
+ cpu: number;
981
+ memory: number;
982
+ }>;
965
983
  version(): Promise<string>;
966
984
  _origBrowser(): AllBrowser;
967
985
  }
@@ -1025,7 +1043,7 @@ interface BrowserManager {
1025
1043
 
1026
1044
  declare class PlaywrightBrowser extends EventEmitter implements LsdBrowser {
1027
1045
  #private;
1028
- constructor(browser: Browser, browerType: LsdBrowserType, browserCreateMethod: BrowserCreationMethod, options: LsdLaunchOptions | LsdConnectOptions, browserIdx?: number);
1046
+ constructor(browser: Browser, browerType: LsdBrowserType, browserCreateMethod: BrowserCreationMethod, options: LsdLaunchOptions | LsdConnectOptions, browserIdx?: number, pid?: number);
1029
1047
  newBrowserContext(options?: LsdBrowserContextOptions): Promise<LsdBrowserContext | null>;
1030
1048
  close(): Promise<boolean>;
1031
1049
  browserContexts(): LsdBrowserContext[];
@@ -1037,6 +1055,11 @@ declare class PlaywrightBrowser extends EventEmitter implements LsdBrowser {
1037
1055
  isConnected(): boolean;
1038
1056
  isHeadless(): boolean;
1039
1057
  options(): LsdLaunchOptions | LsdConnectOptions;
1058
+ pid(): number;
1059
+ pidUsage(): Promise<{
1060
+ cpu: number;
1061
+ memory: number;
1062
+ }>;
1040
1063
  version(): Promise<string>;
1041
1064
  _origBrowser(): AllBrowser;
1042
1065
  }
@@ -1054,7 +1077,7 @@ declare class PlaywrightBrowserContext extends EventEmitter implements LsdBrowse
1054
1077
  page(pageIdx: number): LsdPage | null;
1055
1078
  pages(): LsdPage[];
1056
1079
  proxy(): ProxyInController | null;
1057
- setStateData(stateData: StateData): Promise<boolean>;
1080
+ setStateData(stateData: BrowserStateData): Promise<boolean>;
1058
1081
  _origBrowserContext(): AllBrowserContext;
1059
1082
  }
1060
1083
 
@@ -1098,10 +1121,10 @@ declare class PlaywrightPage extends EventEmitter implements LsdPage {
1098
1121
  setPageInfo(pageInfo: UpdatablePageInfo): boolean;
1099
1122
  setRequestInterception(options: RequestInterceptionOption | RequestInterceptionOption[]): Promise<boolean>;
1100
1123
  setResponseInterception(options: ResponseInterceptionOption | ResponseInterceptionOption[]): Promise<boolean>;
1101
- setStateData(stateData: StateData): Promise<boolean>;
1124
+ setStateData(stateData: BrowserStateData): Promise<boolean>;
1102
1125
  setUserAgent(userAgent: string): Promise<boolean>;
1103
1126
  setViewportSize(viewPortSize: ViewportSize): Promise<boolean>;
1104
- stateData(): Promise<StateData>;
1127
+ stateData(): Promise<BrowserStateData>;
1105
1128
  status(): PageStatus;
1106
1129
  title(): Promise<string>;
1107
1130
  url(): string;
@@ -1136,7 +1159,7 @@ declare class PlaywrightElement implements LsdElement {
1136
1159
 
1137
1160
  declare class PuppeteerBrowser extends EventEmitter implements LsdBrowser {
1138
1161
  #private;
1139
- constructor(browser: Browser$1, browerType: LsdBrowserType, browserCreateMethod: BrowserCreationMethod, options: LsdLaunchOptions | LsdConnectOptions, browserIdx?: number);
1162
+ constructor(browser: Browser$1, browerType: LsdBrowserType, browserCreateMethod: BrowserCreationMethod, options: LsdLaunchOptions | LsdConnectOptions, browserIdx?: number, pid?: number);
1140
1163
  newBrowserContext(options?: LsdBrowserContextOptions | undefined): Promise<LsdBrowserContext | null>;
1141
1164
  close(): Promise<boolean>;
1142
1165
  browserContexts(): LsdBrowserContext[];
@@ -1148,6 +1171,11 @@ declare class PuppeteerBrowser extends EventEmitter implements LsdBrowser {
1148
1171
  isConnected(): boolean;
1149
1172
  isHeadless(): boolean;
1150
1173
  options(): LsdLaunchOptions | LsdConnectOptions;
1174
+ pid(): number;
1175
+ pidUsage(): Promise<{
1176
+ cpu: number;
1177
+ memory: number;
1178
+ }>;
1151
1179
  version(): Promise<string>;
1152
1180
  _origBrowser(): AllBrowser;
1153
1181
  }
@@ -1165,7 +1193,7 @@ declare class PuppeteerBrowserContext extends EventEmitter implements LsdBrowser
1165
1193
  page(pageIdx: number): LsdPage | null;
1166
1194
  pages(): LsdPage[];
1167
1195
  proxy(): ProxyInController | null;
1168
- setStateData(stateData: StateData): Promise<boolean>;
1196
+ setStateData(stateData: BrowserStateData): Promise<boolean>;
1169
1197
  _origBrowserContext(): AllBrowserContext;
1170
1198
  }
1171
1199
 
@@ -1209,10 +1237,10 @@ declare class PuppeteerPage extends EventEmitter implements LsdPage {
1209
1237
  setPageInfo(pageInfo: UpdatablePageInfo): boolean;
1210
1238
  setRequestInterception(options: RequestInterceptionOption | RequestInterceptionOption[]): Promise<boolean>;
1211
1239
  setResponseInterception(options: ResponseInterceptionOption | ResponseInterceptionOption[]): Promise<boolean>;
1212
- setStateData(stateData: StateData): Promise<boolean>;
1240
+ setStateData(stateData: BrowserStateData): Promise<boolean>;
1213
1241
  setUserAgent(userAgent: string): Promise<boolean>;
1214
1242
  setViewportSize(viewPortSize: ViewportSize): Promise<boolean>;
1215
- stateData(): Promise<StateData>;
1243
+ stateData(): Promise<BrowserStateData>;
1216
1244
  status(): PageStatus;
1217
1245
  title(): Promise<string>;
1218
1246
  url(): string;
@@ -1293,7 +1321,7 @@ declare class CheerioPage extends EventEmitter implements LsdPage {
1293
1321
  setStateData(): Promise<boolean>;
1294
1322
  setUserAgent(): Promise<boolean>;
1295
1323
  setViewportSize(): Promise<boolean>;
1296
- stateData(): Promise<StateData>;
1324
+ stateData(): Promise<BrowserStateData>;
1297
1325
  status(): PageStatus;
1298
1326
  title(): Promise<string>;
1299
1327
  url(): string;
@@ -1336,4 +1364,4 @@ declare class LsdBrowserController implements LsdBrowserController$1 {
1336
1364
  }
1337
1365
  declare const controller: LsdBrowserController;
1338
1366
 
1339
- export { type AllApiRequestContext, type AllBrowser, type AllBrowserContext, type AllFrame, type AllPage, type AllResponse, type BrowserControllerOptions, type BrowserControllerType, type BrowserCreationMethod, type BrowserManager, CheerioElement, type CheerioNode, CheerioPage, type CookieItem, type GotoOptions, type IframeOption, type InputOptions, type KeyInput, type KeyPressOptions, type LocalStorageItem, type LocalStorageOrigin, type LowerCasePaperFormat, type LsdBrowser, type LsdBrowserContext, type LsdBrowserContextOptions, type LsdBrowserController$1 as LsdBrowserController, type LsdBrowserType, type LsdConnectOptions, type LsdElement, 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 StateData, type UpdatablePageInfo, type ViewportSize, type WaitElementOptions, type WaitElementState, type WaitNavigationOptions, controller };
1367
+ export { type AllApiRequestContext, type AllBrowser, type AllBrowserContext, type AllFrame, type AllPage, type AllResponse, type BrowserControllerType, type BrowserCreationMethod, type BrowserLaunchMethod, type BrowserManager, type BrowserStateData, CheerioElement, type CheerioNode, CheerioPage, type CookieItem, type GotoOptions, type IframeOption, type InputOptions, type KeyInput, type KeyPressOptions, type LocalStorageItem, type LocalStorageOrigin, type LowerCasePaperFormat, type LsdBrowser, type LsdBrowserContext, type LsdBrowserContextOptions, type LsdBrowserController$1 as LsdBrowserController, type LsdBrowserType, type LsdConnectOptions, type LsdElement, 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
@@ -1423,10 +1423,11 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1423
1423
  };
1424
1424
 
1425
1425
  // src/playwright/browser.ts
1426
- import { logerr as logerr3, loginfo as loginfo4, logwarn as logwarn3 } from "@letsscrapedata/utils";
1426
+ import { getPerformanceOfPidTree, logerr as logerr3, loginfo as loginfo4, logwarn as logwarn3 } from "@letsscrapedata/utils";
1427
1427
  var PlaywrightBrowser = class extends EventEmitter3 {
1428
1428
  #browser;
1429
1429
  #browserIdx;
1430
+ #pid;
1430
1431
  #lsdBrowserContexts;
1431
1432
  #browserControllerType;
1432
1433
  #browserType;
@@ -1451,7 +1452,7 @@ var PlaywrightBrowser = class extends EventEmitter3 {
1451
1452
  return this.#options.maxPageFreeSeconds ? this.#options.maxPageFreeSeconds : 900;
1452
1453
  }
1453
1454
  // 构造函数:缺省只能由LsdBrowserController.launch/connect调用创建实例!!!
1454
- constructor(browser, browerType, browserCreateMethod, options, browserIdx = 0) {
1455
+ constructor(browser, browerType, browserCreateMethod, options, browserIdx = 0, pid = 0) {
1455
1456
  if (!browser || typeof browser.contexts !== "function") {
1456
1457
  throw new Error(`Invalid playwright browser parameter`);
1457
1458
  }
@@ -1459,6 +1460,7 @@ var PlaywrightBrowser = class extends EventEmitter3 {
1459
1460
  const { closeFreePagesIntervalSeconds = 300, maxPageFreeSeconds = 900, maxViewportOfNewPage = true, headless = false, executablePath = "" } = options;
1460
1461
  this.#browser = browser;
1461
1462
  this.#browserIdx = browserIdx;
1463
+ this.#pid = pid;
1462
1464
  this.#lsdBrowserContexts = [];
1463
1465
  this.#browserControllerType = "playwright";
1464
1466
  this.#browserType = browerType;
@@ -1578,6 +1580,17 @@ var PlaywrightBrowser = class extends EventEmitter3 {
1578
1580
  options() {
1579
1581
  return this.#options;
1580
1582
  }
1583
+ pid() {
1584
+ return this.#pid;
1585
+ }
1586
+ async pidUsage() {
1587
+ if (this.#pid > 0) {
1588
+ const usage = await getPerformanceOfPidTree(this.#pid, "MB");
1589
+ return usage;
1590
+ } else {
1591
+ return { cpu: 0, memory: 0 };
1592
+ }
1593
+ }
1581
1594
  async version() {
1582
1595
  const version = await this.#browser.version();
1583
1596
  return version;
@@ -2930,10 +2943,11 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2930
2943
  };
2931
2944
 
2932
2945
  // src/puppeteer/browser.ts
2933
- import { logerr as logerr7, loginfo as loginfo7, logwarn as logwarn5 } from "@letsscrapedata/utils";
2946
+ import { getPerformanceOfPidTree as getPerformanceOfPidTree2, logerr as logerr7, loginfo as loginfo7, logwarn as logwarn5 } from "@letsscrapedata/utils";
2934
2947
  var PuppeteerBrowser = class extends EventEmitter6 {
2935
2948
  #browser;
2936
2949
  #browserIdx;
2950
+ #pid;
2937
2951
  #lsdBrowserContexts;
2938
2952
  #browserControllerType;
2939
2953
  #browserType;
@@ -2961,7 +2975,7 @@ var PuppeteerBrowser = class extends EventEmitter6 {
2961
2975
  return this.#options.userAgent ? this.#options.userAgent : "";
2962
2976
  }
2963
2977
  // 构造函数:缺省只能由LsdBrowserController.launch/connect调用创建实例!!!
2964
- constructor(browser, browerType, browserCreateMethod, options, browserIdx = 0) {
2978
+ constructor(browser, browerType, browserCreateMethod, options, browserIdx = 0, pid = 0) {
2965
2979
  if (!browser || typeof browser.browserContexts !== "function") {
2966
2980
  throw new Error(`Invalid puppeteer browser parameter`);
2967
2981
  }
@@ -2969,6 +2983,7 @@ var PuppeteerBrowser = class extends EventEmitter6 {
2969
2983
  const { closeFreePagesIntervalSeconds = 300, maxPageFreeSeconds = 900, maxViewportOfNewPage = true, headless = false, executablePath = "" } = options;
2970
2984
  this.#browser = browser;
2971
2985
  this.#browserIdx = browserIdx;
2986
+ this.#pid = pid;
2972
2987
  this.#lsdBrowserContexts = [];
2973
2988
  this.#browserControllerType = "puppeteer";
2974
2989
  this.#browserType = browerType;
@@ -3081,6 +3096,17 @@ var PuppeteerBrowser = class extends EventEmitter6 {
3081
3096
  options() {
3082
3097
  return this.#options;
3083
3098
  }
3099
+ pid() {
3100
+ return this.#pid;
3101
+ }
3102
+ async pidUsage() {
3103
+ if (this.#pid > 0) {
3104
+ const usage = await getPerformanceOfPidTree2(this.#pid, "MB");
3105
+ return usage;
3106
+ } else {
3107
+ return { cpu: 0, memory: 0 };
3108
+ }
3109
+ }
3084
3110
  async version() {
3085
3111
  const version = await this.#browser.version();
3086
3112
  return version;
@@ -17264,7 +17290,7 @@ var CheerioPage = class extends EventEmitter7 {
17264
17290
  import os from "os";
17265
17291
  import puppeteer from "puppeteer";
17266
17292
  import playwright, { request as apiRequest } from "playwright";
17267
- import { logwarn as logwarn6, unreachable as unreachable5 } from "@letsscrapedata/utils";
17293
+ import { getPidsListeningOnPort, logerr as logerr8, logwarn as logwarn6, unreachable as unreachable5 } from "@letsscrapedata/utils";
17268
17294
  import puppeteerExtra from "puppeteer-extra";
17269
17295
  import * as playwrightExtra from "playwright-extra";
17270
17296
  import StealthPlugin from "puppeteer-extra-plugin-stealth";
@@ -17363,6 +17389,7 @@ var LsdBrowserController = class _LsdBrowserController {
17363
17389
  userDataDir = "",
17364
17390
  userAgent = ""
17365
17391
  } = options ? options : {};
17392
+ let browserPid = 0;
17366
17393
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : browserControllerType === "puppeteer" ? false : true;
17367
17394
  const actOptions = { closeFreePagesIntervalSeconds, maxBrowserContextsPerBrowser, maxPagesPerBrowserContext, maxPageFreeSeconds, maxViewportOfNewPage, proxy, timeout, args, executablePath, maxWindowSize, headless, minBrowserContexts, incognito, proxyPerBrowserContext, userDataDir, userAgent };
17368
17395
  let idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--incoginto"));
@@ -17414,8 +17441,19 @@ var LsdBrowserController = class _LsdBrowserController {
17414
17441
  if (!actOptions.executablePath) {
17415
17442
  actOptions.executablePath = playwrightBrowserType.executablePath();
17416
17443
  }
17417
- const browser = await playwrightBrowserType.launch(launchOptions);
17418
- lsdBrowser = new PlaywrightBrowser(browser, browserType, "launch", actOptions, this.#nextBrowserIdx++);
17444
+ if (options.launchMethod === "launchServer") {
17445
+ const browserServer = await playwrightBrowserType.launchServer(launchOptions);
17446
+ const process = browserServer.process();
17447
+ if (process?.pid) {
17448
+ browserPid = process.pid;
17449
+ }
17450
+ const wsEndpoint = browserServer.wsEndpoint();
17451
+ const browser = await playwrightBrowserType.connect(wsEndpoint);
17452
+ lsdBrowser = new PlaywrightBrowser(browser, browserType, "launch", actOptions, this.#nextBrowserIdx++, browserPid);
17453
+ } else {
17454
+ const browser = await playwrightBrowserType.launch(launchOptions);
17455
+ lsdBrowser = new PlaywrightBrowser(browser, browserType, "launch", actOptions, this.#nextBrowserIdx++, browserPid);
17456
+ }
17419
17457
  } else if (browserControllerType === "puppeteer") {
17420
17458
  const product = this.#puppeteerProduct(browserType);
17421
17459
  const launchOptions = { headless, timeout, product };
@@ -17448,7 +17486,11 @@ var LsdBrowserController = class _LsdBrowserController {
17448
17486
  actOptions.executablePath = this.#puppeteer.executablePath();
17449
17487
  }
17450
17488
  const browser = await this.#puppeteer.launch(launchOptions);
17451
- lsdBrowser = new PuppeteerBrowser(browser, browserType, "launch", actOptions, this.#nextBrowserIdx++);
17489
+ const browserProcess = browser.process();
17490
+ if (browserProcess?.pid) {
17491
+ browserPid = browserProcess.pid;
17492
+ }
17493
+ lsdBrowser = new PuppeteerBrowser(browser, browserType, "launch", actOptions, this.#nextBrowserIdx++, browserPid);
17452
17494
  } else {
17453
17495
  throw new Error(`Invalid browserControllerType: ${browserControllerType} in launch`);
17454
17496
  }
@@ -17475,16 +17517,25 @@ var LsdBrowserController = class _LsdBrowserController {
17475
17517
  if (typeof browserUrl !== "string" || !browserUrl.toLowerCase().startsWith("http://")) {
17476
17518
  throw new Error(`Invalid browserUrl ${browserUrl} in connect`);
17477
17519
  }
17520
+ const u = new URL(browserUrl);
17521
+ const port = u.port ? parseInt(u.port) : 80;
17522
+ const pids = await getPidsListeningOnPort(port);
17523
+ let browserPid = 0;
17524
+ if (pids.length !== 1) {
17525
+ logerr8(`##browser pids.length ${pids.length} is not 1 when trying to connect to browserUrl ${browserUrl}`);
17526
+ } else {
17527
+ browserPid = pids[0];
17528
+ }
17478
17529
  const actOptions = { closeFreePagesIntervalSeconds, maxBrowserContextsPerBrowser, maxPagesPerBrowserContext, maxPageFreeSeconds, maxViewportOfNewPage, proxy, timeout, browserUrl, executablePath, headless, incognito, userAgent };
17479
17530
  if (browserControllerType === "playwright") {
17480
17531
  const playwrightBrowserType = this.#playwrightBrowserType(browserType, true);
17481
17532
  const browser = await playwrightBrowserType.connectOverCDP(browserUrl);
17482
- const lsdBrowser = new PlaywrightBrowser(browser, browserType, "connect", actOptions, this.#nextBrowserIdx++);
17533
+ const lsdBrowser = new PlaywrightBrowser(browser, browserType, "connect", actOptions, this.#nextBrowserIdx++, browserPid);
17483
17534
  return lsdBrowser;
17484
17535
  } else if (browserControllerType === "puppeteer") {
17485
17536
  this.#puppeteerProduct(browserType);
17486
17537
  const browser = await this.#puppeteer.connect({ browserURL: browserUrl });
17487
- const lsdBrowser = new PuppeteerBrowser(browser, browserType, "connect", options, this.#nextBrowserIdx++);
17538
+ const lsdBrowser = new PuppeteerBrowser(browser, browserType, "connect", options, this.#nextBrowserIdx++, browserPid);
17488
17539
  ;
17489
17540
  return lsdBrowser;
17490
17541
  } else {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@letsscrapedata/controller",
3
- "version": "0.0.34",
3
+ "version": "0.0.36",
4
4
  "description": "Unified browser / HTML controller interfaces that support playwright, puppeteer and cheerio",
5
5
  "type": "module",
6
6
  "main": "./dist/index.mjs",
@@ -34,7 +34,7 @@
34
34
  },
35
35
  "license": "Apache-2.0",
36
36
  "dependencies": {
37
- "@letsscrapedata/utils": "^0.0.7",
37
+ "@letsscrapedata/utils": "^0.0.12",
38
38
  "playwright": "^1.43.0",
39
39
  "playwright-extra": "^4.3.6",
40
40
  "puppeteer": "^22.6.3",