@letsscrapedata/controller 0.0.70 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1270,6 +1270,7 @@ var PlaywrightPage = class extends import_node_events.default {
1270
1270
  requestMethod,
1271
1271
  requestUrl,
1272
1272
  requestData,
1273
+ resourceType: request.resourceType(),
1273
1274
  responseData
1274
1275
  });
1275
1276
  loginfo(`##browser cache matched response: ${requestUrl}`);
@@ -1355,6 +1356,9 @@ var PlaywrightPage = class extends import_node_events.default {
1355
1356
  logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
1356
1357
  return true;
1357
1358
  }
1359
+ userAgent() {
1360
+ return this.#lsdBrowserContext.userAgent();
1361
+ }
1358
1362
  async waitForElement(selector, options = {}) {
1359
1363
  if (!this.#page) {
1360
1364
  throw new Error("No valid page");
@@ -1469,6 +1473,7 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
1469
1473
  #browserContextIdx;
1470
1474
  #browserContext;
1471
1475
  #browserContextCreationMethod;
1476
+ #userAgent;
1472
1477
  #apiContext;
1473
1478
  #createTime;
1474
1479
  #lastStatusUpdateTime;
@@ -1496,8 +1501,15 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
1496
1501
  await lsdPage.maximizeViewport();
1497
1502
  }
1498
1503
  }
1504
+ if (!this.#userAgent && this.#lsdPages.length > 0) {
1505
+ const lsdPage = this.#lsdPages[0];
1506
+ const userAgent = await lsdPage.evaluate(() => navigator.userAgent);
1507
+ if (typeof userAgent === "string" && userAgent) {
1508
+ this.#userAgent = userAgent;
1509
+ }
1510
+ }
1499
1511
  }
1500
- constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, maxViewportOfNewPage = true) {
1512
+ constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxViewportOfNewPage = true) {
1501
1513
  if (!lsdBrowser || typeof lsdBrowser.browserContexts !== "function") {
1502
1514
  throw new Error(`Invalid lsdBrowser parameter`);
1503
1515
  }
@@ -1510,6 +1522,7 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
1510
1522
  this.#browserContextIdx = browserContextIdx;
1511
1523
  this.#browserContext = browserContext;
1512
1524
  this.#browserContextCreationMethod = browserContextCreationMethod;
1525
+ this.#userAgent = userAgent;
1513
1526
  const apiRequestContext = browserContext.request;
1514
1527
  this.#apiContext = new PlaywrightApiContext(apiRequestContext);
1515
1528
  const currentTime = (0, import_utils4.getCurrentUnixTime)();
@@ -1663,6 +1676,12 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
1663
1676
  }
1664
1677
  lsdPage = this.#lsdPages.find((p) => p.isFree());
1665
1678
  if (lsdPage) {
1679
+ if (!this.#userAgent) {
1680
+ const userAgent = await lsdPage.evaluate(() => navigator.userAgent);
1681
+ if (typeof userAgent === "string" && userAgent) {
1682
+ this.#userAgent = userAgent;
1683
+ }
1684
+ }
1666
1685
  lsdPage.use();
1667
1686
  this.#freeGettingLock();
1668
1687
  return lsdPage;
@@ -1769,6 +1788,9 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
1769
1788
  return false;
1770
1789
  }
1771
1790
  }
1791
+ userAgent() {
1792
+ return this.#userAgent;
1793
+ }
1772
1794
  _origBrowserContext() {
1773
1795
  return this.#browserContext;
1774
1796
  }
@@ -1776,7 +1798,7 @@ var PlaywrightBrowserContext = class extends import_node_events2.default {
1776
1798
 
1777
1799
  // src/playwright/browser.ts
1778
1800
  var PlaywrightBrowser = class _PlaywrightBrowser extends import_node_events3.default {
1779
- static #supportedBrowserTypes = ["chromium", "firefox", "webkit"];
1801
+ static #supportedBrowserTypes = ["chrome", "chromium", "firefox", "webkit"];
1780
1802
  static doesSupport(browserType) {
1781
1803
  return _PlaywrightBrowser.#supportedBrowserTypes.includes(browserType);
1782
1804
  }
@@ -1838,7 +1860,7 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends import_node_events3.def
1838
1860
  }
1839
1861
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
1840
1862
  for (const browserContext of browserContexts) {
1841
- const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
1863
+ const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), "", maxViewportOfNewPage);
1842
1864
  this.#lsdBrowserContexts.push(lsdBrowserContext);
1843
1865
  }
1844
1866
  browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
@@ -1890,12 +1912,17 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends import_node_events3.def
1890
1912
  const { proxyUrl: server, username, password } = proxy;
1891
1913
  browserContextOptions.proxy = { server, username, password };
1892
1914
  }
1893
- if (options?.userAgent) {
1894
- browserContextOptions.userAgent = options.userAgent;
1915
+ let userAgent = options?.userAgent ? options.userAgent : this.#options.userAgent;
1916
+ const lsdLaunchOptions = this.#options;
1917
+ if (!userAgent && lsdLaunchOptions.headless && lsdLaunchOptions.headlessUserAgent) {
1918
+ userAgent = lsdLaunchOptions.headlessUserAgent;
1919
+ }
1920
+ if (userAgent) {
1921
+ browserContextOptions.userAgent = userAgent;
1895
1922
  }
1896
1923
  const browserContext = await this.#browser.newContext(browserContextOptions);
1897
1924
  const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
1898
- const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
1925
+ const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxViewportOfNewPage);
1899
1926
  this.#lsdBrowserContexts.push(lsdBrowserContext);
1900
1927
  return lsdBrowserContext;
1901
1928
  }
@@ -2278,6 +2305,7 @@ var PuppeteerPage = class extends import_node_events4.default {
2278
2305
  #page;
2279
2306
  #status;
2280
2307
  #pageId;
2308
+ #userAgent;
2281
2309
  #closeWhenFree;
2282
2310
  #requestInterceptionNum;
2283
2311
  #responseInterceptionNum;
@@ -2301,7 +2329,7 @@ var PuppeteerPage = class extends import_node_events4.default {
2301
2329
  }
2302
2330
  const origCookies = await page.cookies();
2303
2331
  const cookies = origCookies.map((origCookie) => {
2304
- const { name, value, domain, path, expires, httpOnly, secure, sameSite = "Lax" } = origCookie;
2332
+ const { name, value, domain, path, expires, httpOnly = false, secure, sameSite = "Lax" } = origCookie;
2305
2333
  return { name, value, domain, path, expires, httpOnly, secure, sameSite };
2306
2334
  });
2307
2335
  return cookies;
@@ -2511,6 +2539,7 @@ var PuppeteerPage = class extends import_node_events4.default {
2511
2539
  const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
2512
2540
  this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId, relatedId, misc };
2513
2541
  this.#pageId = `PuppeteerPage-${browserIdx}-${browserContextIdx}-${pageIdx}`;
2542
+ this.#userAgent = browserContext.userAgent();
2514
2543
  this.#closeWhenFree = false;
2515
2544
  this.#requestInterceptionNum = 0;
2516
2545
  this.#responseInterceptionNum = 0;
@@ -3079,6 +3108,7 @@ var PuppeteerPage = class extends import_node_events4.default {
3079
3108
  requestMethod,
3080
3109
  requestUrl,
3081
3110
  requestData,
3111
+ resourceType: request.resourceType(),
3082
3112
  responseData
3083
3113
  });
3084
3114
  loginfo(`##browser cache matched response: ${requestUrl}`);
@@ -3106,10 +3136,11 @@ var PuppeteerPage = class extends import_node_events4.default {
3106
3136
  return await this.#lsdBrowserContext.setStateData(stateData);
3107
3137
  }
3108
3138
  async setUserAgent(userAgent) {
3109
- if (!this.#page) {
3139
+ if (!this.#page || !userAgent) {
3110
3140
  throw new Error("No valid page");
3111
3141
  }
3112
3142
  await this.#page.setUserAgent(userAgent);
3143
+ this.#userAgent = userAgent;
3113
3144
  return true;
3114
3145
  }
3115
3146
  async setViewportSize(viewPortSize) {
@@ -3150,6 +3181,9 @@ var PuppeteerPage = class extends import_node_events4.default {
3150
3181
  logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
3151
3182
  return true;
3152
3183
  }
3184
+ userAgent() {
3185
+ return this.#userAgent;
3186
+ }
3153
3187
  async waitForElement(selector, options = {}) {
3154
3188
  if (!this.#page) {
3155
3189
  throw new Error("No valid page");
@@ -3233,9 +3267,9 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
3233
3267
  #browserContext;
3234
3268
  #browserContextCreationMethod;
3235
3269
  /**
3236
- * the userAgent of pages in this browserContext if userAgent
3237
- * * Notice: it is not the actual userAgent if !#userAgent (ignored if !#userAgent)
3270
+ * userAgent of BrowserContext
3238
3271
  */
3272
+ #bcUserAgent;
3239
3273
  #userAgent;
3240
3274
  #createTime;
3241
3275
  #lastStatusUpdateTime;
@@ -3262,8 +3296,15 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
3262
3296
  if (this.#maxViewportOfNewPage) {
3263
3297
  await lsdPage.maximizeViewport();
3264
3298
  }
3265
- if (this.#userAgent) {
3266
- await lsdPage.setUserAgent(this.#userAgent);
3299
+ if (this.#bcUserAgent) {
3300
+ await lsdPage.setUserAgent(this.#bcUserAgent);
3301
+ }
3302
+ }
3303
+ if (!this.#userAgent && this.#lsdPages.length > 0) {
3304
+ const lsdPage = this.#lsdPages[0];
3305
+ const userAgent = await lsdPage.evaluate(() => navigator.userAgent);
3306
+ if (typeof userAgent === "string" && userAgent) {
3307
+ this.#userAgent = userAgent;
3267
3308
  }
3268
3309
  }
3269
3310
  }
@@ -3280,6 +3321,7 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
3280
3321
  this.#browserContextIdx = browserContextIdx;
3281
3322
  this.#browserContext = browserContext;
3282
3323
  this.#browserContextCreationMethod = browserContextCreationMethod;
3324
+ this.#bcUserAgent = userAgent;
3283
3325
  this.#userAgent = userAgent;
3284
3326
  const currentTime = (0, import_utils8.getCurrentUnixTime)();
3285
3327
  this.#createTime = currentTime;
@@ -3310,9 +3352,6 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
3310
3352
  const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
3311
3353
  const lsdPage = new PuppeteerPage(this, page, pageInfo2);
3312
3354
  this.#lsdPages.push(lsdPage);
3313
- if (this.#userAgent) {
3314
- await lsdPage.setUserAgent(this.#userAgent);
3315
- }
3316
3355
  if (this.#maxViewportOfNewPage) {
3317
3356
  await lsdPage.maximizeViewport();
3318
3357
  }
@@ -3440,6 +3479,9 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
3440
3479
  return null;
3441
3480
  }
3442
3481
  const page = await this.#browserContext.newPage();
3482
+ if (this.#bcUserAgent) {
3483
+ await page.setUserAgent({ userAgent: this.#bcUserAgent });
3484
+ }
3443
3485
  await (0, import_utils8.sleep)(2e3);
3444
3486
  const pageInfo = page.pageInfo;
3445
3487
  if (!pageInfo) {
@@ -3449,6 +3491,12 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
3449
3491
  }
3450
3492
  lsdPage = this.#lsdPages.find((p) => p.isFree());
3451
3493
  if (lsdPage) {
3494
+ if (!this.#userAgent) {
3495
+ const userAgent = await lsdPage.evaluate(() => navigator.userAgent);
3496
+ if (typeof userAgent === "string" && userAgent) {
3497
+ this.#userAgent = userAgent;
3498
+ }
3499
+ }
3452
3500
  lsdPage.use();
3453
3501
  this.#freeGettingLock();
3454
3502
  return lsdPage;
@@ -3555,6 +3603,9 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
3555
3603
  return false;
3556
3604
  }
3557
3605
  }
3606
+ userAgent() {
3607
+ return this.#userAgent;
3608
+ }
3558
3609
  _origBrowserContext() {
3559
3610
  return this.#browserContext;
3560
3611
  }
@@ -3562,7 +3613,7 @@ var PuppeteerBrowserContext = class extends import_node_events5.default {
3562
3613
 
3563
3614
  // src/puppeteer/browser.ts
3564
3615
  var PuppeteerBrowser = class _PuppeteerBrowser extends import_node_events6.default {
3565
- static #supportedBrowserTypes = ["chromium"];
3616
+ static #supportedBrowserTypes = ["chrome", "chromium"];
3566
3617
  static doesSupport(browserType) {
3567
3618
  return _PuppeteerBrowser.#supportedBrowserTypes.includes(browserType);
3568
3619
  }
@@ -3672,8 +3723,12 @@ var PuppeteerBrowser = class _PuppeteerBrowser extends import_node_events6.defau
3672
3723
  if (proxy?.proxyUrl) {
3673
3724
  browserContextOptions.proxyServer = proxy.proxyUrl;
3674
3725
  }
3726
+ let userAgent = options?.userAgent ? options.userAgent : this.#options.userAgent;
3727
+ const lsdLaunchOptions = this.#options;
3728
+ if (!userAgent && lsdLaunchOptions.headless && lsdLaunchOptions.headlessUserAgent) {
3729
+ userAgent = lsdLaunchOptions.headlessUserAgent;
3730
+ }
3675
3731
  const browserContext = await this.#browser.createBrowserContext(browserContextOptions);
3676
- const userAgent = options?.userAgent ? options.userAgent : "";
3677
3732
  const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
3678
3733
  const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxViewportOfNewPage);
3679
3734
  this.#lsdBrowserContexts.push(lsdBrowserContext);
@@ -4113,6 +4168,9 @@ var CheerioPage = class extends import_node_events7.default {
4113
4168
  use() {
4114
4169
  throw new Error("Not supported in CheerioPage.");
4115
4170
  }
4171
+ userAgent() {
4172
+ throw new Error("Not supported in CheerioPage.");
4173
+ }
4116
4174
  waitForElement() {
4117
4175
  throw new Error("Not supported in CheerioPage.");
4118
4176
  }
@@ -4125,7 +4183,7 @@ var CheerioPage = class extends import_node_events7.default {
4125
4183
  };
4126
4184
 
4127
4185
  // src/controller/controller.ts
4128
- var import_os = __toESM(require("os"), 1);
4186
+ var import_node_os = __toESM(require("os"), 1);
4129
4187
  var import_puppeteer = __toESM(require("puppeteer"), 1);
4130
4188
  var import_playwright = __toESM(require("playwright"), 1);
4131
4189
  var import_patchright = __toESM(require("patchright"), 1);
@@ -5275,6 +5333,7 @@ var PatchrightPage = class extends import_node_events8.default {
5275
5333
  requestMethod,
5276
5334
  requestUrl,
5277
5335
  requestData,
5336
+ resourceType: request.resourceType(),
5278
5337
  responseData
5279
5338
  });
5280
5339
  loginfo(`##browser cache matched response: ${requestUrl}`);
@@ -5360,6 +5419,9 @@ var PatchrightPage = class extends import_node_events8.default {
5360
5419
  logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
5361
5420
  return true;
5362
5421
  }
5422
+ userAgent() {
5423
+ return this.#lsdBrowserContext.userAgent();
5424
+ }
5363
5425
  async waitForElement(selector, options = {}) {
5364
5426
  if (!this.#page) {
5365
5427
  throw new Error("No valid page");
@@ -5384,7 +5446,7 @@ var PatchrightPage = class extends import_node_events8.default {
5384
5446
  }
5385
5447
  return true;
5386
5448
  }
5387
- async windowMember(keys) {
5449
+ async windowMember(keys, isolated = true) {
5388
5450
  if (!this.#page) {
5389
5451
  throw new Error("No valid page");
5390
5452
  }
@@ -5423,7 +5485,8 @@ var PatchrightPage = class extends import_node_events8.default {
5423
5485
  return "";
5424
5486
  }
5425
5487
  },
5426
- keys
5488
+ keys,
5489
+ !!isolated
5427
5490
  );
5428
5491
  return content;
5429
5492
  }
@@ -5474,6 +5537,7 @@ var PatchrightBrowserContext = class extends import_node_events9.default {
5474
5537
  #browserContextIdx;
5475
5538
  #browserContext;
5476
5539
  #browserContextCreationMethod;
5540
+ #userAgent;
5477
5541
  #apiContext;
5478
5542
  #createTime;
5479
5543
  #lastStatusUpdateTime;
@@ -5501,8 +5565,15 @@ var PatchrightBrowserContext = class extends import_node_events9.default {
5501
5565
  await lsdPage.maximizeViewport();
5502
5566
  }
5503
5567
  }
5568
+ if (!this.#userAgent && this.#lsdPages.length > 0) {
5569
+ const lsdPage = this.#lsdPages[0];
5570
+ const userAgent = await lsdPage.evaluate(() => navigator.userAgent);
5571
+ if (typeof userAgent === "string" && userAgent) {
5572
+ this.#userAgent = userAgent;
5573
+ }
5574
+ }
5504
5575
  }
5505
- constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, maxViewportOfNewPage = true) {
5576
+ constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxViewportOfNewPage = true) {
5506
5577
  if (!lsdBrowser || typeof lsdBrowser.browserContexts !== "function") {
5507
5578
  throw new Error(`Invalid lsdBrowser parameter`);
5508
5579
  }
@@ -5515,6 +5586,7 @@ var PatchrightBrowserContext = class extends import_node_events9.default {
5515
5586
  this.#browserContextIdx = browserContextIdx;
5516
5587
  this.#browserContext = browserContext;
5517
5588
  this.#browserContextCreationMethod = browserContextCreationMethod;
5589
+ this.#userAgent = userAgent;
5518
5590
  const apiRequestContext = browserContext.request;
5519
5591
  this.#apiContext = new PatchrightApiContext(apiRequestContext);
5520
5592
  const currentTime = (0, import_utils12.getCurrentUnixTime)();
@@ -5668,6 +5740,12 @@ var PatchrightBrowserContext = class extends import_node_events9.default {
5668
5740
  }
5669
5741
  lsdPage = this.#lsdPages.find((p) => p.isFree());
5670
5742
  if (lsdPage) {
5743
+ if (!this.#userAgent) {
5744
+ const userAgent = await lsdPage.evaluate(() => navigator.userAgent);
5745
+ if (typeof userAgent === "string" && userAgent) {
5746
+ this.#userAgent = userAgent;
5747
+ }
5748
+ }
5671
5749
  lsdPage.use();
5672
5750
  this.#freeGettingLock();
5673
5751
  return lsdPage;
@@ -5774,6 +5852,9 @@ var PatchrightBrowserContext = class extends import_node_events9.default {
5774
5852
  return false;
5775
5853
  }
5776
5854
  }
5855
+ userAgent() {
5856
+ return this.#userAgent;
5857
+ }
5777
5858
  _origBrowserContext() {
5778
5859
  return this.#browserContext;
5779
5860
  }
@@ -5781,7 +5862,7 @@ var PatchrightBrowserContext = class extends import_node_events9.default {
5781
5862
 
5782
5863
  // src/patchright/browser.ts
5783
5864
  var PatchrightBrowser = class _PatchrightBrowser extends import_node_events10.default {
5784
- static #supportedBrowserTypes = ["chromium", "firefox", "webkit"];
5865
+ static #supportedBrowserTypes = ["chrome", "chromium", "firefox", "webkit"];
5785
5866
  static doesSupport(browserType) {
5786
5867
  return _PatchrightBrowser.#supportedBrowserTypes.includes(browserType);
5787
5868
  }
@@ -5843,7 +5924,7 @@ var PatchrightBrowser = class _PatchrightBrowser extends import_node_events10.de
5843
5924
  }
5844
5925
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
5845
5926
  for (const browserContext of browserContexts) {
5846
- const lsdBrowserContext = new PatchrightBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
5927
+ const lsdBrowserContext = new PatchrightBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), "", maxViewportOfNewPage);
5847
5928
  this.#lsdBrowserContexts.push(lsdBrowserContext);
5848
5929
  }
5849
5930
  browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
@@ -5895,12 +5976,17 @@ var PatchrightBrowser = class _PatchrightBrowser extends import_node_events10.de
5895
5976
  const { proxyUrl: server, username, password } = proxy;
5896
5977
  browserContextOptions.proxy = { server, username, password };
5897
5978
  }
5898
- if (options?.userAgent) {
5899
- browserContextOptions.userAgent = options.userAgent;
5979
+ let userAgent = options?.userAgent ? options.userAgent : this.#options.userAgent;
5980
+ const lsdLaunchOptions = this.#options;
5981
+ if (!userAgent && lsdLaunchOptions.headless && lsdLaunchOptions.headlessUserAgent) {
5982
+ userAgent = lsdLaunchOptions.headlessUserAgent;
5983
+ }
5984
+ if (userAgent) {
5985
+ browserContextOptions.userAgent = userAgent;
5900
5986
  }
5901
5987
  const browserContext = await this.#browser.newContext(browserContextOptions);
5902
5988
  const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
5903
- const lsdBrowserContext = new PatchrightBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
5989
+ const lsdBrowserContext = new PatchrightBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxViewportOfNewPage);
5904
5990
  this.#lsdBrowserContexts.push(lsdBrowserContext);
5905
5991
  return lsdBrowserContext;
5906
5992
  }
@@ -7099,6 +7185,7 @@ var CamoufoxPage = class extends import_node_events11.default {
7099
7185
  requestMethod,
7100
7186
  requestUrl,
7101
7187
  requestData,
7188
+ resourceType: request.resourceType(),
7102
7189
  responseData
7103
7190
  });
7104
7191
  loginfo(`##browser cache matched response: ${requestUrl}`);
@@ -7184,6 +7271,9 @@ var CamoufoxPage = class extends import_node_events11.default {
7184
7271
  logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
7185
7272
  return true;
7186
7273
  }
7274
+ userAgent() {
7275
+ return this.#lsdBrowserContext.userAgent();
7276
+ }
7187
7277
  async waitForElement(selector, options = {}) {
7188
7278
  if (!this.#page) {
7189
7279
  throw new Error("No valid page");
@@ -7298,6 +7388,7 @@ var CamoufoxBrowserContext = class extends import_node_events12.default {
7298
7388
  #browserContextIdx;
7299
7389
  #browserContext;
7300
7390
  #browserContextCreationMethod;
7391
+ #userAgent;
7301
7392
  #apiContext;
7302
7393
  #createTime;
7303
7394
  #lastStatusUpdateTime;
@@ -7325,8 +7416,15 @@ var CamoufoxBrowserContext = class extends import_node_events12.default {
7325
7416
  await lsdPage.maximizeViewport();
7326
7417
  }
7327
7418
  }
7419
+ if (!this.#userAgent && this.#lsdPages.length > 0) {
7420
+ const lsdPage = this.#lsdPages[0];
7421
+ const userAgent = await lsdPage.evaluate(() => navigator.userAgent);
7422
+ if (typeof userAgent === "string" && userAgent) {
7423
+ this.#userAgent = userAgent;
7424
+ }
7425
+ }
7328
7426
  }
7329
- constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, maxViewportOfNewPage = true) {
7427
+ constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxViewportOfNewPage = true) {
7330
7428
  if (!lsdBrowser || typeof lsdBrowser.browserContexts !== "function") {
7331
7429
  throw new Error(`Invalid lsdBrowser parameter`);
7332
7430
  }
@@ -7339,6 +7437,7 @@ var CamoufoxBrowserContext = class extends import_node_events12.default {
7339
7437
  this.#browserContextIdx = browserContextIdx;
7340
7438
  this.#browserContext = browserContext;
7341
7439
  this.#browserContextCreationMethod = browserContextCreationMethod;
7440
+ this.#userAgent = userAgent;
7342
7441
  const apiRequestContext = browserContext.request;
7343
7442
  this.#apiContext = new CamoufoxApiContext(apiRequestContext);
7344
7443
  const currentTime = (0, import_utils16.getCurrentUnixTime)();
@@ -7492,6 +7591,12 @@ var CamoufoxBrowserContext = class extends import_node_events12.default {
7492
7591
  }
7493
7592
  lsdPage = this.#lsdPages.find((p) => p.isFree());
7494
7593
  if (lsdPage) {
7594
+ if (!this.#userAgent) {
7595
+ const userAgent = await lsdPage.evaluate(() => navigator.userAgent);
7596
+ if (typeof userAgent === "string" && userAgent) {
7597
+ this.#userAgent = userAgent;
7598
+ }
7599
+ }
7495
7600
  lsdPage.use();
7496
7601
  this.#freeGettingLock();
7497
7602
  return lsdPage;
@@ -7598,6 +7703,9 @@ var CamoufoxBrowserContext = class extends import_node_events12.default {
7598
7703
  return false;
7599
7704
  }
7600
7705
  }
7706
+ userAgent() {
7707
+ return this.#userAgent;
7708
+ }
7601
7709
  _origBrowserContext() {
7602
7710
  return this.#browserContext;
7603
7711
  }
@@ -7667,7 +7775,7 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends import_node_events13.defaul
7667
7775
  }
7668
7776
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
7669
7777
  for (const browserContext of browserContexts) {
7670
- const lsdBrowserContext = new CamoufoxBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
7778
+ const lsdBrowserContext = new CamoufoxBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), "", maxViewportOfNewPage);
7671
7779
  this.#lsdBrowserContexts.push(lsdBrowserContext);
7672
7780
  }
7673
7781
  browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
@@ -7719,12 +7827,17 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends import_node_events13.defaul
7719
7827
  const { proxyUrl: server, username, password } = proxy;
7720
7828
  browserContextOptions.proxy = { server, username, password };
7721
7829
  }
7722
- if (options?.userAgent) {
7723
- browserContextOptions.userAgent = options.userAgent;
7830
+ let userAgent = options?.userAgent ? options.userAgent : this.#options.userAgent;
7831
+ const lsdLaunchOptions = this.#options;
7832
+ if (!userAgent && lsdLaunchOptions.headless && lsdLaunchOptions.headlessUserAgent) {
7833
+ userAgent = lsdLaunchOptions.headlessUserAgent;
7834
+ }
7835
+ if (userAgent) {
7836
+ browserContextOptions.userAgent = userAgent;
7724
7837
  }
7725
7838
  const browserContext = await this.#browser.newContext(browserContextOptions);
7726
7839
  const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
7727
- const lsdBrowserContext = new CamoufoxBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
7840
+ const lsdBrowserContext = new CamoufoxBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxViewportOfNewPage);
7728
7841
  this.#lsdBrowserContexts.push(lsdBrowserContext);
7729
7842
  return lsdBrowserContext;
7730
7843
  }
@@ -7813,21 +7926,23 @@ var LsdBrowserController = class _LsdBrowserController {
7813
7926
  }
7814
7927
  this.#puppeteer = import_puppeteer.default;
7815
7928
  this.#playwrightBrowserTypes = {
7929
+ chrome: import_playwright.default.chromium,
7816
7930
  chromium: import_playwright.default.chromium,
7817
7931
  firefox: import_playwright.default.firefox,
7818
7932
  webkit: import_playwright.default.webkit
7819
7933
  };
7820
7934
  this.#patchrightBrowserTypes = {
7935
+ chrome: import_playwright.default.chromium,
7821
7936
  chromium: import_patchright.default.chromium,
7822
7937
  firefox: import_patchright.default.firefox,
7823
7938
  webkit: import_patchright.default.webkit
7824
7939
  };
7825
- this.#osPlatform = import_os.default.platform();
7940
+ this.#osPlatform = import_node_os.default.platform();
7826
7941
  this.#nextBrowserIdx = 1;
7827
7942
  _LsdBrowserController.#forbidConstructor = true;
7828
7943
  }
7829
7944
  #playwrightBrowserType(browserType, connectFlag = false) {
7830
- if (browserType === "chromium") {
7945
+ if (browserType === "chrome" || browserType === "chromium") {
7831
7946
  return this.#playwrightBrowserTypes.chromium;
7832
7947
  } else if (connectFlag) {
7833
7948
  throw new Error(`playwright only can connect to chromium browser, not support ${browserType} browser`);
@@ -7840,7 +7955,7 @@ var LsdBrowserController = class _LsdBrowserController {
7840
7955
  }
7841
7956
  }
7842
7957
  #patchrightBrowserType(browserType, connectFlag = false) {
7843
- if (browserType === "chromium") {
7958
+ if (browserType === "chrome" || browserType === "chromium") {
7844
7959
  return this.#patchrightBrowserTypes.chromium;
7845
7960
  } else if (connectFlag) {
7846
7961
  throw new Error(`patchright only can connect to chromium browser, not support ${browserType} browser`);
@@ -7853,7 +7968,7 @@ var LsdBrowserController = class _LsdBrowserController {
7853
7968
  }
7854
7969
  }
7855
7970
  #puppeteerProduct(browserType) {
7856
- if (browserType === "chromium") {
7971
+ if (browserType === "chrome" || browserType === "chromium") {
7857
7972
  return "chrome";
7858
7973
  } else {
7859
7974
  throw new Error(`Invalid puppeteer product ${browserType}`);
@@ -7870,6 +7985,7 @@ var LsdBrowserController = class _LsdBrowserController {
7870
7985
  throw new Error(`BrowserControllerType ${browserControllerType} doesnot support browserType ${browserType}`);
7871
7986
  }
7872
7987
  switch (browserType) {
7988
+ case "chrome":
7873
7989
  case "chromium":
7874
7990
  case "firefox":
7875
7991
  case "webkit":
@@ -7883,6 +7999,7 @@ var LsdBrowserController = class _LsdBrowserController {
7883
7999
  throw new Error(`BrowserControllerType ${browserControllerType} doesnot support browserType ${browserType}`);
7884
8000
  }
7885
8001
  switch (browserType) {
8002
+ case "chrome":
7886
8003
  case "chromium":
7887
8004
  case "firefox":
7888
8005
  case "webkit":
@@ -7917,11 +8034,12 @@ var LsdBrowserController = class _LsdBrowserController {
7917
8034
  // incognito
7918
8035
  proxyPerBrowserContext = false,
7919
8036
  userDataDir = "",
7920
- userAgent = ""
8037
+ userAgent = "",
8038
+ headlessUserAgent = ""
7921
8039
  } = options ? options : {};
7922
8040
  let browserPid = 0;
7923
8041
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : browserControllerType === "puppeteer" ? false : true;
7924
- const actOptions = { closeFreePagesIntervalSeconds, maxBrowserContextsPerBrowser, maxPagesPerBrowserContext, maxPageFreeSeconds, maxViewportOfNewPage, proxy, timeout, args, executablePath, maxWindowSize, headless, minBrowserContexts, incognito, proxyPerBrowserContext, userDataDir, userAgent };
8042
+ const actOptions = { closeFreePagesIntervalSeconds, maxBrowserContextsPerBrowser, maxPagesPerBrowserContext, maxPageFreeSeconds, maxViewportOfNewPage, proxy, timeout, args, executablePath, maxWindowSize, headless, minBrowserContexts, incognito, proxyPerBrowserContext, userDataDir, userAgent, headlessUserAgent };
7925
8043
  let idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--incoginto"));
7926
8044
  if (idx >= 0) {
7927
8045
  logwarn(`##browser controller Please use options.incognito instead when launching new browser.`);
@@ -7943,6 +8061,11 @@ var LsdBrowserController = class _LsdBrowserController {
7943
8061
  args.splice(idx, 1);
7944
8062
  }
7945
8063
  let lsdBrowser;
8064
+ if (browserType === "chrome" && ["playwright", "patchright", "puppeteer"].includes(browserControllerType)) {
8065
+ if (!executablePath) {
8066
+ throw new Error("Invalid executablePath when to launch chrome");
8067
+ }
8068
+ }
7946
8069
  if (browserControllerType === "playwright") {
7947
8070
  const launchOptions = { headless, timeout };
7948
8071
  if (executablePath) {
@@ -7957,11 +8080,12 @@ var LsdBrowserController = class _LsdBrowserController {
7957
8080
  } else if (proxyPerBrowserContext && browserType === "chromium" && this.#osPlatform.startsWith("win")) {
7958
8081
  launchOptions.proxy = { server: "proxyPerBrowserContext" };
7959
8082
  }
7960
- if (browserType === "chromium") {
8083
+ if (browserType === "chrome" || browserType === "chromium") {
8084
+ if (browserType === "chrome") {
8085
+ launchOptions.channel = "chrome";
8086
+ }
7961
8087
  if (incognito) {
7962
8088
  args.push("--incognito");
7963
- } else if (userDataDir) {
7964
- args.push(`--user-data-dir=${userDataDir}`);
7965
8089
  }
7966
8090
  }
7967
8091
  if (args.length > 0) {
@@ -7998,11 +8122,12 @@ var LsdBrowserController = class _LsdBrowserController {
7998
8122
  } else if (proxyPerBrowserContext && browserType === "chromium" && this.#osPlatform.startsWith("win")) {
7999
8123
  launchOptions.proxy = { server: "proxyPerBrowserContext" };
8000
8124
  }
8001
- if (browserType === "chromium") {
8125
+ if (browserType === "chrome" || browserType === "chromium") {
8126
+ if (browserType === "chrome") {
8127
+ launchOptions.channel = "chrome";
8128
+ }
8002
8129
  if (incognito) {
8003
8130
  args.push("--incognito");
8004
- } else if (userDataDir) {
8005
- args.push(`--user-data-dir=${userDataDir}`);
8006
8131
  }
8007
8132
  }
8008
8133
  if (args.length > 0) {
@@ -8038,11 +8163,15 @@ var LsdBrowserController = class _LsdBrowserController {
8038
8163
  if (!args.includes("--no-sandbox")) {
8039
8164
  args.push("--no-sandbox");
8040
8165
  }
8041
- if (browserType === "chromium") {
8166
+ if (browserType === "chrome" || browserType === "chromium") {
8167
+ if (browserType === "chrome") {
8168
+ launchOptions.channel = "chrome";
8169
+ }
8042
8170
  if (incognito) {
8043
8171
  args.push("--incognito");
8044
- } else if (userDataDir) {
8045
- args.push(`--user-data-dir=${userDataDir}`);
8172
+ }
8173
+ if (userDataDir) {
8174
+ launchOptions.userDataDir = userDataDir;
8046
8175
  }
8047
8176
  if (proxy?.proxyUrl && proxy.proxyUrl !== "default") {
8048
8177
  args.push(`--proxy-server=${proxy.proxyUrl}`);