@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.js CHANGED
@@ -1219,6 +1219,7 @@ var PlaywrightPage = class extends EventEmitter {
1219
1219
  requestMethod,
1220
1220
  requestUrl,
1221
1221
  requestData,
1222
+ resourceType: request.resourceType(),
1222
1223
  responseData
1223
1224
  });
1224
1225
  loginfo(`##browser cache matched response: ${requestUrl}`);
@@ -1304,6 +1305,9 @@ var PlaywrightPage = class extends EventEmitter {
1304
1305
  logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
1305
1306
  return true;
1306
1307
  }
1308
+ userAgent() {
1309
+ return this.#lsdBrowserContext.userAgent();
1310
+ }
1307
1311
  async waitForElement(selector, options = {}) {
1308
1312
  if (!this.#page) {
1309
1313
  throw new Error("No valid page");
@@ -1418,6 +1422,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1418
1422
  #browserContextIdx;
1419
1423
  #browserContext;
1420
1424
  #browserContextCreationMethod;
1425
+ #userAgent;
1421
1426
  #apiContext;
1422
1427
  #createTime;
1423
1428
  #lastStatusUpdateTime;
@@ -1445,8 +1450,15 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1445
1450
  await lsdPage.maximizeViewport();
1446
1451
  }
1447
1452
  }
1453
+ if (!this.#userAgent && this.#lsdPages.length > 0) {
1454
+ const lsdPage = this.#lsdPages[0];
1455
+ const userAgent = await lsdPage.evaluate(() => navigator.userAgent);
1456
+ if (typeof userAgent === "string" && userAgent) {
1457
+ this.#userAgent = userAgent;
1458
+ }
1459
+ }
1448
1460
  }
1449
- constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, maxViewportOfNewPage = true) {
1461
+ constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxViewportOfNewPage = true) {
1450
1462
  if (!lsdBrowser || typeof lsdBrowser.browserContexts !== "function") {
1451
1463
  throw new Error(`Invalid lsdBrowser parameter`);
1452
1464
  }
@@ -1459,6 +1471,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1459
1471
  this.#browserContextIdx = browserContextIdx;
1460
1472
  this.#browserContext = browserContext;
1461
1473
  this.#browserContextCreationMethod = browserContextCreationMethod;
1474
+ this.#userAgent = userAgent;
1462
1475
  const apiRequestContext = browserContext.request;
1463
1476
  this.#apiContext = new PlaywrightApiContext(apiRequestContext);
1464
1477
  const currentTime = getCurrentUnixTime2();
@@ -1612,6 +1625,12 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1612
1625
  }
1613
1626
  lsdPage = this.#lsdPages.find((p) => p.isFree());
1614
1627
  if (lsdPage) {
1628
+ if (!this.#userAgent) {
1629
+ const userAgent = await lsdPage.evaluate(() => navigator.userAgent);
1630
+ if (typeof userAgent === "string" && userAgent) {
1631
+ this.#userAgent = userAgent;
1632
+ }
1633
+ }
1615
1634
  lsdPage.use();
1616
1635
  this.#freeGettingLock();
1617
1636
  return lsdPage;
@@ -1718,6 +1737,9 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1718
1737
  return false;
1719
1738
  }
1720
1739
  }
1740
+ userAgent() {
1741
+ return this.#userAgent;
1742
+ }
1721
1743
  _origBrowserContext() {
1722
1744
  return this.#browserContext;
1723
1745
  }
@@ -1725,7 +1747,7 @@ var PlaywrightBrowserContext = class extends EventEmitter2 {
1725
1747
 
1726
1748
  // src/playwright/browser.ts
1727
1749
  var PlaywrightBrowser = class _PlaywrightBrowser extends EventEmitter3 {
1728
- static #supportedBrowserTypes = ["chromium", "firefox", "webkit"];
1750
+ static #supportedBrowserTypes = ["chrome", "chromium", "firefox", "webkit"];
1729
1751
  static doesSupport(browserType) {
1730
1752
  return _PlaywrightBrowser.#supportedBrowserTypes.includes(browserType);
1731
1753
  }
@@ -1787,7 +1809,7 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends EventEmitter3 {
1787
1809
  }
1788
1810
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
1789
1811
  for (const browserContext of browserContexts) {
1790
- const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
1812
+ const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), "", maxViewportOfNewPage);
1791
1813
  this.#lsdBrowserContexts.push(lsdBrowserContext);
1792
1814
  }
1793
1815
  browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
@@ -1839,12 +1861,17 @@ var PlaywrightBrowser = class _PlaywrightBrowser extends EventEmitter3 {
1839
1861
  const { proxyUrl: server, username, password } = proxy;
1840
1862
  browserContextOptions.proxy = { server, username, password };
1841
1863
  }
1842
- if (options?.userAgent) {
1843
- browserContextOptions.userAgent = options.userAgent;
1864
+ let userAgent = options?.userAgent ? options.userAgent : this.#options.userAgent;
1865
+ const lsdLaunchOptions = this.#options;
1866
+ if (!userAgent && lsdLaunchOptions.headless && lsdLaunchOptions.headlessUserAgent) {
1867
+ userAgent = lsdLaunchOptions.headlessUserAgent;
1868
+ }
1869
+ if (userAgent) {
1870
+ browserContextOptions.userAgent = userAgent;
1844
1871
  }
1845
1872
  const browserContext = await this.#browser.newContext(browserContextOptions);
1846
1873
  const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
1847
- const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
1874
+ const lsdBrowserContext = new PlaywrightBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxViewportOfNewPage);
1848
1875
  this.#lsdBrowserContexts.push(lsdBrowserContext);
1849
1876
  return lsdBrowserContext;
1850
1877
  }
@@ -2227,6 +2254,7 @@ var PuppeteerPage = class extends EventEmitter4 {
2227
2254
  #page;
2228
2255
  #status;
2229
2256
  #pageId;
2257
+ #userAgent;
2230
2258
  #closeWhenFree;
2231
2259
  #requestInterceptionNum;
2232
2260
  #responseInterceptionNum;
@@ -2250,7 +2278,7 @@ var PuppeteerPage = class extends EventEmitter4 {
2250
2278
  }
2251
2279
  const origCookies = await page.cookies();
2252
2280
  const cookies = origCookies.map((origCookie) => {
2253
- const { name, value, domain, path, expires, httpOnly, secure, sameSite = "Lax" } = origCookie;
2281
+ const { name, value, domain, path, expires, httpOnly = false, secure, sameSite = "Lax" } = origCookie;
2254
2282
  return { name, value, domain, path, expires, httpOnly, secure, sameSite };
2255
2283
  });
2256
2284
  return cookies;
@@ -2460,6 +2488,7 @@ var PuppeteerPage = class extends EventEmitter4 {
2460
2488
  const { browserIdx = 0, browserContextIdx = 0, pageIdx = 0, openType = "other", openTime = currentTime, lastStatusUpdateTime = currentTime, taskId = 0, relatedId = 0, misc = {} } = pageInfo ? pageInfo : {};
2461
2489
  this.#page.pageInfo = { browserIdx, browserContextIdx, pageIdx, openType, openTime, lastStatusUpdateTime, taskId, relatedId, misc };
2462
2490
  this.#pageId = `PuppeteerPage-${browserIdx}-${browserContextIdx}-${pageIdx}`;
2491
+ this.#userAgent = browserContext.userAgent();
2463
2492
  this.#closeWhenFree = false;
2464
2493
  this.#requestInterceptionNum = 0;
2465
2494
  this.#responseInterceptionNum = 0;
@@ -3028,6 +3057,7 @@ var PuppeteerPage = class extends EventEmitter4 {
3028
3057
  requestMethod,
3029
3058
  requestUrl,
3030
3059
  requestData,
3060
+ resourceType: request.resourceType(),
3031
3061
  responseData
3032
3062
  });
3033
3063
  loginfo(`##browser cache matched response: ${requestUrl}`);
@@ -3055,10 +3085,11 @@ var PuppeteerPage = class extends EventEmitter4 {
3055
3085
  return await this.#lsdBrowserContext.setStateData(stateData);
3056
3086
  }
3057
3087
  async setUserAgent(userAgent) {
3058
- if (!this.#page) {
3088
+ if (!this.#page || !userAgent) {
3059
3089
  throw new Error("No valid page");
3060
3090
  }
3061
3091
  await this.#page.setUserAgent(userAgent);
3092
+ this.#userAgent = userAgent;
3062
3093
  return true;
3063
3094
  }
3064
3095
  async setViewportSize(viewPortSize) {
@@ -3099,6 +3130,9 @@ var PuppeteerPage = class extends EventEmitter4 {
3099
3130
  logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
3100
3131
  return true;
3101
3132
  }
3133
+ userAgent() {
3134
+ return this.#userAgent;
3135
+ }
3102
3136
  async waitForElement(selector, options = {}) {
3103
3137
  if (!this.#page) {
3104
3138
  throw new Error("No valid page");
@@ -3182,9 +3216,9 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3182
3216
  #browserContext;
3183
3217
  #browserContextCreationMethod;
3184
3218
  /**
3185
- * the userAgent of pages in this browserContext if userAgent
3186
- * * Notice: it is not the actual userAgent if !#userAgent (ignored if !#userAgent)
3219
+ * userAgent of BrowserContext
3187
3220
  */
3221
+ #bcUserAgent;
3188
3222
  #userAgent;
3189
3223
  #createTime;
3190
3224
  #lastStatusUpdateTime;
@@ -3211,8 +3245,15 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3211
3245
  if (this.#maxViewportOfNewPage) {
3212
3246
  await lsdPage.maximizeViewport();
3213
3247
  }
3214
- if (this.#userAgent) {
3215
- await lsdPage.setUserAgent(this.#userAgent);
3248
+ if (this.#bcUserAgent) {
3249
+ await lsdPage.setUserAgent(this.#bcUserAgent);
3250
+ }
3251
+ }
3252
+ if (!this.#userAgent && this.#lsdPages.length > 0) {
3253
+ const lsdPage = this.#lsdPages[0];
3254
+ const userAgent = await lsdPage.evaluate(() => navigator.userAgent);
3255
+ if (typeof userAgent === "string" && userAgent) {
3256
+ this.#userAgent = userAgent;
3216
3257
  }
3217
3258
  }
3218
3259
  }
@@ -3229,6 +3270,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3229
3270
  this.#browserContextIdx = browserContextIdx;
3230
3271
  this.#browserContext = browserContext;
3231
3272
  this.#browserContextCreationMethod = browserContextCreationMethod;
3273
+ this.#bcUserAgent = userAgent;
3232
3274
  this.#userAgent = userAgent;
3233
3275
  const currentTime = getCurrentUnixTime5();
3234
3276
  this.#createTime = currentTime;
@@ -3259,9 +3301,6 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3259
3301
  const pageInfo2 = { browserIdx: this.#browserIdx, browserContextIdx: this.#browserContextIdx, pageIdx: this.#nextPageIdx++, openType: "other", openTime: currentTime2, lastStatusUpdateTime: currentTime2, taskId: 0, relatedId: 0, misc: {} };
3260
3302
  const lsdPage = new PuppeteerPage(this, page, pageInfo2);
3261
3303
  this.#lsdPages.push(lsdPage);
3262
- if (this.#userAgent) {
3263
- await lsdPage.setUserAgent(this.#userAgent);
3264
- }
3265
3304
  if (this.#maxViewportOfNewPage) {
3266
3305
  await lsdPage.maximizeViewport();
3267
3306
  }
@@ -3389,6 +3428,9 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3389
3428
  return null;
3390
3429
  }
3391
3430
  const page = await this.#browserContext.newPage();
3431
+ if (this.#bcUserAgent) {
3432
+ await page.setUserAgent({ userAgent: this.#bcUserAgent });
3433
+ }
3392
3434
  await sleep2(2e3);
3393
3435
  const pageInfo = page.pageInfo;
3394
3436
  if (!pageInfo) {
@@ -3398,6 +3440,12 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3398
3440
  }
3399
3441
  lsdPage = this.#lsdPages.find((p) => p.isFree());
3400
3442
  if (lsdPage) {
3443
+ if (!this.#userAgent) {
3444
+ const userAgent = await lsdPage.evaluate(() => navigator.userAgent);
3445
+ if (typeof userAgent === "string" && userAgent) {
3446
+ this.#userAgent = userAgent;
3447
+ }
3448
+ }
3401
3449
  lsdPage.use();
3402
3450
  this.#freeGettingLock();
3403
3451
  return lsdPage;
@@ -3504,6 +3552,9 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3504
3552
  return false;
3505
3553
  }
3506
3554
  }
3555
+ userAgent() {
3556
+ return this.#userAgent;
3557
+ }
3507
3558
  _origBrowserContext() {
3508
3559
  return this.#browserContext;
3509
3560
  }
@@ -3511,7 +3562,7 @@ var PuppeteerBrowserContext = class extends EventEmitter5 {
3511
3562
 
3512
3563
  // src/puppeteer/browser.ts
3513
3564
  var PuppeteerBrowser = class _PuppeteerBrowser extends EventEmitter6 {
3514
- static #supportedBrowserTypes = ["chromium"];
3565
+ static #supportedBrowserTypes = ["chrome", "chromium"];
3515
3566
  static doesSupport(browserType) {
3516
3567
  return _PuppeteerBrowser.#supportedBrowserTypes.includes(browserType);
3517
3568
  }
@@ -3621,8 +3672,12 @@ var PuppeteerBrowser = class _PuppeteerBrowser extends EventEmitter6 {
3621
3672
  if (proxy?.proxyUrl) {
3622
3673
  browserContextOptions.proxyServer = proxy.proxyUrl;
3623
3674
  }
3675
+ let userAgent = options?.userAgent ? options.userAgent : this.#options.userAgent;
3676
+ const lsdLaunchOptions = this.#options;
3677
+ if (!userAgent && lsdLaunchOptions.headless && lsdLaunchOptions.headlessUserAgent) {
3678
+ userAgent = lsdLaunchOptions.headlessUserAgent;
3679
+ }
3624
3680
  const browserContext = await this.#browser.createBrowserContext(browserContextOptions);
3625
- const userAgent = options?.userAgent ? options.userAgent : "";
3626
3681
  const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
3627
3682
  const lsdBrowserContext = new PuppeteerBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxViewportOfNewPage);
3628
3683
  this.#lsdBrowserContexts.push(lsdBrowserContext);
@@ -4062,6 +4117,9 @@ var CheerioPage = class extends EventEmitter7 {
4062
4117
  use() {
4063
4118
  throw new Error("Not supported in CheerioPage.");
4064
4119
  }
4120
+ userAgent() {
4121
+ throw new Error("Not supported in CheerioPage.");
4122
+ }
4065
4123
  waitForElement() {
4066
4124
  throw new Error("Not supported in CheerioPage.");
4067
4125
  }
@@ -5224,6 +5282,7 @@ var PatchrightPage = class extends EventEmitter8 {
5224
5282
  requestMethod,
5225
5283
  requestUrl,
5226
5284
  requestData,
5285
+ resourceType: request.resourceType(),
5227
5286
  responseData
5228
5287
  });
5229
5288
  loginfo(`##browser cache matched response: ${requestUrl}`);
@@ -5309,6 +5368,9 @@ var PatchrightPage = class extends EventEmitter8 {
5309
5368
  logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
5310
5369
  return true;
5311
5370
  }
5371
+ userAgent() {
5372
+ return this.#lsdBrowserContext.userAgent();
5373
+ }
5312
5374
  async waitForElement(selector, options = {}) {
5313
5375
  if (!this.#page) {
5314
5376
  throw new Error("No valid page");
@@ -5333,7 +5395,7 @@ var PatchrightPage = class extends EventEmitter8 {
5333
5395
  }
5334
5396
  return true;
5335
5397
  }
5336
- async windowMember(keys) {
5398
+ async windowMember(keys, isolated = true) {
5337
5399
  if (!this.#page) {
5338
5400
  throw new Error("No valid page");
5339
5401
  }
@@ -5372,7 +5434,8 @@ var PatchrightPage = class extends EventEmitter8 {
5372
5434
  return "";
5373
5435
  }
5374
5436
  },
5375
- keys
5437
+ keys,
5438
+ !!isolated
5376
5439
  );
5377
5440
  return content;
5378
5441
  }
@@ -5423,6 +5486,7 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
5423
5486
  #browserContextIdx;
5424
5487
  #browserContext;
5425
5488
  #browserContextCreationMethod;
5489
+ #userAgent;
5426
5490
  #apiContext;
5427
5491
  #createTime;
5428
5492
  #lastStatusUpdateTime;
@@ -5450,8 +5514,15 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
5450
5514
  await lsdPage.maximizeViewport();
5451
5515
  }
5452
5516
  }
5517
+ if (!this.#userAgent && this.#lsdPages.length > 0) {
5518
+ const lsdPage = this.#lsdPages[0];
5519
+ const userAgent = await lsdPage.evaluate(() => navigator.userAgent);
5520
+ if (typeof userAgent === "string" && userAgent) {
5521
+ this.#userAgent = userAgent;
5522
+ }
5523
+ }
5453
5524
  }
5454
- constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, maxViewportOfNewPage = true) {
5525
+ constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxViewportOfNewPage = true) {
5455
5526
  if (!lsdBrowser || typeof lsdBrowser.browserContexts !== "function") {
5456
5527
  throw new Error(`Invalid lsdBrowser parameter`);
5457
5528
  }
@@ -5464,6 +5535,7 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
5464
5535
  this.#browserContextIdx = browserContextIdx;
5465
5536
  this.#browserContext = browserContext;
5466
5537
  this.#browserContextCreationMethod = browserContextCreationMethod;
5538
+ this.#userAgent = userAgent;
5467
5539
  const apiRequestContext = browserContext.request;
5468
5540
  this.#apiContext = new PatchrightApiContext(apiRequestContext);
5469
5541
  const currentTime = getCurrentUnixTime8();
@@ -5617,6 +5689,12 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
5617
5689
  }
5618
5690
  lsdPage = this.#lsdPages.find((p) => p.isFree());
5619
5691
  if (lsdPage) {
5692
+ if (!this.#userAgent) {
5693
+ const userAgent = await lsdPage.evaluate(() => navigator.userAgent);
5694
+ if (typeof userAgent === "string" && userAgent) {
5695
+ this.#userAgent = userAgent;
5696
+ }
5697
+ }
5620
5698
  lsdPage.use();
5621
5699
  this.#freeGettingLock();
5622
5700
  return lsdPage;
@@ -5723,6 +5801,9 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
5723
5801
  return false;
5724
5802
  }
5725
5803
  }
5804
+ userAgent() {
5805
+ return this.#userAgent;
5806
+ }
5726
5807
  _origBrowserContext() {
5727
5808
  return this.#browserContext;
5728
5809
  }
@@ -5730,7 +5811,7 @@ var PatchrightBrowserContext = class extends EventEmitter9 {
5730
5811
 
5731
5812
  // src/patchright/browser.ts
5732
5813
  var PatchrightBrowser = class _PatchrightBrowser extends EventEmitter10 {
5733
- static #supportedBrowserTypes = ["chromium", "firefox", "webkit"];
5814
+ static #supportedBrowserTypes = ["chrome", "chromium", "firefox", "webkit"];
5734
5815
  static doesSupport(browserType) {
5735
5816
  return _PatchrightBrowser.#supportedBrowserTypes.includes(browserType);
5736
5817
  }
@@ -5792,7 +5873,7 @@ var PatchrightBrowser = class _PatchrightBrowser extends EventEmitter10 {
5792
5873
  }
5793
5874
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
5794
5875
  for (const browserContext of browserContexts) {
5795
- const lsdBrowserContext = new PatchrightBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
5876
+ const lsdBrowserContext = new PatchrightBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), "", maxViewportOfNewPage);
5796
5877
  this.#lsdBrowserContexts.push(lsdBrowserContext);
5797
5878
  }
5798
5879
  browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
@@ -5844,12 +5925,17 @@ var PatchrightBrowser = class _PatchrightBrowser extends EventEmitter10 {
5844
5925
  const { proxyUrl: server, username, password } = proxy;
5845
5926
  browserContextOptions.proxy = { server, username, password };
5846
5927
  }
5847
- if (options?.userAgent) {
5848
- browserContextOptions.userAgent = options.userAgent;
5928
+ let userAgent = options?.userAgent ? options.userAgent : this.#options.userAgent;
5929
+ const lsdLaunchOptions = this.#options;
5930
+ if (!userAgent && lsdLaunchOptions.headless && lsdLaunchOptions.headlessUserAgent) {
5931
+ userAgent = lsdLaunchOptions.headlessUserAgent;
5932
+ }
5933
+ if (userAgent) {
5934
+ browserContextOptions.userAgent = userAgent;
5849
5935
  }
5850
5936
  const browserContext = await this.#browser.newContext(browserContextOptions);
5851
5937
  const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
5852
- const lsdBrowserContext = new PatchrightBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
5938
+ const lsdBrowserContext = new PatchrightBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxViewportOfNewPage);
5853
5939
  this.#lsdBrowserContexts.push(lsdBrowserContext);
5854
5940
  return lsdBrowserContext;
5855
5941
  }
@@ -7048,6 +7134,7 @@ var CamoufoxPage = class extends EventEmitter11 {
7048
7134
  requestMethod,
7049
7135
  requestUrl,
7050
7136
  requestData,
7137
+ resourceType: request.resourceType(),
7051
7138
  responseData
7052
7139
  });
7053
7140
  loginfo(`##browser cache matched response: ${requestUrl}`);
@@ -7133,6 +7220,9 @@ var CamoufoxPage = class extends EventEmitter11 {
7133
7220
  logdbg(`##browser LsdPage ${this.#pageId} is allocated`);
7134
7221
  return true;
7135
7222
  }
7223
+ userAgent() {
7224
+ return this.#lsdBrowserContext.userAgent();
7225
+ }
7136
7226
  async waitForElement(selector, options = {}) {
7137
7227
  if (!this.#page) {
7138
7228
  throw new Error("No valid page");
@@ -7247,6 +7337,7 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
7247
7337
  #browserContextIdx;
7248
7338
  #browserContext;
7249
7339
  #browserContextCreationMethod;
7340
+ #userAgent;
7250
7341
  #apiContext;
7251
7342
  #createTime;
7252
7343
  #lastStatusUpdateTime;
@@ -7274,8 +7365,15 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
7274
7365
  await lsdPage.maximizeViewport();
7275
7366
  }
7276
7367
  }
7368
+ if (!this.#userAgent && this.#lsdPages.length > 0) {
7369
+ const lsdPage = this.#lsdPages[0];
7370
+ const userAgent = await lsdPage.evaluate(() => navigator.userAgent);
7371
+ if (typeof userAgent === "string" && userAgent) {
7372
+ this.#userAgent = userAgent;
7373
+ }
7374
+ }
7277
7375
  }
7278
- constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, maxViewportOfNewPage = true) {
7376
+ constructor(lsdBrowser, browserContext, browserContextCreationMethod, incognito = false, proxy = null, browserIdx = 0, browserContextIdx = 0, maxPagesPerBrowserContext = 20, maxPageFreeSeconds = 0, userAgent = "", maxViewportOfNewPage = true) {
7279
7377
  if (!lsdBrowser || typeof lsdBrowser.browserContexts !== "function") {
7280
7378
  throw new Error(`Invalid lsdBrowser parameter`);
7281
7379
  }
@@ -7288,6 +7386,7 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
7288
7386
  this.#browserContextIdx = browserContextIdx;
7289
7387
  this.#browserContext = browserContext;
7290
7388
  this.#browserContextCreationMethod = browserContextCreationMethod;
7389
+ this.#userAgent = userAgent;
7291
7390
  const apiRequestContext = browserContext.request;
7292
7391
  this.#apiContext = new CamoufoxApiContext(apiRequestContext);
7293
7392
  const currentTime = getCurrentUnixTime11();
@@ -7441,6 +7540,12 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
7441
7540
  }
7442
7541
  lsdPage = this.#lsdPages.find((p) => p.isFree());
7443
7542
  if (lsdPage) {
7543
+ if (!this.#userAgent) {
7544
+ const userAgent = await lsdPage.evaluate(() => navigator.userAgent);
7545
+ if (typeof userAgent === "string" && userAgent) {
7546
+ this.#userAgent = userAgent;
7547
+ }
7548
+ }
7444
7549
  lsdPage.use();
7445
7550
  this.#freeGettingLock();
7446
7551
  return lsdPage;
@@ -7547,6 +7652,9 @@ var CamoufoxBrowserContext = class extends EventEmitter12 {
7547
7652
  return false;
7548
7653
  }
7549
7654
  }
7655
+ userAgent() {
7656
+ return this.#userAgent;
7657
+ }
7550
7658
  _origBrowserContext() {
7551
7659
  return this.#browserContext;
7552
7660
  }
@@ -7616,7 +7724,7 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends EventEmitter13 {
7616
7724
  }
7617
7725
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : true;
7618
7726
  for (const browserContext of browserContexts) {
7619
- const lsdBrowserContext = new CamoufoxBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
7727
+ const lsdBrowserContext = new CamoufoxBrowserContext(this, browserContext, "launch", incognito, this.#proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), "", maxViewportOfNewPage);
7620
7728
  this.#lsdBrowserContexts.push(lsdBrowserContext);
7621
7729
  }
7622
7730
  browser.on("disconnected" /* BROWSER_DISCONNECTED */, () => {
@@ -7668,12 +7776,17 @@ var CamoufoxBrowser = class _CamoufoxBrowser extends EventEmitter13 {
7668
7776
  const { proxyUrl: server, username, password } = proxy;
7669
7777
  browserContextOptions.proxy = { server, username, password };
7670
7778
  }
7671
- if (options?.userAgent) {
7672
- browserContextOptions.userAgent = options.userAgent;
7779
+ let userAgent = options?.userAgent ? options.userAgent : this.#options.userAgent;
7780
+ const lsdLaunchOptions = this.#options;
7781
+ if (!userAgent && lsdLaunchOptions.headless && lsdLaunchOptions.headlessUserAgent) {
7782
+ userAgent = lsdLaunchOptions.headlessUserAgent;
7783
+ }
7784
+ if (userAgent) {
7785
+ browserContextOptions.userAgent = userAgent;
7673
7786
  }
7674
7787
  const browserContext = await this.#browser.newContext(browserContextOptions);
7675
7788
  const { maxViewportOfNewPage = this.#options.maxViewportOfNewPage } = options ? options : {};
7676
- const lsdBrowserContext = new CamoufoxBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), maxViewportOfNewPage);
7789
+ const lsdBrowserContext = new CamoufoxBrowserContext(this, browserContext, "new", true, proxy, this.#browserIdx, this.#nextBrowserContextIdx++, this.#maxPagesPerBrowserContext(), this.#maxPageFreeSeconds(), userAgent, maxViewportOfNewPage);
7677
7790
  this.#lsdBrowserContexts.push(lsdBrowserContext);
7678
7791
  return lsdBrowserContext;
7679
7792
  }
@@ -7762,11 +7875,13 @@ var LsdBrowserController = class _LsdBrowserController {
7762
7875
  }
7763
7876
  this.#puppeteer = puppeteer;
7764
7877
  this.#playwrightBrowserTypes = {
7878
+ chrome: playwright.chromium,
7765
7879
  chromium: playwright.chromium,
7766
7880
  firefox: playwright.firefox,
7767
7881
  webkit: playwright.webkit
7768
7882
  };
7769
7883
  this.#patchrightBrowserTypes = {
7884
+ chrome: playwright.chromium,
7770
7885
  chromium: patchright.chromium,
7771
7886
  firefox: patchright.firefox,
7772
7887
  webkit: patchright.webkit
@@ -7776,7 +7891,7 @@ var LsdBrowserController = class _LsdBrowserController {
7776
7891
  _LsdBrowserController.#forbidConstructor = true;
7777
7892
  }
7778
7893
  #playwrightBrowserType(browserType, connectFlag = false) {
7779
- if (browserType === "chromium") {
7894
+ if (browserType === "chrome" || browserType === "chromium") {
7780
7895
  return this.#playwrightBrowserTypes.chromium;
7781
7896
  } else if (connectFlag) {
7782
7897
  throw new Error(`playwright only can connect to chromium browser, not support ${browserType} browser`);
@@ -7789,7 +7904,7 @@ var LsdBrowserController = class _LsdBrowserController {
7789
7904
  }
7790
7905
  }
7791
7906
  #patchrightBrowserType(browserType, connectFlag = false) {
7792
- if (browserType === "chromium") {
7907
+ if (browserType === "chrome" || browserType === "chromium") {
7793
7908
  return this.#patchrightBrowserTypes.chromium;
7794
7909
  } else if (connectFlag) {
7795
7910
  throw new Error(`patchright only can connect to chromium browser, not support ${browserType} browser`);
@@ -7802,7 +7917,7 @@ var LsdBrowserController = class _LsdBrowserController {
7802
7917
  }
7803
7918
  }
7804
7919
  #puppeteerProduct(browserType) {
7805
- if (browserType === "chromium") {
7920
+ if (browserType === "chrome" || browserType === "chromium") {
7806
7921
  return "chrome";
7807
7922
  } else {
7808
7923
  throw new Error(`Invalid puppeteer product ${browserType}`);
@@ -7819,6 +7934,7 @@ var LsdBrowserController = class _LsdBrowserController {
7819
7934
  throw new Error(`BrowserControllerType ${browserControllerType} doesnot support browserType ${browserType}`);
7820
7935
  }
7821
7936
  switch (browserType) {
7937
+ case "chrome":
7822
7938
  case "chromium":
7823
7939
  case "firefox":
7824
7940
  case "webkit":
@@ -7832,6 +7948,7 @@ var LsdBrowserController = class _LsdBrowserController {
7832
7948
  throw new Error(`BrowserControllerType ${browserControllerType} doesnot support browserType ${browserType}`);
7833
7949
  }
7834
7950
  switch (browserType) {
7951
+ case "chrome":
7835
7952
  case "chromium":
7836
7953
  case "firefox":
7837
7954
  case "webkit":
@@ -7866,11 +7983,12 @@ var LsdBrowserController = class _LsdBrowserController {
7866
7983
  // incognito
7867
7984
  proxyPerBrowserContext = false,
7868
7985
  userDataDir = "",
7869
- userAgent = ""
7986
+ userAgent = "",
7987
+ headlessUserAgent = ""
7870
7988
  } = options ? options : {};
7871
7989
  let browserPid = 0;
7872
7990
  const incognito = typeof options?.incognito === "boolean" ? options.incognito : browserControllerType === "puppeteer" ? false : true;
7873
- const actOptions = { closeFreePagesIntervalSeconds, maxBrowserContextsPerBrowser, maxPagesPerBrowserContext, maxPageFreeSeconds, maxViewportOfNewPage, proxy, timeout, args, executablePath, maxWindowSize, headless, minBrowserContexts, incognito, proxyPerBrowserContext, userDataDir, userAgent };
7991
+ const actOptions = { closeFreePagesIntervalSeconds, maxBrowserContextsPerBrowser, maxPagesPerBrowserContext, maxPageFreeSeconds, maxViewportOfNewPage, proxy, timeout, args, executablePath, maxWindowSize, headless, minBrowserContexts, incognito, proxyPerBrowserContext, userDataDir, userAgent, headlessUserAgent };
7874
7992
  let idx = args.findIndex((arg) => arg.toLowerCase().startsWith("--incoginto"));
7875
7993
  if (idx >= 0) {
7876
7994
  logwarn(`##browser controller Please use options.incognito instead when launching new browser.`);
@@ -7892,6 +8010,11 @@ var LsdBrowserController = class _LsdBrowserController {
7892
8010
  args.splice(idx, 1);
7893
8011
  }
7894
8012
  let lsdBrowser;
8013
+ if (browserType === "chrome" && ["playwright", "patchright", "puppeteer"].includes(browserControllerType)) {
8014
+ if (!executablePath) {
8015
+ throw new Error("Invalid executablePath when to launch chrome");
8016
+ }
8017
+ }
7895
8018
  if (browserControllerType === "playwright") {
7896
8019
  const launchOptions = { headless, timeout };
7897
8020
  if (executablePath) {
@@ -7906,11 +8029,12 @@ var LsdBrowserController = class _LsdBrowserController {
7906
8029
  } else if (proxyPerBrowserContext && browserType === "chromium" && this.#osPlatform.startsWith("win")) {
7907
8030
  launchOptions.proxy = { server: "proxyPerBrowserContext" };
7908
8031
  }
7909
- if (browserType === "chromium") {
8032
+ if (browserType === "chrome" || browserType === "chromium") {
8033
+ if (browserType === "chrome") {
8034
+ launchOptions.channel = "chrome";
8035
+ }
7910
8036
  if (incognito) {
7911
8037
  args.push("--incognito");
7912
- } else if (userDataDir) {
7913
- args.push(`--user-data-dir=${userDataDir}`);
7914
8038
  }
7915
8039
  }
7916
8040
  if (args.length > 0) {
@@ -7947,11 +8071,12 @@ var LsdBrowserController = class _LsdBrowserController {
7947
8071
  } else if (proxyPerBrowserContext && browserType === "chromium" && this.#osPlatform.startsWith("win")) {
7948
8072
  launchOptions.proxy = { server: "proxyPerBrowserContext" };
7949
8073
  }
7950
- if (browserType === "chromium") {
8074
+ if (browserType === "chrome" || browserType === "chromium") {
8075
+ if (browserType === "chrome") {
8076
+ launchOptions.channel = "chrome";
8077
+ }
7951
8078
  if (incognito) {
7952
8079
  args.push("--incognito");
7953
- } else if (userDataDir) {
7954
- args.push(`--user-data-dir=${userDataDir}`);
7955
8080
  }
7956
8081
  }
7957
8082
  if (args.length > 0) {
@@ -7987,11 +8112,15 @@ var LsdBrowserController = class _LsdBrowserController {
7987
8112
  if (!args.includes("--no-sandbox")) {
7988
8113
  args.push("--no-sandbox");
7989
8114
  }
7990
- if (browserType === "chromium") {
8115
+ if (browserType === "chrome" || browserType === "chromium") {
8116
+ if (browserType === "chrome") {
8117
+ launchOptions.channel = "chrome";
8118
+ }
7991
8119
  if (incognito) {
7992
8120
  args.push("--incognito");
7993
- } else if (userDataDir) {
7994
- args.push(`--user-data-dir=${userDataDir}`);
8121
+ }
8122
+ if (userDataDir) {
8123
+ launchOptions.userDataDir = userDataDir;
7995
8124
  }
7996
8125
  if (proxy?.proxyUrl && proxy.proxyUrl !== "default") {
7997
8126
  args.push(`--proxy-server=${proxy.proxyUrl}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@letsscrapedata/controller",
3
- "version": "0.0.70",
3
+ "version": "0.1.0",
4
4
  "description": "Unified browser / HTML controller interfaces that support patchright, camoufox, playwright, puppeteer and cheerio",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -44,20 +44,15 @@
44
44
  "puppeteer",
45
45
  "cheerio",
46
46
  "crawler",
47
- "scraper",
48
- "apify"
47
+ "scraper"
49
48
  ],
50
49
  "dependencies": {
51
- "@letsscrapedata/utils": "^0.0.29",
50
+ "@letsscrapedata/utils": "^0.0.33",
52
51
  "camoufox-js-lsd": "^0.6.5",
53
- "cheerio": "^1.0.0",
54
- "patchright": "^1.52.5",
55
- "playwright": "^1.54.2",
56
- "playwright-extra": "^4.3.6",
57
- "puppeteer": "^24.16.0",
58
- "puppeteer-extra": "^3.3.6",
59
- "puppeteer-extra-plugin-stealth": "^2.11.2",
60
- "utils": "^0.3.1"
52
+ "cheerio": "^1.1.2",
53
+ "patchright": "^1.56.1",
54
+ "playwright": "^1.56.1",
55
+ "puppeteer": "^24.25.0"
61
56
  },
62
57
  "devDependencies": {
63
58
  "@types/cheerio": "^0.22.35",