@letsscrapedata/controller 0.0.49 → 0.0.51

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.d.cts CHANGED
@@ -1,6 +1,7 @@
1
1
  import EventEmitter from 'node:events';
2
2
  import { Browser as Browser$1, BrowserContext as BrowserContext$1, Frame as Frame$1, Page as Page$1, ElementHandle, HTTPResponse, PuppeteerNode } from 'puppeteer';
3
3
  import { Browser, BrowserContext, Frame, Page, Locator, Response, APIRequestContext, BrowserType, FrameLocator } from 'playwright';
4
+ import { LogFunction } from '@letsscrapedata/utils';
4
5
 
5
6
  type AllBrowser = Browser | Browser$1;
6
7
  type AllBrowserContext = BrowserContext | BrowserContext$1;
@@ -982,6 +983,11 @@ interface LsdBrowserContext extends EventEmitter {
982
983
  */
983
984
  apiContext(): LsdApiContext;
984
985
  browser(): LsdBrowser;
986
+ /**
987
+ * close this BrowserContext
988
+ * * For BrowserContext that cannot be closed directly, it is only marked as closed; it will be closed when browser is closed.
989
+ * * refer to " Error: Non-incognito profiles cannot be closed" in puppeteer
990
+ */
985
991
  close(): Promise<boolean>;
986
992
  /**
987
993
  * close pages that are free more than maxPageFreeSeconds if maxPageFreeSeconds > 0
@@ -1103,6 +1109,8 @@ interface LsdBrowserController$1 {
1103
1109
  newApiContext(options?: LsdApiContextOptions): Promise<LsdApiContext>;
1104
1110
  }
1105
1111
 
1112
+ declare function setControllerLogFun(logFun: LogFunction): boolean;
1113
+
1106
1114
  declare class PlaywrightBrowser extends EventEmitter implements LsdBrowser {
1107
1115
  #private;
1108
1116
  constructor(browser: Browser, browerType: LsdBrowserType, browserCreateMethod: BrowserCreationMethod, options: LsdLaunchOptions | LsdConnectOptions, browserIdx?: number, pid?: number);
@@ -1452,4 +1460,4 @@ declare class LsdBrowserController implements LsdBrowserController$1 {
1452
1460
  }
1453
1461
  declare const controller: LsdBrowserController;
1454
1462
 
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 };
1463
+ 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, setControllerLogFun };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import EventEmitter from 'node:events';
2
2
  import { Browser as Browser$1, BrowserContext as BrowserContext$1, Frame as Frame$1, Page as Page$1, ElementHandle, HTTPResponse, PuppeteerNode } from 'puppeteer';
3
3
  import { Browser, BrowserContext, Frame, Page, Locator, Response, APIRequestContext, BrowserType, FrameLocator } from 'playwright';
4
+ import { LogFunction } from '@letsscrapedata/utils';
4
5
 
5
6
  type AllBrowser = Browser | Browser$1;
6
7
  type AllBrowserContext = BrowserContext | BrowserContext$1;
@@ -982,6 +983,11 @@ interface LsdBrowserContext extends EventEmitter {
982
983
  */
983
984
  apiContext(): LsdApiContext;
984
985
  browser(): LsdBrowser;
986
+ /**
987
+ * close this BrowserContext
988
+ * * For BrowserContext that cannot be closed directly, it is only marked as closed; it will be closed when browser is closed.
989
+ * * refer to " Error: Non-incognito profiles cannot be closed" in puppeteer
990
+ */
985
991
  close(): Promise<boolean>;
986
992
  /**
987
993
  * close pages that are free more than maxPageFreeSeconds if maxPageFreeSeconds > 0
@@ -1103,6 +1109,8 @@ interface LsdBrowserController$1 {
1103
1109
  newApiContext(options?: LsdApiContextOptions): Promise<LsdApiContext>;
1104
1110
  }
1105
1111
 
1112
+ declare function setControllerLogFun(logFun: LogFunction): boolean;
1113
+
1106
1114
  declare class PlaywrightBrowser extends EventEmitter implements LsdBrowser {
1107
1115
  #private;
1108
1116
  constructor(browser: Browser, browerType: LsdBrowserType, browserCreateMethod: BrowserCreationMethod, options: LsdLaunchOptions | LsdConnectOptions, browserIdx?: number, pid?: number);
@@ -1452,4 +1460,4 @@ declare class LsdBrowserController implements LsdBrowserController$1 {
1452
1460
  }
1453
1461
  declare const controller: LsdBrowserController;
1454
1462
 
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 };
1463
+ 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, setControllerLogFun };
package/dist/index.js CHANGED
@@ -1,16 +1,38 @@
1
+ // src/utils/log.ts
2
+ import { log, LogLevel } from "@letsscrapedata/utils";
3
+ var pkgLog = log;
4
+ function setControllerLogFun(logFun) {
5
+ if (typeof logFun === "function") {
6
+ pkgLog = logFun;
7
+ return true;
8
+ } else {
9
+ return false;
10
+ }
11
+ }
12
+ async function loginfo(...args) {
13
+ await pkgLog(LogLevel.INF, ...args);
14
+ }
15
+ async function logwarn(...args) {
16
+ await pkgLog(LogLevel.WRN, ...args);
17
+ }
18
+ async function logerr(...args) {
19
+ await pkgLog(LogLevel.ERR, ...args);
20
+ }
21
+
1
22
  // src/playwright/browser.ts
2
23
  import EventEmitter3 from "events";
24
+ import { getCurrentUnixTime as getCurrentUnixTime3, getPerformanceOfPidTree } from "@letsscrapedata/utils";
3
25
 
4
26
  // src/playwright/context.ts
5
27
  import EventEmitter2 from "events";
6
- import { getCurrentUnixTime as getCurrentUnixTime2, logerr as logerr2, loginfo as loginfo3, logwarn as logwarn2, sleep } from "@letsscrapedata/utils";
28
+ import { getCurrentUnixTime as getCurrentUnixTime2, sleep } from "@letsscrapedata/utils";
7
29
 
8
30
  // src/playwright/page.ts
9
31
  import EventEmitter from "events";
10
- import { getCurrentUnixTime, logerr, loginfo as loginfo2, logwarn, unreachable as unreachable2 } from "@letsscrapedata/utils";
32
+ import { getCurrentUnixTime, unreachable as unreachable2 } from "@letsscrapedata/utils";
11
33
 
12
34
  // src/playwright/element.ts
13
- import { loginfo, unreachable } from "@letsscrapedata/utils";
35
+ import { unreachable } from "@letsscrapedata/utils";
14
36
  var PlaywrightElement = class _PlaywrightElement {
15
37
  #frame;
16
38
  #locator;
@@ -468,7 +490,7 @@ var PlaywrightPage = class extends EventEmitter {
468
490
  retObj.locators = locators;
469
491
  return retObj;
470
492
  } catch (err) {
471
- loginfo2(err);
493
+ loginfo(err);
472
494
  return retObj;
473
495
  }
474
496
  }
@@ -479,7 +501,7 @@ var PlaywrightPage = class extends EventEmitter {
479
501
  const page = this.#page;
480
502
  const pageId = this.#pageId;
481
503
  page.on("close", async () => {
482
- loginfo2(`##browser ${pageId} closed`);
504
+ loginfo(`##browser ${pageId} closed`);
483
505
  if (!page.pageInfo) {
484
506
  logerr(`Logic error in page.on("close")`);
485
507
  }
@@ -502,7 +524,7 @@ var PlaywrightPage = class extends EventEmitter {
502
524
  } else {
503
525
  logerr(`##browser ${pageId} has popup without page.pageInfo`);
504
526
  }
505
- loginfo2(`##browser ${pageId} has popup ${popupPageId}`);
527
+ loginfo(`##browser ${pageId} has popup ${popupPageId}`);
506
528
  this.emit("pagePopup", evtData);
507
529
  } else {
508
530
  logerr(`##browser ${pageId} has popup page with null page`);
@@ -973,7 +995,7 @@ var PlaywrightPage = class extends EventEmitter {
973
995
  requestData,
974
996
  responseData
975
997
  });
976
- loginfo2(`##browser cache matched response: ${requestUrl}`);
998
+ loginfo(`##browser cache matched response: ${requestUrl}`);
977
999
  }
978
1000
  if (typeof handler === "function") {
979
1001
  const pageData = { pageUrl, cookies: "" };
@@ -1195,7 +1217,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1195
1217
  await lsdPage.maximizeViewport();
1196
1218
  }
1197
1219
  this.#lsdPages.push(lsdPage);
1198
- loginfo3(`##browser ${lsdPage.id()} ${openType}ed`);
1220
+ loginfo(`##browser ${lsdPage.id()} ${openType}ed`);
1199
1221
  }
1200
1222
  }
1201
1223
  constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, maxViewportOfNewPage = true) {
@@ -1230,7 +1252,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1230
1252
  const pageInfo = page.pageInfo;
1231
1253
  if (pageInfo) {
1232
1254
  const { browserIdx: browserIdx2, browserContextIdx: browserContextIdx2, pageIdx } = pageInfo;
1233
- logwarn2(`##browser page-${browserIdx2}-${browserContextIdx2}-${pageIdx} has been already created`);
1255
+ logwarn(`##browser page-${browserIdx2}-${browserContextIdx2}-${pageIdx} has been already created`);
1234
1256
  } else {
1235
1257
  const currentTime2 = getCurrentUnixTime2();
1236
1258
  const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
@@ -1239,23 +1261,23 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1239
1261
  await lsdPage.maximizeViewport();
1240
1262
  }
1241
1263
  this.#lsdPages.push(lsdPage);
1242
- loginfo3(`##page ${lsdPage.id()} created`);
1264
+ loginfo(`##page ${lsdPage.id()} created`);
1243
1265
  }
1244
1266
  });
1245
1267
  browserContext.on("close", (bc) => {
1246
1268
  if (browserContext !== bc) {
1247
- logerr2(`##browser different browserContext in browserContext.on("close")`);
1269
+ logerr(`##browser different browserContext in browserContext.on("close")`);
1248
1270
  }
1249
1271
  this.#lsdBrowser.emit("browserContextClose", this);
1250
1272
  });
1251
1273
  this.on("pageClose", (lsdPage) => {
1252
1274
  if (!(lsdPage instanceof PlaywrightPage)) {
1253
- logerr2(`Invalid data in LsdBrowserContext.on("pageClose)`);
1275
+ logerr(`Invalid data in LsdBrowserContext.on("pageClose)`);
1254
1276
  return;
1255
1277
  }
1256
1278
  const idx = this.#lsdPages.findIndex((p) => p === lsdPage);
1257
1279
  if (idx < 0) {
1258
- logerr2(`Invalid lsdPage in LsdBrowserContext.on("pageClose)`);
1280
+ logerr(`Invalid lsdPage in LsdBrowserContext.on("pageClose)`);
1259
1281
  return;
1260
1282
  }
1261
1283
  this.#lsdPages.splice(idx, 1);
@@ -1272,7 +1294,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1272
1294
  if (this.#browserContext) {
1273
1295
  this.#status = "closed";
1274
1296
  this.#lastStatusUpdateTime = getCurrentUnixTime2();
1275
- loginfo3(`browserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
1297
+ loginfo(`browserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
1276
1298
  await this.#browserContext.close();
1277
1299
  }
1278
1300
  return true;
@@ -1287,12 +1309,12 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1287
1309
  await sleep(200);
1288
1310
  }
1289
1311
  }
1290
- logwarn2(`Cannot get the gettingLock.`);
1312
+ logwarn(`Cannot get the gettingLock.`);
1291
1313
  return false;
1292
1314
  }
1293
1315
  #freeGettingLock() {
1294
1316
  if (!this.#gettingPage) {
1295
- logwarn2(`Getting lock is already free now.`);
1317
+ logwarn(`Getting lock is already free now.`);
1296
1318
  }
1297
1319
  this.#gettingPage = false;
1298
1320
  }
@@ -1301,7 +1323,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1301
1323
  maxPageFreeSeconds = this.#maxPageFreeSeconds;
1302
1324
  }
1303
1325
  if (maxPageFreeSeconds <= 0) {
1304
- logwarn2(`Please set valid maxPageFreeSeconds to close free pages`);
1326
+ logwarn(`Please set valid maxPageFreeSeconds to close free pages`);
1305
1327
  return false;
1306
1328
  }
1307
1329
  const gotLock = await this.#tryToGetGettingLock();
@@ -1320,7 +1342,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1320
1342
  this.#freeGettingLock();
1321
1343
  return true;
1322
1344
  } catch (err) {
1323
- logerr2(err);
1345
+ logerr(err);
1324
1346
  this.#freeGettingLock();
1325
1347
  return false;
1326
1348
  }
@@ -1372,7 +1394,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1372
1394
  return null;
1373
1395
  }
1374
1396
  } catch (err) {
1375
- logerr2(err);
1397
+ logerr(err);
1376
1398
  this.#freeGettingLock();
1377
1399
  return null;
1378
1400
  }
@@ -1454,7 +1476,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1454
1476
  await page.free();
1455
1477
  return true;
1456
1478
  } catch (err) {
1457
- logerr2(err);
1479
+ logerr(err);
1458
1480
  return false;
1459
1481
  }
1460
1482
  }
@@ -1476,7 +1498,6 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1476
1498
  };
1477
1499
 
1478
1500
  // src/playwright/browser.ts
1479
- import { getCurrentUnixTime as getCurrentUnixTime3, getPerformanceOfPidTree, logerr as logerr3, loginfo as loginfo4, logwarn as logwarn3 } from "@letsscrapedata/utils";
1480
1501
  var PlaywrightBrowser = class extends EventEmitter3 {
1481
1502
  #browser;
1482
1503
  #browserIdx;
@@ -1526,38 +1547,38 @@ var PlaywrightBrowser = class extends EventEmitter3 {
1526
1547
  this.#executablePath = executablePath;
1527
1548
  this.#nextBrowserContextIdx = 1;
1528
1549
  this.#closeFreePagesIntervalId = null;
1529
- loginfo4(`##browser ${this.id()} ${this.#browserCreationMethod}ed by ${this.#browserControllerType}`);
1550
+ loginfo(`##browser ${this.id()} ${this.#browserCreationMethod}ed by ${this.#browserControllerType}`);
1530
1551
  const browserContexts = browser.contexts();
1531
1552
  if (browserContexts.length > 0) {
1532
- logwarn3(`There are ${browserContexts.length} new browserContexts when playwright launches new browser`);
1553
+ logwarn(`There are ${browserContexts.length} new browserContexts when playwright launches new browser`);
1533
1554
  }
1534
1555
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
1535
1556
  for (const browserContext of browserContexts) {
1536
1557
  const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
1537
1558
  this.#lsdBrowserContexts.push(lsdBrowserContext);
1538
- loginfo4(`##browserContext ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
1559
+ loginfo(`##browserContext ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
1539
1560
  }
1540
1561
  browser.on("disconnected", () => {
1541
- loginfo4(`##browser ${this.id()} disconnected`);
1562
+ loginfo(`##browser ${this.id()} disconnected`);
1542
1563
  if (this.#lsdBrowserContexts.length > 0) {
1543
- logerr3(`${this.id()} has browserContexts when disconnected`);
1564
+ logerr(`${this.id()} has browserContexts when disconnected`);
1544
1565
  }
1545
1566
  });
1546
1567
  this.on("browserContextClose", (lsdBrowserContext) => {
1547
1568
  if (!(lsdBrowserContext instanceof PlaywrightBrowserContext)) {
1548
- logerr3(`Invalid data in LsdBrowser.on("browserContextClose)`);
1569
+ logerr(`Invalid data in LsdBrowser.on("browserContextClose)`);
1549
1570
  return;
1550
1571
  }
1551
1572
  const idx = this.#lsdBrowserContexts.findIndex((bc) => bc === lsdBrowserContext);
1552
1573
  if (idx < 0) {
1553
- logerr3(`Invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
1574
+ logerr(`Invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
1554
1575
  return;
1555
1576
  }
1556
- loginfo4(`##browserContext ${lsdBrowserContext.id()} closed
1577
+ loginfo(`##browserContext ${lsdBrowserContext.id()} closed
1557
1578
  `);
1558
1579
  this.#lsdBrowserContexts.splice(idx, 1);
1559
1580
  if (this.#lsdBrowserContexts.length === 0) {
1560
- loginfo4(`##browser ${this.id()} has no browserContexts now`);
1581
+ loginfo(`##browser ${this.id()} has no browserContexts now`);
1561
1582
  }
1562
1583
  return;
1563
1584
  });
@@ -1574,7 +1595,7 @@ var PlaywrightBrowser = class extends EventEmitter3 {
1574
1595
  }
1575
1596
  async newBrowserContext(options) {
1576
1597
  if (this.#lsdBrowserContexts.length >= this.#maxBrowserContextsPerBrowser()) {
1577
- logwarn3(`##browser ${this.id()} can not create more new browserContext`);
1598
+ logwarn(`##browser ${this.id()} can not create more new browserContext`);
1578
1599
  return null;
1579
1600
  }
1580
1601
  const browserContextOptions = {};
@@ -1593,7 +1614,7 @@ var PlaywrightBrowser = class extends EventEmitter3 {
1593
1614
  const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
1594
1615
  const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
1595
1616
  this.#lsdBrowserContexts.push(lsdBrowserContext);
1596
- loginfo4(`##browser ${lsdBrowserContext.id()} created`);
1617
+ loginfo(`##browser ${lsdBrowserContext.id()} created`);
1597
1618
  return lsdBrowserContext;
1598
1619
  }
1599
1620
  async close() {
@@ -1665,15 +1686,18 @@ var PlaywrightBrowser = class extends EventEmitter3 {
1665
1686
 
1666
1687
  // src/puppeteer/browser.ts
1667
1688
  import EventEmitter6 from "events";
1689
+ import { getCurrentUnixTime as getCurrentUnixTime6, getPerformanceOfPidTree as getPerformanceOfPidTree2 } from "@letsscrapedata/utils";
1668
1690
 
1669
1691
  // src/puppeteer/context.ts
1670
1692
  import EventEmitter5 from "events";
1693
+ import { getCurrentUnixTime as getCurrentUnixTime5, sleep as sleep2 } from "@letsscrapedata/utils";
1671
1694
 
1672
1695
  // src/puppeteer/page.ts
1673
1696
  import EventEmitter4 from "events";
1697
+ import { getCurrentUnixTime as getCurrentUnixTime4, unreachable as unreachable4 } from "@letsscrapedata/utils";
1674
1698
 
1675
1699
  // src/puppeteer/element.ts
1676
- import { logerr as logerr4, unreachable as unreachable3 } from "@letsscrapedata/utils";
1700
+ import { unreachable as unreachable3 } from "@letsscrapedata/utils";
1677
1701
  var PuppeteerElement = class _PuppeteerElement {
1678
1702
  #frame;
1679
1703
  #$ele;
@@ -1762,7 +1786,7 @@ var PuppeteerElement = class _PuppeteerElement {
1762
1786
  }
1763
1787
  return retObj;
1764
1788
  } catch (err) {
1765
- logerr4(err);
1789
+ logerr(err);
1766
1790
  return retObj;
1767
1791
  }
1768
1792
  }
@@ -1944,7 +1968,6 @@ var PuppeteerElement = class _PuppeteerElement {
1944
1968
  };
1945
1969
 
1946
1970
  // src/puppeteer/page.ts
1947
- import { getCurrentUnixTime as getCurrentUnixTime4, logerr as logerr5, loginfo as loginfo5, unreachable as unreachable4 } from "@letsscrapedata/utils";
1948
1971
  var PuppeteerPage = class extends EventEmitter4 {
1949
1972
  #lsdBrowserContext;
1950
1973
  #page;
@@ -2104,9 +2127,9 @@ var PuppeteerPage = class extends EventEmitter4 {
2104
2127
  const page = this.#page;
2105
2128
  const pageId = this.#pageId;
2106
2129
  page.on("close", async () => {
2107
- loginfo5(`##browser ${pageId} closed`);
2130
+ loginfo(`##browser ${pageId} closed`);
2108
2131
  if (!page.pageInfo) {
2109
- logerr5(`Logic error in page.on("close")`);
2132
+ logerr(`Logic error in page.on("close")`);
2110
2133
  }
2111
2134
  this.emit("pageClose");
2112
2135
  this.#lsdBrowserContext.emit("pageClose", this);
@@ -2125,12 +2148,12 @@ var PuppeteerPage = class extends EventEmitter4 {
2125
2148
  pageInfo.relatedId = page.pageInfo.taskId;
2126
2149
  }
2127
2150
  } else {
2128
- logerr5(`##browser ${pageId} has popup without page.pageInfo`);
2151
+ logerr(`##browser ${pageId} has popup without page.pageInfo`);
2129
2152
  }
2130
- loginfo5(`##browser ${pageId} has popup ${popupPageId}`);
2153
+ loginfo(`##browser ${pageId} has popup ${popupPageId}`);
2131
2154
  this.emit("pagePopup", evtData);
2132
2155
  } else {
2133
- logerr5(`##browser ${pageId} has popup page with null page`);
2156
+ logerr(`##browser ${pageId} has popup page with null page`);
2134
2157
  }
2135
2158
  });
2136
2159
  }
@@ -2740,7 +2763,6 @@ var PuppeteerPage = class extends EventEmitter4 {
2740
2763
  };
2741
2764
 
2742
2765
  // src/puppeteer/context.ts
2743
- import { getCurrentUnixTime as getCurrentUnixTime5, logerr as logerr6, loginfo as loginfo6, logwarn as logwarn4, sleep as sleep2 } from "@letsscrapedata/utils";
2744
2766
  var PuppeteerBrowserContext = class extends EventEmitter5 {
2745
2767
  #lsdBrowser;
2746
2768
  #browserIdx;
@@ -2780,7 +2802,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2780
2802
  await lsdPage.setUserAgent(this.#userAgent);
2781
2803
  }
2782
2804
  this.#lsdPages.push(lsdPage);
2783
- loginfo6(`##browser ${lsdPage.id()} ${openType}ed`);
2805
+ loginfo(`##browser ${lsdPage.id()} ${openType}ed`);
2784
2806
  }
2785
2807
  }
2786
2808
  constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxViewportOfNewPage = true) {
@@ -2819,7 +2841,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2819
2841
  const pageInfo = page.pageInfo;
2820
2842
  if (pageInfo) {
2821
2843
  const { browserIdx: browserIdx2, browserContextIdx: browserContextIdx2, pageIdx } = pageInfo;
2822
- logwarn4(`##browser page-${browserIdx2}-${browserContextIdx2}-${pageIdx} has been already created`);
2844
+ logwarn(`##browser page-${browserIdx2}-${browserContextIdx2}-${pageIdx} has been already created`);
2823
2845
  } else {
2824
2846
  const currentTime2 = getCurrentUnixTime5();
2825
2847
  const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
@@ -2831,18 +2853,18 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2831
2853
  await lsdPage.setUserAgent(this.#userAgent);
2832
2854
  }
2833
2855
  this.#lsdPages.push(lsdPage);
2834
- loginfo6(`##page ${lsdPage.id()} created`);
2856
+ loginfo(`##page ${lsdPage.id()} created`);
2835
2857
  }
2836
2858
  }
2837
2859
  });
2838
2860
  this.on("pageClose", (lsdPage) => {
2839
2861
  if (!(lsdPage instanceof PuppeteerPage)) {
2840
- logerr6(`Invalid data in LsdBrowserContext.on("pageClose)`);
2862
+ logerr(`Invalid data in LsdBrowserContext.on("pageClose)`);
2841
2863
  return;
2842
2864
  }
2843
2865
  const idx = this.#lsdPages.findIndex((p) => p === lsdPage);
2844
2866
  if (idx < 0) {
2845
- logerr6(`Invalid lsdPage in LsdBrowserContext.on("pageClose)`);
2867
+ logerr(`Invalid lsdPage in LsdBrowserContext.on("pageClose)`);
2846
2868
  return;
2847
2869
  }
2848
2870
  this.#lsdPages.splice(idx, 1);
@@ -2862,7 +2884,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2862
2884
  if (this.#browserContext) {
2863
2885
  this.#status = "closed";
2864
2886
  this.#lastStatusUpdateTime = getCurrentUnixTime5();
2865
- loginfo6(`browserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
2887
+ loginfo(`browserContext ${this.id()} closed at ${this.#lastStatusUpdateTime}`);
2866
2888
  if (this.#browserContextCreationMethod !== "launch") {
2867
2889
  await this.#browserContext.close();
2868
2890
  }
@@ -2879,12 +2901,12 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2879
2901
  await sleep2(200);
2880
2902
  }
2881
2903
  }
2882
- logwarn4(`Cannot get the gettingLock.`);
2904
+ logwarn(`Cannot get the gettingLock.`);
2883
2905
  return false;
2884
2906
  }
2885
2907
  #freeGettingLock() {
2886
2908
  if (!this.#gettingPage) {
2887
- logwarn4(`Getting lock is already free now.`);
2909
+ logwarn(`Getting lock is already free now.`);
2888
2910
  }
2889
2911
  this.#gettingPage = false;
2890
2912
  }
@@ -2893,7 +2915,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2893
2915
  maxPageFreeSeconds = this.#maxPageFreeSeconds;
2894
2916
  }
2895
2917
  if (maxPageFreeSeconds <= 0) {
2896
- logwarn4(`Please set valid maxPageFreeSeconds to close free pages`);
2918
+ logwarn(`Please set valid maxPageFreeSeconds to close free pages`);
2897
2919
  return false;
2898
2920
  }
2899
2921
  const gotLock = await this.#tryToGetGettingLock();
@@ -2912,7 +2934,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2912
2934
  this.#freeGettingLock();
2913
2935
  return true;
2914
2936
  } catch (err) {
2915
- logerr6(err);
2937
+ logerr(err);
2916
2938
  this.#freeGettingLock();
2917
2939
  return false;
2918
2940
  }
@@ -2966,7 +2988,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
2966
2988
  return null;
2967
2989
  }
2968
2990
  } catch (err) {
2969
- logerr6(err);
2991
+ logerr(err);
2970
2992
  this.#freeGettingLock();
2971
2993
  return null;
2972
2994
  }
@@ -3048,7 +3070,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3048
3070
  await page.free();
3049
3071
  return true;
3050
3072
  } catch (err) {
3051
- logerr6(err);
3073
+ logerr(err);
3052
3074
  return false;
3053
3075
  }
3054
3076
  }
@@ -3070,7 +3092,6 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3070
3092
  };
3071
3093
 
3072
3094
  // src/puppeteer/browser.ts
3073
- import { getCurrentUnixTime as getCurrentUnixTime6, getPerformanceOfPidTree as getPerformanceOfPidTree2, logerr as logerr7, loginfo as loginfo7, logwarn as logwarn5 } from "@letsscrapedata/utils";
3074
3095
  var PuppeteerBrowser = class extends EventEmitter6 {
3075
3096
  #browser;
3076
3097
  #browserIdx;
@@ -3123,35 +3144,35 @@ var PuppeteerBrowser = class extends EventEmitter6 {
3123
3144
  this.#executablePath = executablePath;
3124
3145
  this.#nextBrowserContextIdx = 1;
3125
3146
  this.#closeFreePagesIntervalId = null;
3126
- loginfo7(`##browser ${this.#browserType} ${this.id()} ${this.#browserCreationMethod}ed by ${this.#browserControllerType}`);
3147
+ loginfo(`##browser ${this.#browserType} ${this.id()} ${this.#browserCreationMethod}ed by ${this.#browserControllerType}`);
3127
3148
  const browserContexts = browser.browserContexts();
3128
3149
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : false;
3129
3150
  for (const browserContext of browserContexts) {
3130
3151
  const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), this.#userAgent(), maxViewportOfNewPage);
3131
3152
  this.#lsdBrowserContexts.push(lsdBrowserContext);
3132
- loginfo7(`##browser ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
3153
+ loginfo(`##browser ${lsdBrowserContext.id()} ${this.#browserCreationMethod}ed`);
3133
3154
  }
3134
3155
  browser.on("disconnected", () => {
3135
- loginfo7(`##browser ${this.id()} disconnected`);
3156
+ loginfo(`##browser ${this.id()} disconnected`);
3136
3157
  if (this.#lsdBrowserContexts.length > 0) {
3137
- logerr7(`${this.id()} has browserContexts when disconnected`);
3158
+ logerr(`${this.id()} has browserContexts when disconnected`);
3138
3159
  }
3139
3160
  });
3140
3161
  this.on("browserContextClose", (lsdBrowserContext) => {
3141
3162
  if (!(lsdBrowserContext instanceof PuppeteerBrowserContext)) {
3142
- logerr7(`Invalid data in LsdBrowser.on("browserContextClose)`);
3163
+ logerr(`Invalid data in LsdBrowser.on("browserContextClose)`);
3143
3164
  return;
3144
3165
  }
3145
3166
  const idx = this.#lsdBrowserContexts.findIndex((bc) => bc === lsdBrowserContext);
3146
3167
  if (idx < 0) {
3147
- logerr7(`Invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
3168
+ logerr(`Invalid lsdBrowserContext in LsdBrowser.on("browserContextClose)`);
3148
3169
  return;
3149
3170
  }
3150
- loginfo7(`##browser ${lsdBrowserContext.id()} closed
3171
+ loginfo(`##browser ${lsdBrowserContext.id()} closed
3151
3172
  `);
3152
3173
  this.#lsdBrowserContexts.splice(idx, 1);
3153
3174
  if (this.#lsdBrowserContexts.length === 0) {
3154
- loginfo7(`##browser ${this.id()} has no browserContexts now`);
3175
+ loginfo(`##browser ${this.id()} has no browserContexts now`);
3155
3176
  }
3156
3177
  return;
3157
3178
  });
@@ -3168,7 +3189,7 @@ var PuppeteerBrowser = class extends EventEmitter6 {
3168
3189
  }
3169
3190
  async newBrowserContext(options) {
3170
3191
  if (this.#lsdBrowserContexts.length >= this.#maxBrowserContextsPerBrowser()) {
3171
- logwarn5(`##browser ${this.id()} can not create more new browserContext`);
3192
+ logwarn(`##browser ${this.id()} can not create more new browserContext`);
3172
3193
  return null;
3173
3194
  }
3174
3195
  const browserContextOptions = {};
@@ -3181,7 +3202,7 @@ var PuppeteerBrowser = class extends EventEmitter6 {
3181
3202
  const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
3182
3203
  const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxViewportOfNewPage);
3183
3204
  this.#lsdBrowserContexts.push(lsdBrowserContext);
3184
- loginfo7(`##browser ${lsdBrowserContext.id()} created`);
3205
+ loginfo(`##browser ${lsdBrowserContext.id()} created`);
3185
3206
  return lsdBrowserContext;
3186
3207
  }
3187
3208
  async close() {
@@ -3580,10 +3601,10 @@ var CheerioPage = class extends EventEmitter7 {
3580
3601
  import os from "os";
3581
3602
  import puppeteer from "puppeteer";
3582
3603
  import playwright, { request as apiRequest } from "playwright";
3583
- import { getPidsListeningOnPort, logerr as logerr8, logwarn as logwarn6, unreachable as unreachable5 } from "@letsscrapedata/utils";
3584
3604
  import puppeteerExtra from "puppeteer-extra";
3585
3605
  import * as playwrightExtra from "playwright-extra";
3586
3606
  import StealthPlugin from "puppeteer-extra-plugin-stealth";
3607
+ import { getPidsListeningOnPort, unreachable as unreachable5 } from "@letsscrapedata/utils";
3587
3608
  var LsdBrowserController = class _LsdBrowserController {
3588
3609
  static #forbidConstructor = false;
3589
3610
  #puppeteer;
@@ -3684,22 +3705,22 @@ var LsdBrowserController = class _LsdBrowserController {
3684
3705
  const actOptions = { closeFreePagesIntervalSeconds, maxBrowserContextsPerBrowser, maxPagesPerBrowserContext, maxPageFreeSeconds, maxViewportOfNewPage, proxy, timeout, args, executablePath, maxWindowSize, headless, minBrowserContexts, incognito, proxyPerBrowserContext, userDataDir, userAgent };
3685
3706
  let idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--incoginto"));
3686
3707
  if (idx >= 0) {
3687
- logwarn6(`Please use options.incognito instead when launching new browser.`);
3708
+ logwarn(`Please use options.incognito instead when launching new browser.`);
3688
3709
  args.splice(idx, 1);
3689
3710
  }
3690
3711
  idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--proxy-server"));
3691
3712
  if (idx >= 0) {
3692
- logwarn6(`Please use options.proxy instead when launching new browser.`);
3713
+ logwarn(`Please use options.proxy instead when launching new browser.`);
3693
3714
  args.splice(idx, 1);
3694
3715
  }
3695
3716
  idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--user-data-dir"));
3696
3717
  if (idx >= 0) {
3697
- logwarn6(`Please use options.userDataDir instead when launching new browser.`);
3718
+ logwarn(`Please use options.userDataDir instead when launching new browser.`);
3698
3719
  args.splice(idx, 1);
3699
3720
  }
3700
3721
  idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--start-maximized"));
3701
3722
  if (idx >= 0) {
3702
- logwarn6(`Please use options.maxWindowSize instead when launching new browser.`);
3723
+ logwarn(`Please use options.maxWindowSize instead when launching new browser.`);
3703
3724
  args.splice(idx, 1);
3704
3725
  }
3705
3726
  let lsdBrowser;
@@ -3812,7 +3833,7 @@ var LsdBrowserController = class _LsdBrowserController {
3812
3833
  const pids = await getPidsListeningOnPort(port);
3813
3834
  let browserPid = 0;
3814
3835
  if (pids.length !== 1) {
3815
- logerr8(`##browser pids.length ${pids.length} is not 1 when trying to connect to browserUrl ${browserUrl}`);
3836
+ logerr(`##browser pids.length ${pids.length} is not 1 when trying to connect to browserUrl ${browserUrl}`);
3816
3837
  } else {
3817
3838
  browserPid = pids[0];
3818
3839
  }
@@ -3859,5 +3880,6 @@ export {
3859
3880
  PuppeteerBrowserContext,
3860
3881
  PuppeteerElement,
3861
3882
  PuppeteerPage,
3862
- controller
3883
+ controller,
3884
+ setControllerLogFun
3863
3885
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@letsscrapedata/controller",
3
- "version": "0.0.49",
3
+ "version": "0.0.51",
4
4
  "description": "Unified browser / HTML controller interfaces that support playwright, puppeteer and cheerio",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -46,7 +46,7 @@
46
46
  "apify"
47
47
  ],
48
48
  "dependencies": {
49
- "@letsscrapedata/utils": "^0.0.24",
49
+ "@letsscrapedata/utils": "^0.0.26",
50
50
  "cheerio": "^1.0.0",
51
51
  "playwright": "^1.43.0",
52
52
  "playwright-extra": "^4.3.6",