@agent-infra/browser 0.1.1 → 0.1.4

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.
Files changed (47) hide show
  1. package/dist/base-browser.d.ts.map +1 -1
  2. package/dist/base-browser.js +36 -5
  3. package/dist/base-browser.js.map +1 -1
  4. package/dist/base-browser.mjs +32 -3
  5. package/dist/base-browser.mjs.map +1 -1
  6. package/dist/index.d.ts +0 -2
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +13 -21
  9. package/dist/index.js.map +1 -0
  10. package/dist/index.mjs +0 -1
  11. package/dist/local-browser.d.ts.map +1 -1
  12. package/dist/local-browser.js +9 -8
  13. package/dist/local-browser.js.map +1 -1
  14. package/dist/local-browser.mjs +8 -9
  15. package/dist/local-browser.mjs.map +1 -1
  16. package/dist/remote-browser.d.ts +1 -0
  17. package/dist/remote-browser.d.ts.map +1 -1
  18. package/dist/remote-browser.js +10 -5
  19. package/dist/remote-browser.js.map +1 -1
  20. package/dist/remote-browser.mjs +9 -6
  21. package/dist/remote-browser.mjs.map +1 -1
  22. package/dist/types.d.ts +1 -1
  23. package/dist/types.d.ts.map +1 -1
  24. package/dist/types.js +4 -3
  25. package/dist/types.js.map +1 -0
  26. package/package.json +19 -14
  27. package/LICENSE +0 -201
  28. package/dist/browser-finder/chrome-paths.d.ts +0 -10
  29. package/dist/browser-finder/chrome-paths.d.ts.map +0 -1
  30. package/dist/browser-finder/chrome-paths.js +0 -160
  31. package/dist/browser-finder/chrome-paths.js.map +0 -1
  32. package/dist/browser-finder/chrome-paths.mjs +0 -118
  33. package/dist/browser-finder/chrome-paths.mjs.map +0 -1
  34. package/dist/browser-finder/firefox-paths.d.ts +0 -2
  35. package/dist/browser-finder/firefox-paths.d.ts.map +0 -1
  36. package/dist/browser-finder/firefox-paths.js +0 -132
  37. package/dist/browser-finder/firefox-paths.js.map +0 -1
  38. package/dist/browser-finder/firefox-paths.mjs +0 -90
  39. package/dist/browser-finder/firefox-paths.mjs.map +0 -1
  40. package/dist/browser-finder/index.d.ts +0 -15
  41. package/dist/browser-finder/index.d.ts.map +0 -1
  42. package/dist/browser-finder/index.js +0 -151
  43. package/dist/browser-finder/index.js.map +0 -1
  44. package/dist/browser-finder/index.mjs +0 -119
  45. package/dist/browser-finder/index.mjs.map +0 -1
  46. package/dist/browser-finder/index.test.d.ts +0 -2
  47. package/dist/browser-finder/index.test.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"base-browser.d.ts","sourceRoot":"","sources":["../src/base-browser.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAiB,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,aAAa,EACb,IAAI,EACL,MAAM,SAAS,CAAC;AAEjB;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,8BAAsB,WAAY,YAAW,gBAAgB;IAC3D;;;OAGG;IACH,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,GAAG,IAAI,CAAQ;IAEnD;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,SAAS,CAAC,UAAU,EAAE,IAAI,GAAG,IAAI,CAAQ;IAEzC;;;OAGG;gBACS,OAAO,CAAC,EAAE,kBAAkB;IAKxC;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAiBxC;;;;;OAKG;IACH,UAAU,IAAI,SAAS,CAAC,OAAO;IAO/B;;;;OAIG;cACa,iBAAiB;IAwBjC;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAEvD;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAY5B;;;;;;;;OAQG;IACG,iBAAiB,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,EACxC,OAAO,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,GACtC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAkCpB;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAUjC;;;;;OAKG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAuCrC"}
1
+ {"version":3,"file":"base-browser.d.ts","sourceRoot":"","sources":["../src/base-browser.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAiB,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,aAAa,EACb,IAAI,EACL,MAAM,SAAS,CAAC;AAEjB;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,8BAAsB,WAAY,YAAW,gBAAgB;IAC3D;;;OAGG;IACH,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,GAAG,IAAI,CAAQ;IAEnD;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,SAAS,CAAC,UAAU,EAAE,IAAI,GAAG,IAAI,CAAQ;IAEzC;;;OAGG;gBACS,OAAO,CAAC,EAAE,kBAAkB;IAKxC;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAiBxC;;;;;OAKG;IACH,UAAU,IAAI,SAAS,CAAC,OAAO;IAO/B;;;;OAIG;cACa,iBAAiB;IAwDjC;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAEvD;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAY5B;;;;;;;;OAQG;IACG,iBAAiB,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,EACxC,OAAO,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,GACtC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAkCpB;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAUjC;;;;;OAKG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CA+CrC"}
@@ -59,8 +59,10 @@ class BaseBrowser {
59
59
  return this.browser;
60
60
  }
61
61
  async setupPageListener() {
62
+ this.logger.info('setupPageListener()');
62
63
  if (!this.browser) return;
63
64
  this.browser.on('targetcreated', async (target)=>{
65
+ this.logger.info('PageListener: targetcreated, type:', target.type());
64
66
  const page = await target.page();
65
67
  if (page) {
66
68
  this.logger.info('New page created:', await page.url());
@@ -73,12 +75,36 @@ class BaseBrowser {
73
75
  });
74
76
  }
75
77
  });
78
+ this.browser.on('targetchanged', async (target)=>{
79
+ this.logger.info('PageListener: targetchanged:', target.type());
80
+ try {
81
+ const changedPage = await target.page();
82
+ if (changedPage) {
83
+ const currentUrl = await changedPage.url();
84
+ this.logger.info('The target changed', currentUrl);
85
+ if (currentUrl && 'about:blank' !== currentUrl) this.activePage = changedPage;
86
+ }
87
+ } catch (error) {
88
+ this.logger.error('error on targetchanged:', error);
89
+ }
90
+ });
91
+ this.browser.on('targetdestroyed', async (target)=>{
92
+ this.logger.info('PageListener: targetdestroyed:', target.type());
93
+ if ('page' === target.type()) try {
94
+ var _this_browser;
95
+ const pages = await (null == (_this_browser = this.browser) ? void 0 : _this_browser.pages());
96
+ this.logger.info('Destoryed, left pages:', null == pages ? void 0 : pages.length);
97
+ this.activePage = null;
98
+ } catch (error) {
99
+ this.logger.error('error on targetdestroyed:', error);
100
+ }
101
+ });
76
102
  }
77
103
  async close() {
78
104
  this.logger.info('Closing browser');
79
105
  try {
80
106
  var _this_browser;
81
- await (null === (_this_browser = this.browser) || void 0 === _this_browser ? void 0 : _this_browser.close());
107
+ await (null == (_this_browser = this.browser) ? void 0 : _this_browser.close());
82
108
  this.browser = null;
83
109
  this.logger.success('Browser closed successfully');
84
110
  } catch (error) {
@@ -116,6 +142,7 @@ class BaseBrowser {
116
142
  return page;
117
143
  }
118
144
  async getActivePage() {
145
+ this.logger.info('getActivePage: current activePage', this.activePage);
119
146
  if (!this.browser) throw new Error('Browser not launched');
120
147
  if (this.activePage) try {
121
148
  await this.activePage.evaluate(()=>document.readyState);
@@ -125,12 +152,14 @@ class BaseBrowser {
125
152
  this.activePage = null;
126
153
  }
127
154
  const pages = await this.browser.pages();
155
+ this.logger.info('getActivePage: all of pages lenght:', pages.length);
128
156
  if (0 === pages.length) {
129
157
  this.activePage = await this.createPage();
130
158
  return this.activePage;
131
159
  }
132
160
  for(let i = pages.length - 1; i >= 0; i--){
133
161
  const page = pages[i];
162
+ this.logger.info('getActivePage: page:', await page.title(), await page.url());
134
163
  try {
135
164
  await page.evaluate(()=>document.readyState);
136
165
  this.activePage = page;
@@ -145,13 +174,15 @@ class BaseBrowser {
145
174
  _define_property(this, "browser", null);
146
175
  _define_property(this, "logger", void 0);
147
176
  _define_property(this, "activePage", null);
148
- this.logger = (null == options ? void 0 : options.logger) ?? logger_namespaceObject.defaultLogger;
177
+ this.logger = ((null == options ? void 0 : options.logger) ?? logger_namespaceObject.defaultLogger).spawn('[BaseBrowser]');
149
178
  this.logger.info('Browser Options:', options);
150
179
  }
151
180
  }
152
- var __webpack_export_target__ = exports;
153
- for(var __webpack_i__ in __webpack_exports__)__webpack_export_target__[__webpack_i__] = __webpack_exports__[__webpack_i__];
154
- if (__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_target__, '__esModule', {
181
+ exports.BaseBrowser = __webpack_exports__.BaseBrowser;
182
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
183
+ "BaseBrowser"
184
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
185
+ Object.defineProperty(exports, '__esModule', {
155
186
  value: true
156
187
  });
157
188
 
@@ -1 +1 @@
1
- {"version":3,"file":"base-browser.js","sources":["webpack://@agent-infra/browser/./src/base-browser.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport * as puppeteer from 'puppeteer-core';\nimport { Logger, defaultLogger } from '@agent-infra/logger';\nimport {\n BrowserInterface,\n EvaluateOnNewPageOptions,\n LaunchOptions,\n Page,\n} from './types';\n\n/**\n * Configuration options for the BaseBrowser class\n * @interface BaseBrowserOptions\n * @property {Logger} [logger] - Custom logger instance to use for browser logging\n */\nexport interface BaseBrowserOptions {\n logger?: Logger;\n}\n\n/**\n * Abstract base class that implements common browser automation functionality\n * Provides a foundation for specific browser implementations with shared capabilities\n * @abstract\n * @implements {BrowserInterface}\n */\nexport abstract class BaseBrowser implements BrowserInterface {\n /**\n * The underlying Puppeteer browser instance\n * @protected\n */\n protected browser: puppeteer.Browser | null = null;\n\n /**\n * Logger instance for browser-related logging\n * @protected\n */\n protected logger: Logger;\n\n /**\n * Reference to the currently active browser page\n * @protected\n */\n protected activePage: Page | null = null;\n\n /**\n * Creates an instance of BaseBrowser\n * @param {BaseBrowserOptions} [options] - Configuration options\n */\n constructor(options?: BaseBrowserOptions) {\n this.logger = options?.logger ?? defaultLogger;\n this.logger.info('Browser Options:', options);\n }\n\n /**\n * Check if the browser instance is active and responding\n * @returns {Promise<boolean>} True if browser is active, false otherwise\n */\n async isBrowserAlive(): Promise<boolean> {\n if (!this.browser) {\n return false;\n }\n\n try {\n // Try to get browser version to check if it's still responding\n const version = await this.browser.version();\n this.logger.info('Browser version:', version);\n return true;\n } catch (error) {\n this.logger.warn('Browser instance is no longer active:', error);\n this.browser = null;\n return false;\n }\n }\n\n /**\n * Get the underlying Puppeteer browser instance\n * @throws Error if browser is not launched\n\n * @returns {puppeteer.Browser} Puppeteer browser instance\n */\n getBrowser(): puppeteer.Browser {\n if (!this.browser) {\n throw new Error('Browser not launched');\n }\n return this.browser;\n }\n\n /**\n * Sets up listeners for browser page events\n * Tracks page creation and updates active page reference\n * @protected\n */\n protected async setupPageListener() {\n if (!this.browser) return;\n\n this.browser.on('targetcreated', async (target) => {\n const page = await target.page();\n if (page) {\n this.logger.info('New page created:', await page.url());\n this.activePage = page;\n\n page.once('close', () => {\n if (this.activePage === page) {\n this.activePage = null;\n }\n });\n\n page.once('error', () => {\n if (this.activePage === page) {\n this.activePage = null;\n }\n });\n }\n });\n }\n\n /**\n * Launches the browser with specified options\n * @abstract\n * @param {LaunchOptions} [options] - Browser launch configuration options\n * @returns {Promise<void>} Promise that resolves when browser is launched\n */\n abstract launch(options?: LaunchOptions): Promise<void>;\n\n /**\n * Closes the browser instance and cleans up resources\n * @returns {Promise<void>} Promise that resolves when browser is closed\n * @throws {Error} If browser fails to close properly\n */\n async close(): Promise<void> {\n this.logger.info('Closing browser');\n try {\n await this.browser?.close();\n this.browser = null;\n this.logger.success('Browser closed successfully');\n } catch (error) {\n this.logger.error('Failed to close browser:', error);\n throw error;\n }\n }\n\n /**\n * Creates a new page, navigates to the specified URL, executes a function in the page context, and returns the result\n * This method is inspired and modified from https://github.com/egoist/local-web-search/blob/04608ed09aa103e2fff6402c72ca12edfb692d19/src/browser.ts#L74\n * @template T - Type of parameters passed to the page function\n * @template R - Return type of the page function\n * @param {EvaluateOnNewPageOptions<T, R>} options - Configuration options for the page evaluation\n * @returns {Promise<R | null>} Promise resolving to the result of the page function or null\n * @throws {Error} If page creation or evaluation fails\n */\n async evaluateOnNewPage<T extends any[], R>(\n options: EvaluateOnNewPageOptions<T, R>,\n ): Promise<R | null> {\n const {\n url,\n pageFunction,\n pageFunctionParams,\n beforePageLoad,\n afterPageLoad,\n beforeSendResult,\n waitForOptions,\n } = options;\n const page = await this.browser!.newPage();\n try {\n await beforePageLoad?.(page);\n await page.goto(url, {\n waitUntil: 'networkidle2',\n ...waitForOptions,\n });\n await afterPageLoad?.(page);\n const _window = await page.evaluateHandle(() => window);\n const result = await page.evaluate(\n pageFunction,\n _window,\n ...pageFunctionParams,\n );\n await beforeSendResult?.(page, result);\n await _window.dispose();\n await page.close();\n return result;\n } catch (error) {\n await page.close();\n throw error;\n }\n }\n\n /**\n * Creates a new browser page\n * @returns {Promise<Page>} Promise resolving to the newly created page\n * @throws {Error} If browser is not launched or page creation fails\n */\n async createPage(): Promise<Page> {\n if (!this.browser) {\n this.logger.error('No active browser');\n throw new Error('Browser not launched');\n }\n\n const page = await this.browser.newPage();\n return page;\n }\n\n /**\n * Gets the currently active page or finds an active page if none is currently tracked\n * If no active pages exist, creates a new page\n * @returns {Promise<Page>} Promise resolving to the active page\n * @throws {Error} If browser is not launched or no active page can be found/created\n */\n async getActivePage(): Promise<Page> {\n if (!this.browser) {\n throw new Error('Browser not launched');\n }\n\n // If activePage exists and is still available, return directly\n if (this.activePage) {\n try {\n // Verify that the page is still available\n await this.activePage.evaluate(() => document.readyState);\n return this.activePage;\n } catch (e) {\n this.logger.warn('Active page no longer available:', e);\n this.activePage = null;\n }\n }\n\n // Get all pages and find the last active page\n const pages = await this.browser.pages();\n\n if (pages.length === 0) {\n this.activePage = await this.createPage();\n return this.activePage;\n }\n\n // Find the last responding page\n for (let i = pages.length - 1; i >= 0; i--) {\n const page = pages[i];\n try {\n await page.evaluate(() => document.readyState);\n this.activePage = page;\n return page;\n } catch (e) {\n continue;\n }\n }\n\n throw new Error('No active page found');\n }\n}\n"],"names":["BaseBrowser","version","error","Error","target","page","_this_browser","options","url","pageFunction","pageFunctionParams","beforePageLoad","afterPageLoad","beforeSendResult","waitForOptions","_window","window","result","document","e","pages","i","defaultLogger"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIC;;;;;;;;;;AAyBM,MAAeA;IAgCpB,MAAM,iBAAmC;QACvC,IAAI,CAAC,IAAI,CAAC,OAAO,EACf,OAAO;QAGT,IAAI;YAEF,MAAMC,UAAU,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO;YAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoBA;YACrC,OAAO;QACT,EAAE,OAAOC,OAAO;YACd,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yCAAyCA;YAC1D,IAAI,CAAC,OAAO,GAAG;YACf,OAAO;QACT;IACF;IAQA,aAAgC;QAC9B,IAAI,CAAC,IAAI,CAAC,OAAO,EACf,MAAM,IAAIC,MAAM;QAElB,OAAO,IAAI,CAAC,OAAO;IACrB;IAOA,MAAgB,oBAAoB;QAClC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;QAEnB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,iBAAiB,OAAOC;YACtC,MAAMC,OAAO,MAAMD,OAAO,IAAI;YAC9B,IAAIC,MAAM;gBACR,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,MAAMA,KAAK,GAAG;gBACpD,IAAI,CAAC,UAAU,GAAGA;gBAElBA,KAAK,IAAI,CAAC,SAAS;oBACjB,IAAI,IAAI,CAAC,UAAU,KAAKA,MACtB,IAAI,CAAC,UAAU,GAAG;gBAEtB;gBAEAA,KAAK,IAAI,CAAC,SAAS;oBACjB,IAAI,IAAI,CAAC,UAAU,KAAKA,MACtB,IAAI,CAAC,UAAU,GAAG;gBAEtB;YACF;QACF;IACF;IAeA,MAAM,QAAuB;QAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QACjB,IAAI;gBACIC;YAAN,OAAkB,SAAZA,CAAAA,gBAAAA,IAAI,CAAC,OAAO,AAAD,KAAXA,AAAAA,KAAAA,MAAAA,gBAAAA,KAAAA,IAAAA,cAAc,KAAK,EAAC;YAC1B,IAAI,CAAC,OAAO,GAAG;YACf,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QACtB,EAAE,OAAOJ,OAAO;YACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4BA;YAC9C,MAAMA;QACR;IACF;IAWA,MAAM,kBACJK,OAAuC,EACpB;QACnB,MAAM,EACJC,GAAG,EACHC,YAAY,EACZC,kBAAkB,EAClBC,cAAc,EACdC,aAAa,EACbC,gBAAgB,EAChBC,cAAc,EACf,GAAGP;QACJ,MAAMF,OAAO,MAAM,IAAI,CAAC,OAAO,CAAE,OAAO;QACxC,IAAI;YACF,MAAMM,CAAAA,QAAAA,iBAAAA,KAAAA,IAAAA,eAAiBN,KAAI;YAC3B,MAAMA,KAAK,IAAI,CAACG,KAAK;gBACnB,WAAW;gBACX,GAAGM,cAAc;YACnB;YACA,MAAMF,CAAAA,QAAAA,gBAAAA,KAAAA,IAAAA,cAAgBP,KAAI;YAC1B,MAAMU,UAAU,MAAMV,KAAK,cAAc,CAAC,IAAMW;YAChD,MAAMC,SAAS,MAAMZ,KAAK,QAAQ,CAChCI,cACAM,YACGL;YAEL,MAAMG,CAAAA,QAAAA,mBAAAA,KAAAA,IAAAA,iBAAmBR,MAAMY,OAAM;YACrC,MAAMF,QAAQ,OAAO;YACrB,MAAMV,KAAK,KAAK;YAChB,OAAOY;QACT,EAAE,OAAOf,OAAO;YACd,MAAMG,KAAK,KAAK;YAChB,MAAMH;QACR;IACF;IAOA,MAAM,aAA4B;QAChC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YAClB,MAAM,IAAIC,MAAM;QAClB;QAEA,MAAME,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO;QACvC,OAAOA;IACT;IAQA,MAAM,gBAA+B;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO,EACf,MAAM,IAAIF,MAAM;QAIlB,IAAI,IAAI,CAAC,UAAU,EACjB,IAAI;YAEF,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAMe,SAAS,UAAU;YACxD,OAAO,IAAI,CAAC,UAAU;QACxB,EAAE,OAAOC,GAAG;YACV,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoCA;YACrD,IAAI,CAAC,UAAU,GAAG;QACpB;QAIF,MAAMC,QAAQ,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK;QAEtC,IAAIA,AAAiB,MAAjBA,MAAM,MAAM,EAAQ;YACtB,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU;YACvC,OAAO,IAAI,CAAC,UAAU;QACxB;QAGA,IAAK,IAAIC,IAAID,MAAM,MAAM,GAAG,GAAGC,KAAK,GAAGA,IAAK;YAC1C,MAAMhB,OAAOe,KAAK,CAACC,EAAE;YACrB,IAAI;gBACF,MAAMhB,KAAK,QAAQ,CAAC,IAAMa,SAAS,UAAU;gBAC7C,IAAI,CAAC,UAAU,GAAGb;gBAClB,OAAOA;YACT,EAAE,OAAOc,GAAG;gBACV;YACF;QACF;QAEA,MAAM,IAAIhB,MAAM;IAClB;IArMA,YAAYI,OAA4B,CAAE;QAlB1C,uBAAU,WAAoC;QAM9C,uBAAU,UAAV;QAMA,uBAAU,cAA0B;QAOlC,IAAI,CAAC,MAAM,GAAGA,AAAAA,CAAAA,QAAAA,UAAAA,KAAAA,IAAAA,QAAS,MAAM,AAAD,KAAKe,uBAAAA,aAAaA;QAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoBf;IACvC;AAmMF"}
1
+ {"version":3,"file":"base-browser.js","sources":["webpack://@agent-infra/browser/webpack/runtime/define_property_getters","webpack://@agent-infra/browser/webpack/runtime/has_own_property","webpack://@agent-infra/browser/webpack/runtime/make_namespace_object","webpack://@agent-infra/browser/./src/base-browser.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/* eslint-disable @typescript-eslint/no-explicit-any */\n/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport * as puppeteer from 'puppeteer-core';\nimport { Logger, defaultLogger } from '@agent-infra/logger';\nimport {\n BrowserInterface,\n EvaluateOnNewPageOptions,\n LaunchOptions,\n Page,\n} from './types';\n\n/**\n * Configuration options for the BaseBrowser class\n * @interface BaseBrowserOptions\n * @property {Logger} [logger] - Custom logger instance to use for browser logging\n */\nexport interface BaseBrowserOptions {\n logger?: Logger;\n}\n\n/**\n * Abstract base class that implements common browser automation functionality\n * Provides a foundation for specific browser implementations with shared capabilities\n * @abstract\n * @implements {BrowserInterface}\n */\nexport abstract class BaseBrowser implements BrowserInterface {\n /**\n * The underlying Puppeteer browser instance\n * @protected\n */\n protected browser: puppeteer.Browser | null = null;\n\n /**\n * Logger instance for browser-related logging\n * @protected\n */\n protected logger: Logger;\n\n /**\n * Reference to the currently active browser page\n * @protected\n */\n protected activePage: Page | null = null;\n\n /**\n * Creates an instance of BaseBrowser\n * @param {BaseBrowserOptions} [options] - Configuration options\n */\n constructor(options?: BaseBrowserOptions) {\n this.logger = (options?.logger ?? defaultLogger).spawn('[BaseBrowser]');\n this.logger.info('Browser Options:', options);\n }\n\n /**\n * Check if the browser instance is active and responding\n * @returns {Promise<boolean>} True if browser is active, false otherwise\n */\n async isBrowserAlive(): Promise<boolean> {\n if (!this.browser) {\n return false;\n }\n\n try {\n // Try to get browser version to check if it's still responding\n const version = await this.browser.version();\n this.logger.info('Browser version:', version);\n return true;\n } catch (error) {\n this.logger.warn('Browser instance is no longer active:', error);\n this.browser = null;\n return false;\n }\n }\n\n /**\n * Get the underlying Puppeteer browser instance\n * @throws Error if browser is not launched\n\n * @returns {puppeteer.Browser} Puppeteer browser instance\n */\n getBrowser(): puppeteer.Browser {\n if (!this.browser) {\n throw new Error('Browser not launched');\n }\n return this.browser;\n }\n\n /**\n * Sets up listeners for browser page events\n * Tracks page creation and updates active page reference\n * @protected\n */\n protected async setupPageListener() {\n this.logger.info('setupPageListener()');\n if (!this.browser) return;\n\n this.browser.on('targetcreated', async (target) => {\n this.logger.info('PageListener: targetcreated, type:', target.type());\n\n const page = await target.page();\n if (page) {\n this.logger.info('New page created:', await page.url());\n this.activePage = page;\n\n page.once('close', () => {\n if (this.activePage === page) {\n this.activePage = null;\n }\n });\n\n page.once('error', () => {\n if (this.activePage === page) {\n this.activePage = null;\n }\n });\n }\n });\n\n this.browser.on('targetchanged', async (target: any) => {\n this.logger.info('PageListener: targetchanged:', target.type());\n try {\n const changedPage = await target.page();\n if (changedPage) {\n const currentUrl = await changedPage.url();\n this.logger.info('The target changed', currentUrl);\n if (currentUrl && currentUrl !== 'about:blank') {\n this.activePage = changedPage;\n }\n }\n } catch (error) {\n this.logger.error('error on targetchanged:', error);\n }\n });\n\n this.browser.on('targetdestroyed', async (target: any) => {\n this.logger.info('PageListener: targetdestroyed:', target.type());\n if (target.type() === 'page') {\n try {\n const pages = await this.browser?.pages();\n this.logger.info('Destoryed, left pages:', pages?.length);\n this.activePage = null;\n } catch (error) {\n this.logger.error('error on targetdestroyed:', error);\n }\n }\n });\n }\n\n /**\n * Launches the browser with specified options\n * @abstract\n * @param {LaunchOptions} [options] - Browser launch configuration options\n * @returns {Promise<void>} Promise that resolves when browser is launched\n */\n abstract launch(options?: LaunchOptions): Promise<void>;\n\n /**\n * Closes the browser instance and cleans up resources\n * @returns {Promise<void>} Promise that resolves when browser is closed\n * @throws {Error} If browser fails to close properly\n */\n async close(): Promise<void> {\n this.logger.info('Closing browser');\n try {\n await this.browser?.close();\n this.browser = null;\n this.logger.success('Browser closed successfully');\n } catch (error) {\n this.logger.error('Failed to close browser:', error);\n throw error;\n }\n }\n\n /**\n * Creates a new page, navigates to the specified URL, executes a function in the page context, and returns the result\n * This method is inspired and modified from https://github.com/egoist/local-web-search/blob/04608ed09aa103e2fff6402c72ca12edfb692d19/src/browser.ts#L74\n * @template T - Type of parameters passed to the page function\n * @template R - Return type of the page function\n * @param {EvaluateOnNewPageOptions<T, R>} options - Configuration options for the page evaluation\n * @returns {Promise<R | null>} Promise resolving to the result of the page function or null\n * @throws {Error} If page creation or evaluation fails\n */\n async evaluateOnNewPage<T extends any[], R>(\n options: EvaluateOnNewPageOptions<T, R>,\n ): Promise<R | null> {\n const {\n url,\n pageFunction,\n pageFunctionParams,\n beforePageLoad,\n afterPageLoad,\n beforeSendResult,\n waitForOptions,\n } = options;\n const page = await this.browser!.newPage();\n try {\n await beforePageLoad?.(page);\n await page.goto(url, {\n waitUntil: 'networkidle2',\n ...waitForOptions,\n });\n await afterPageLoad?.(page);\n const _window = await page.evaluateHandle(() => window);\n const result = await page.evaluate(\n pageFunction,\n _window,\n ...pageFunctionParams,\n );\n await beforeSendResult?.(page, result);\n await _window.dispose();\n await page.close();\n return result;\n } catch (error) {\n await page.close();\n throw error;\n }\n }\n\n /**\n * Creates a new browser page\n * @returns {Promise<Page>} Promise resolving to the newly created page\n * @throws {Error} If browser is not launched or page creation fails\n */\n async createPage(): Promise<Page> {\n if (!this.browser) {\n this.logger.error('No active browser');\n throw new Error('Browser not launched');\n }\n\n const page = await this.browser.newPage();\n return page;\n }\n\n /**\n * Gets the currently active page or finds an active page if none is currently tracked\n * If no active pages exist, creates a new page\n * @returns {Promise<Page>} Promise resolving to the active page\n * @throws {Error} If browser is not launched or no active page can be found/created\n */\n async getActivePage(): Promise<Page> {\n this.logger.info('getActivePage: current activePage', this.activePage);\n\n if (!this.browser) {\n throw new Error('Browser not launched');\n }\n\n // If activePage exists and is still available, return directly\n if (this.activePage) {\n try {\n // Verify that the page is still available\n await this.activePage.evaluate(() => document.readyState);\n return this.activePage;\n } catch (e) {\n this.logger.warn('Active page no longer available:', e);\n this.activePage = null;\n }\n }\n\n // Get all pages and find the last active page\n const pages = await this.browser.pages();\n this.logger.info('getActivePage: all of pages lenght:', pages.length);\n\n if (pages.length === 0) {\n this.activePage = await this.createPage();\n return this.activePage;\n }\n\n // Find the last responding page\n for (let i = pages.length - 1; i >= 0; i--) {\n const page = pages[i];\n this.logger.info(\n 'getActivePage: page:',\n await page.title(),\n await page.url(),\n );\n try {\n await page.evaluate(() => document.readyState);\n this.activePage = page;\n return page;\n } catch (e) {\n continue;\n }\n }\n\n throw new Error('No active page found');\n }\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","BaseBrowser","version","error","Error","target","page","changedPage","currentUrl","_this_browser","pages","options","url","pageFunction","pageFunctionParams","beforePageLoad","afterPageLoad","beforeSendResult","waitForOptions","_window","window","result","document","e","i","defaultLogger"],"mappings":";;;;;;;IAAAA,oBAAoB,CAAC,GAAG,CAAC,UAASC;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,CAACI,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFL,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;ACFC;;;;;;;;;;AAyBM,MAAeI;IAgCpB,MAAM,iBAAmC;QACvC,IAAI,CAAC,IAAI,CAAC,OAAO,EACf,OAAO;QAGT,IAAI;YAEF,MAAMC,UAAU,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO;YAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoBA;YACrC,OAAO;QACT,EAAE,OAAOC,OAAO;YACd,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yCAAyCA;YAC1D,IAAI,CAAC,OAAO,GAAG;YACf,OAAO;QACT;IACF;IAQA,aAAgC;QAC9B,IAAI,CAAC,IAAI,CAAC,OAAO,EACf,MAAM,IAAIC,MAAM;QAElB,OAAO,IAAI,CAAC,OAAO;IACrB;IAOA,MAAgB,oBAAoB;QAClC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;QAEnB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,iBAAiB,OAAOC;YACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsCA,OAAO,IAAI;YAElE,MAAMC,OAAO,MAAMD,OAAO,IAAI;YAC9B,IAAIC,MAAM;gBACR,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,MAAMA,KAAK,GAAG;gBACpD,IAAI,CAAC,UAAU,GAAGA;gBAElBA,KAAK,IAAI,CAAC,SAAS;oBACjB,IAAI,IAAI,CAAC,UAAU,KAAKA,MACtB,IAAI,CAAC,UAAU,GAAG;gBAEtB;gBAEAA,KAAK,IAAI,CAAC,SAAS;oBACjB,IAAI,IAAI,CAAC,UAAU,KAAKA,MACtB,IAAI,CAAC,UAAU,GAAG;gBAEtB;YACF;QACF;QAEA,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,iBAAiB,OAAOD;YACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgCA,OAAO,IAAI;YAC5D,IAAI;gBACF,MAAME,cAAc,MAAMF,OAAO,IAAI;gBACrC,IAAIE,aAAa;oBACf,MAAMC,aAAa,MAAMD,YAAY,GAAG;oBACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsBC;oBACvC,IAAIA,cAAcA,AAAe,kBAAfA,YAChB,IAAI,CAAC,UAAU,GAAGD;gBAEtB;YACF,EAAE,OAAOJ,OAAO;gBACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2BA;YAC/C;QACF;QAEA,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,mBAAmB,OAAOE;YACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkCA,OAAO,IAAI;YAC9D,IAAIA,AAAkB,WAAlBA,OAAO,IAAI,IACb,IAAI;oBACkBI;gBAApB,MAAMC,QAAQ,eAAMD,CAAAA,gBAAAA,IAAI,CAAC,OAAO,AAAD,IAAXA,KAAAA,IAAAA,cAAc,KAAK,EAAC;gBACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0BC,QAAAA,QAAAA,KAAAA,IAAAA,MAAO,MAAM;gBACxD,IAAI,CAAC,UAAU,GAAG;YACpB,EAAE,OAAOP,OAAO;gBACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6BA;YACjD;QAEJ;IACF;IAeA,MAAM,QAAuB;QAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QACjB,IAAI;gBACIM;YAAN,eAAMA,CAAAA,gBAAAA,IAAI,CAAC,OAAO,AAAD,IAAXA,KAAAA,IAAAA,cAAc,KAAK,EAAC;YAC1B,IAAI,CAAC,OAAO,GAAG;YACf,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QACtB,EAAE,OAAON,OAAO;YACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4BA;YAC9C,MAAMA;QACR;IACF;IAWA,MAAM,kBACJQ,OAAuC,EACpB;QACnB,MAAM,EACJC,GAAG,EACHC,YAAY,EACZC,kBAAkB,EAClBC,cAAc,EACdC,aAAa,EACbC,gBAAgB,EAChBC,cAAc,EACf,GAAGP;QACJ,MAAML,OAAO,MAAM,IAAI,CAAC,OAAO,CAAE,OAAO;QACxC,IAAI;YACF,MAAMS,CAAAA,QAAAA,iBAAAA,KAAAA,IAAAA,eAAiBT,KAAI;YAC3B,MAAMA,KAAK,IAAI,CAACM,KAAK;gBACnB,WAAW;gBACX,GAAGM,cAAc;YACnB;YACA,MAAMF,CAAAA,QAAAA,gBAAAA,KAAAA,IAAAA,cAAgBV,KAAI;YAC1B,MAAMa,UAAU,MAAMb,KAAK,cAAc,CAAC,IAAMc;YAChD,MAAMC,SAAS,MAAMf,KAAK,QAAQ,CAChCO,cACAM,YACGL;YAEL,MAAMG,CAAAA,QAAAA,mBAAAA,KAAAA,IAAAA,iBAAmBX,MAAMe,OAAM;YACrC,MAAMF,QAAQ,OAAO;YACrB,MAAMb,KAAK,KAAK;YAChB,OAAOe;QACT,EAAE,OAAOlB,OAAO;YACd,MAAMG,KAAK,KAAK;YAChB,MAAMH;QACR;IACF;IAOA,MAAM,aAA4B;QAChC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YAClB,MAAM,IAAIC,MAAM;QAClB;QAEA,MAAME,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO;QACvC,OAAOA;IACT;IAQA,MAAM,gBAA+B;QACnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qCAAqC,IAAI,CAAC,UAAU;QAErE,IAAI,CAAC,IAAI,CAAC,OAAO,EACf,MAAM,IAAIF,MAAM;QAIlB,IAAI,IAAI,CAAC,UAAU,EACjB,IAAI;YAEF,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAMkB,SAAS,UAAU;YACxD,OAAO,IAAI,CAAC,UAAU;QACxB,EAAE,OAAOC,GAAG;YACV,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoCA;YACrD,IAAI,CAAC,UAAU,GAAG;QACpB;QAIF,MAAMb,QAAQ,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK;QACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uCAAuCA,MAAM,MAAM;QAEpE,IAAIA,AAAiB,MAAjBA,MAAM,MAAM,EAAQ;YACtB,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU;YACvC,OAAO,IAAI,CAAC,UAAU;QACxB;QAGA,IAAK,IAAIc,IAAId,MAAM,MAAM,GAAG,GAAGc,KAAK,GAAGA,IAAK;YAC1C,MAAMlB,OAAOI,KAAK,CAACc,EAAE;YACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,wBACA,MAAMlB,KAAK,KAAK,IAChB,MAAMA,KAAK,GAAG;YAEhB,IAAI;gBACF,MAAMA,KAAK,QAAQ,CAAC,IAAMgB,SAAS,UAAU;gBAC7C,IAAI,CAAC,UAAU,GAAGhB;gBAClB,OAAOA;YACT,EAAE,OAAOiB,GAAG;gBACV;YACF;QACF;QAEA,MAAM,IAAInB,MAAM;IAClB;IA7OA,YAAYO,OAA4B,CAAE;QAlB1C,uBAAU,WAAoC;QAM9C,uBAAU,UAAV;QAMA,uBAAU,cAA0B;QAOlC,IAAI,CAAC,MAAM,GAAIA,AAAAA,CAAAA,CAAAA,QAAAA,UAAAA,KAAAA,IAAAA,QAAS,MAAM,AAAD,KAAKc,uBAAAA,aAAY,AAAZA,EAAe,KAAK,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoBd;IACvC;AA2OF"}
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) 2025 Bytedance, Inc. and its affiliates.
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */
5
- import * as __WEBPACK_EXTERNAL_MODULE__agent_infra_logger_ddae3da2__ from "@agent-infra/logger";
5
+ import { defaultLogger } from "@agent-infra/logger";
6
6
  function _define_property(obj, key, value) {
7
7
  if (key in obj) Object.defineProperty(obj, key, {
8
8
  value: value,
@@ -31,8 +31,10 @@ class BaseBrowser {
31
31
  return this.browser;
32
32
  }
33
33
  async setupPageListener() {
34
+ this.logger.info('setupPageListener()');
34
35
  if (!this.browser) return;
35
36
  this.browser.on('targetcreated', async (target)=>{
37
+ this.logger.info('PageListener: targetcreated, type:', target.type());
36
38
  const page = await target.page();
37
39
  if (page) {
38
40
  this.logger.info('New page created:', await page.url());
@@ -45,12 +47,36 @@ class BaseBrowser {
45
47
  });
46
48
  }
47
49
  });
50
+ this.browser.on('targetchanged', async (target)=>{
51
+ this.logger.info('PageListener: targetchanged:', target.type());
52
+ try {
53
+ const changedPage = await target.page();
54
+ if (changedPage) {
55
+ const currentUrl = await changedPage.url();
56
+ this.logger.info('The target changed', currentUrl);
57
+ if (currentUrl && 'about:blank' !== currentUrl) this.activePage = changedPage;
58
+ }
59
+ } catch (error) {
60
+ this.logger.error('error on targetchanged:', error);
61
+ }
62
+ });
63
+ this.browser.on('targetdestroyed', async (target)=>{
64
+ this.logger.info('PageListener: targetdestroyed:', target.type());
65
+ if ('page' === target.type()) try {
66
+ var _this_browser;
67
+ const pages = await (null == (_this_browser = this.browser) ? void 0 : _this_browser.pages());
68
+ this.logger.info('Destoryed, left pages:', null == pages ? void 0 : pages.length);
69
+ this.activePage = null;
70
+ } catch (error) {
71
+ this.logger.error('error on targetdestroyed:', error);
72
+ }
73
+ });
48
74
  }
49
75
  async close() {
50
76
  this.logger.info('Closing browser');
51
77
  try {
52
78
  var _this_browser;
53
- await (null === (_this_browser = this.browser) || void 0 === _this_browser ? void 0 : _this_browser.close());
79
+ await (null == (_this_browser = this.browser) ? void 0 : _this_browser.close());
54
80
  this.browser = null;
55
81
  this.logger.success('Browser closed successfully');
56
82
  } catch (error) {
@@ -88,6 +114,7 @@ class BaseBrowser {
88
114
  return page;
89
115
  }
90
116
  async getActivePage() {
117
+ this.logger.info('getActivePage: current activePage', this.activePage);
91
118
  if (!this.browser) throw new Error('Browser not launched');
92
119
  if (this.activePage) try {
93
120
  await this.activePage.evaluate(()=>document.readyState);
@@ -97,12 +124,14 @@ class BaseBrowser {
97
124
  this.activePage = null;
98
125
  }
99
126
  const pages = await this.browser.pages();
127
+ this.logger.info('getActivePage: all of pages lenght:', pages.length);
100
128
  if (0 === pages.length) {
101
129
  this.activePage = await this.createPage();
102
130
  return this.activePage;
103
131
  }
104
132
  for(let i = pages.length - 1; i >= 0; i--){
105
133
  const page = pages[i];
134
+ this.logger.info('getActivePage: page:', await page.title(), await page.url());
106
135
  try {
107
136
  await page.evaluate(()=>document.readyState);
108
137
  this.activePage = page;
@@ -117,7 +146,7 @@ class BaseBrowser {
117
146
  _define_property(this, "browser", null);
118
147
  _define_property(this, "logger", void 0);
119
148
  _define_property(this, "activePage", null);
120
- this.logger = (null == options ? void 0 : options.logger) ?? __WEBPACK_EXTERNAL_MODULE__agent_infra_logger_ddae3da2__.defaultLogger;
149
+ this.logger = ((null == options ? void 0 : options.logger) ?? defaultLogger).spawn('[BaseBrowser]');
121
150
  this.logger.info('Browser Options:', options);
122
151
  }
123
152
  }
@@ -1 +1 @@
1
- {"version":3,"file":"base-browser.mjs","sources":["webpack://@agent-infra/browser/./src/base-browser.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport * as puppeteer from 'puppeteer-core';\nimport { Logger, defaultLogger } from '@agent-infra/logger';\nimport {\n BrowserInterface,\n EvaluateOnNewPageOptions,\n LaunchOptions,\n Page,\n} from './types';\n\n/**\n * Configuration options for the BaseBrowser class\n * @interface BaseBrowserOptions\n * @property {Logger} [logger] - Custom logger instance to use for browser logging\n */\nexport interface BaseBrowserOptions {\n logger?: Logger;\n}\n\n/**\n * Abstract base class that implements common browser automation functionality\n * Provides a foundation for specific browser implementations with shared capabilities\n * @abstract\n * @implements {BrowserInterface}\n */\nexport abstract class BaseBrowser implements BrowserInterface {\n /**\n * The underlying Puppeteer browser instance\n * @protected\n */\n protected browser: puppeteer.Browser | null = null;\n\n /**\n * Logger instance for browser-related logging\n * @protected\n */\n protected logger: Logger;\n\n /**\n * Reference to the currently active browser page\n * @protected\n */\n protected activePage: Page | null = null;\n\n /**\n * Creates an instance of BaseBrowser\n * @param {BaseBrowserOptions} [options] - Configuration options\n */\n constructor(options?: BaseBrowserOptions) {\n this.logger = options?.logger ?? defaultLogger;\n this.logger.info('Browser Options:', options);\n }\n\n /**\n * Check if the browser instance is active and responding\n * @returns {Promise<boolean>} True if browser is active, false otherwise\n */\n async isBrowserAlive(): Promise<boolean> {\n if (!this.browser) {\n return false;\n }\n\n try {\n // Try to get browser version to check if it's still responding\n const version = await this.browser.version();\n this.logger.info('Browser version:', version);\n return true;\n } catch (error) {\n this.logger.warn('Browser instance is no longer active:', error);\n this.browser = null;\n return false;\n }\n }\n\n /**\n * Get the underlying Puppeteer browser instance\n * @throws Error if browser is not launched\n\n * @returns {puppeteer.Browser} Puppeteer browser instance\n */\n getBrowser(): puppeteer.Browser {\n if (!this.browser) {\n throw new Error('Browser not launched');\n }\n return this.browser;\n }\n\n /**\n * Sets up listeners for browser page events\n * Tracks page creation and updates active page reference\n * @protected\n */\n protected async setupPageListener() {\n if (!this.browser) return;\n\n this.browser.on('targetcreated', async (target) => {\n const page = await target.page();\n if (page) {\n this.logger.info('New page created:', await page.url());\n this.activePage = page;\n\n page.once('close', () => {\n if (this.activePage === page) {\n this.activePage = null;\n }\n });\n\n page.once('error', () => {\n if (this.activePage === page) {\n this.activePage = null;\n }\n });\n }\n });\n }\n\n /**\n * Launches the browser with specified options\n * @abstract\n * @param {LaunchOptions} [options] - Browser launch configuration options\n * @returns {Promise<void>} Promise that resolves when browser is launched\n */\n abstract launch(options?: LaunchOptions): Promise<void>;\n\n /**\n * Closes the browser instance and cleans up resources\n * @returns {Promise<void>} Promise that resolves when browser is closed\n * @throws {Error} If browser fails to close properly\n */\n async close(): Promise<void> {\n this.logger.info('Closing browser');\n try {\n await this.browser?.close();\n this.browser = null;\n this.logger.success('Browser closed successfully');\n } catch (error) {\n this.logger.error('Failed to close browser:', error);\n throw error;\n }\n }\n\n /**\n * Creates a new page, navigates to the specified URL, executes a function in the page context, and returns the result\n * This method is inspired and modified from https://github.com/egoist/local-web-search/blob/04608ed09aa103e2fff6402c72ca12edfb692d19/src/browser.ts#L74\n * @template T - Type of parameters passed to the page function\n * @template R - Return type of the page function\n * @param {EvaluateOnNewPageOptions<T, R>} options - Configuration options for the page evaluation\n * @returns {Promise<R | null>} Promise resolving to the result of the page function or null\n * @throws {Error} If page creation or evaluation fails\n */\n async evaluateOnNewPage<T extends any[], R>(\n options: EvaluateOnNewPageOptions<T, R>,\n ): Promise<R | null> {\n const {\n url,\n pageFunction,\n pageFunctionParams,\n beforePageLoad,\n afterPageLoad,\n beforeSendResult,\n waitForOptions,\n } = options;\n const page = await this.browser!.newPage();\n try {\n await beforePageLoad?.(page);\n await page.goto(url, {\n waitUntil: 'networkidle2',\n ...waitForOptions,\n });\n await afterPageLoad?.(page);\n const _window = await page.evaluateHandle(() => window);\n const result = await page.evaluate(\n pageFunction,\n _window,\n ...pageFunctionParams,\n );\n await beforeSendResult?.(page, result);\n await _window.dispose();\n await page.close();\n return result;\n } catch (error) {\n await page.close();\n throw error;\n }\n }\n\n /**\n * Creates a new browser page\n * @returns {Promise<Page>} Promise resolving to the newly created page\n * @throws {Error} If browser is not launched or page creation fails\n */\n async createPage(): Promise<Page> {\n if (!this.browser) {\n this.logger.error('No active browser');\n throw new Error('Browser not launched');\n }\n\n const page = await this.browser.newPage();\n return page;\n }\n\n /**\n * Gets the currently active page or finds an active page if none is currently tracked\n * If no active pages exist, creates a new page\n * @returns {Promise<Page>} Promise resolving to the active page\n * @throws {Error} If browser is not launched or no active page can be found/created\n */\n async getActivePage(): Promise<Page> {\n if (!this.browser) {\n throw new Error('Browser not launched');\n }\n\n // If activePage exists and is still available, return directly\n if (this.activePage) {\n try {\n // Verify that the page is still available\n await this.activePage.evaluate(() => document.readyState);\n return this.activePage;\n } catch (e) {\n this.logger.warn('Active page no longer available:', e);\n this.activePage = null;\n }\n }\n\n // Get all pages and find the last active page\n const pages = await this.browser.pages();\n\n if (pages.length === 0) {\n this.activePage = await this.createPage();\n return this.activePage;\n }\n\n // Find the last responding page\n for (let i = pages.length - 1; i >= 0; i--) {\n const page = pages[i];\n try {\n await page.evaluate(() => document.readyState);\n this.activePage = page;\n return page;\n } catch (e) {\n continue;\n }\n }\n\n throw new Error('No active page found');\n }\n}\n"],"names":["BaseBrowser","version","error","Error","target","page","_this_browser","options","url","pageFunction","pageFunctionParams","beforePageLoad","afterPageLoad","beforeSendResult","waitForOptions","_window","window","result","document","e","pages","i","defaultLogger"],"mappings":"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"}
1
+ {"version":3,"file":"base-browser.mjs","sources":["webpack://@agent-infra/browser/./src/base-browser.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport * as puppeteer from 'puppeteer-core';\nimport { Logger, defaultLogger } from '@agent-infra/logger';\nimport {\n BrowserInterface,\n EvaluateOnNewPageOptions,\n LaunchOptions,\n Page,\n} from './types';\n\n/**\n * Configuration options for the BaseBrowser class\n * @interface BaseBrowserOptions\n * @property {Logger} [logger] - Custom logger instance to use for browser logging\n */\nexport interface BaseBrowserOptions {\n logger?: Logger;\n}\n\n/**\n * Abstract base class that implements common browser automation functionality\n * Provides a foundation for specific browser implementations with shared capabilities\n * @abstract\n * @implements {BrowserInterface}\n */\nexport abstract class BaseBrowser implements BrowserInterface {\n /**\n * The underlying Puppeteer browser instance\n * @protected\n */\n protected browser: puppeteer.Browser | null = null;\n\n /**\n * Logger instance for browser-related logging\n * @protected\n */\n protected logger: Logger;\n\n /**\n * Reference to the currently active browser page\n * @protected\n */\n protected activePage: Page | null = null;\n\n /**\n * Creates an instance of BaseBrowser\n * @param {BaseBrowserOptions} [options] - Configuration options\n */\n constructor(options?: BaseBrowserOptions) {\n this.logger = (options?.logger ?? defaultLogger).spawn('[BaseBrowser]');\n this.logger.info('Browser Options:', options);\n }\n\n /**\n * Check if the browser instance is active and responding\n * @returns {Promise<boolean>} True if browser is active, false otherwise\n */\n async isBrowserAlive(): Promise<boolean> {\n if (!this.browser) {\n return false;\n }\n\n try {\n // Try to get browser version to check if it's still responding\n const version = await this.browser.version();\n this.logger.info('Browser version:', version);\n return true;\n } catch (error) {\n this.logger.warn('Browser instance is no longer active:', error);\n this.browser = null;\n return false;\n }\n }\n\n /**\n * Get the underlying Puppeteer browser instance\n * @throws Error if browser is not launched\n\n * @returns {puppeteer.Browser} Puppeteer browser instance\n */\n getBrowser(): puppeteer.Browser {\n if (!this.browser) {\n throw new Error('Browser not launched');\n }\n return this.browser;\n }\n\n /**\n * Sets up listeners for browser page events\n * Tracks page creation and updates active page reference\n * @protected\n */\n protected async setupPageListener() {\n this.logger.info('setupPageListener()');\n if (!this.browser) return;\n\n this.browser.on('targetcreated', async (target) => {\n this.logger.info('PageListener: targetcreated, type:', target.type());\n\n const page = await target.page();\n if (page) {\n this.logger.info('New page created:', await page.url());\n this.activePage = page;\n\n page.once('close', () => {\n if (this.activePage === page) {\n this.activePage = null;\n }\n });\n\n page.once('error', () => {\n if (this.activePage === page) {\n this.activePage = null;\n }\n });\n }\n });\n\n this.browser.on('targetchanged', async (target: any) => {\n this.logger.info('PageListener: targetchanged:', target.type());\n try {\n const changedPage = await target.page();\n if (changedPage) {\n const currentUrl = await changedPage.url();\n this.logger.info('The target changed', currentUrl);\n if (currentUrl && currentUrl !== 'about:blank') {\n this.activePage = changedPage;\n }\n }\n } catch (error) {\n this.logger.error('error on targetchanged:', error);\n }\n });\n\n this.browser.on('targetdestroyed', async (target: any) => {\n this.logger.info('PageListener: targetdestroyed:', target.type());\n if (target.type() === 'page') {\n try {\n const pages = await this.browser?.pages();\n this.logger.info('Destoryed, left pages:', pages?.length);\n this.activePage = null;\n } catch (error) {\n this.logger.error('error on targetdestroyed:', error);\n }\n }\n });\n }\n\n /**\n * Launches the browser with specified options\n * @abstract\n * @param {LaunchOptions} [options] - Browser launch configuration options\n * @returns {Promise<void>} Promise that resolves when browser is launched\n */\n abstract launch(options?: LaunchOptions): Promise<void>;\n\n /**\n * Closes the browser instance and cleans up resources\n * @returns {Promise<void>} Promise that resolves when browser is closed\n * @throws {Error} If browser fails to close properly\n */\n async close(): Promise<void> {\n this.logger.info('Closing browser');\n try {\n await this.browser?.close();\n this.browser = null;\n this.logger.success('Browser closed successfully');\n } catch (error) {\n this.logger.error('Failed to close browser:', error);\n throw error;\n }\n }\n\n /**\n * Creates a new page, navigates to the specified URL, executes a function in the page context, and returns the result\n * This method is inspired and modified from https://github.com/egoist/local-web-search/blob/04608ed09aa103e2fff6402c72ca12edfb692d19/src/browser.ts#L74\n * @template T - Type of parameters passed to the page function\n * @template R - Return type of the page function\n * @param {EvaluateOnNewPageOptions<T, R>} options - Configuration options for the page evaluation\n * @returns {Promise<R | null>} Promise resolving to the result of the page function or null\n * @throws {Error} If page creation or evaluation fails\n */\n async evaluateOnNewPage<T extends any[], R>(\n options: EvaluateOnNewPageOptions<T, R>,\n ): Promise<R | null> {\n const {\n url,\n pageFunction,\n pageFunctionParams,\n beforePageLoad,\n afterPageLoad,\n beforeSendResult,\n waitForOptions,\n } = options;\n const page = await this.browser!.newPage();\n try {\n await beforePageLoad?.(page);\n await page.goto(url, {\n waitUntil: 'networkidle2',\n ...waitForOptions,\n });\n await afterPageLoad?.(page);\n const _window = await page.evaluateHandle(() => window);\n const result = await page.evaluate(\n pageFunction,\n _window,\n ...pageFunctionParams,\n );\n await beforeSendResult?.(page, result);\n await _window.dispose();\n await page.close();\n return result;\n } catch (error) {\n await page.close();\n throw error;\n }\n }\n\n /**\n * Creates a new browser page\n * @returns {Promise<Page>} Promise resolving to the newly created page\n * @throws {Error} If browser is not launched or page creation fails\n */\n async createPage(): Promise<Page> {\n if (!this.browser) {\n this.logger.error('No active browser');\n throw new Error('Browser not launched');\n }\n\n const page = await this.browser.newPage();\n return page;\n }\n\n /**\n * Gets the currently active page or finds an active page if none is currently tracked\n * If no active pages exist, creates a new page\n * @returns {Promise<Page>} Promise resolving to the active page\n * @throws {Error} If browser is not launched or no active page can be found/created\n */\n async getActivePage(): Promise<Page> {\n this.logger.info('getActivePage: current activePage', this.activePage);\n\n if (!this.browser) {\n throw new Error('Browser not launched');\n }\n\n // If activePage exists and is still available, return directly\n if (this.activePage) {\n try {\n // Verify that the page is still available\n await this.activePage.evaluate(() => document.readyState);\n return this.activePage;\n } catch (e) {\n this.logger.warn('Active page no longer available:', e);\n this.activePage = null;\n }\n }\n\n // Get all pages and find the last active page\n const pages = await this.browser.pages();\n this.logger.info('getActivePage: all of pages lenght:', pages.length);\n\n if (pages.length === 0) {\n this.activePage = await this.createPage();\n return this.activePage;\n }\n\n // Find the last responding page\n for (let i = pages.length - 1; i >= 0; i--) {\n const page = pages[i];\n this.logger.info(\n 'getActivePage: page:',\n await page.title(),\n await page.url(),\n );\n try {\n await page.evaluate(() => document.readyState);\n this.activePage = page;\n return page;\n } catch (e) {\n continue;\n }\n }\n\n throw new Error('No active page found');\n }\n}\n"],"names":["BaseBrowser","version","error","Error","target","page","changedPage","currentUrl","_this_browser","pages","options","url","pageFunction","pageFunctionParams","beforePageLoad","afterPageLoad","beforeSendResult","waitForOptions","_window","window","result","document","e","i","defaultLogger"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -4,13 +4,11 @@
4
4
  *
5
5
  * Main exports:
6
6
  * - types: Type definitions for browser interfaces
7
- * - BrowserFinder: Utility to detect and locate installed browsers
8
7
  * - LocalBrowser: Control locally installed browsers
9
8
  * - RemoteBrowser: Connect to remote browser instances
10
9
  * - BaseBrowser: Abstract base class for browser implementations
11
10
  */
12
11
  export * from './types';
13
- export * from './browser-finder';
14
12
  export * from './local-browser';
15
13
  export * from './remote-browser';
16
14
  export * from './base-browser';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;GAUG;AACH,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA;;;;;;;;;GASG;AACH,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -7,9 +7,6 @@ var __webpack_modules__ = {
7
7
  "./base-browser": function(module) {
8
8
  module.exports = require("./base-browser.js");
9
9
  },
10
- "./browser-finder": function(module) {
11
- module.exports = require("./browser-finder/index.js");
12
- },
13
10
  "./local-browser": function(module) {
14
11
  module.exports = require("./local-browser.js");
15
12
  },
@@ -69,33 +66,28 @@ var __webpack_exports__ = {};
69
66
  return _types__WEBPACK_IMPORTED_MODULE_0__[key];
70
67
  }).bind(0, __WEBPACK_IMPORT_KEY__);
71
68
  __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
72
- var _browser_finder__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./browser-finder");
73
- var __WEBPACK_REEXPORT_OBJECT__ = {};
74
- for(var __WEBPACK_IMPORT_KEY__ in _browser_finder__WEBPACK_IMPORTED_MODULE_1__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
75
- return _browser_finder__WEBPACK_IMPORTED_MODULE_1__[key];
76
- }).bind(0, __WEBPACK_IMPORT_KEY__);
77
- __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
78
- var _local_browser__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("./local-browser");
69
+ var _local_browser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./local-browser");
79
70
  var __WEBPACK_REEXPORT_OBJECT__ = {};
80
- for(var __WEBPACK_IMPORT_KEY__ in _local_browser__WEBPACK_IMPORTED_MODULE_2__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
81
- return _local_browser__WEBPACK_IMPORTED_MODULE_2__[key];
71
+ for(var __WEBPACK_IMPORT_KEY__ in _local_browser__WEBPACK_IMPORTED_MODULE_1__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
72
+ return _local_browser__WEBPACK_IMPORTED_MODULE_1__[key];
82
73
  }).bind(0, __WEBPACK_IMPORT_KEY__);
83
74
  __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
84
- var _remote_browser__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__("./remote-browser");
75
+ var _remote_browser__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("./remote-browser");
85
76
  var __WEBPACK_REEXPORT_OBJECT__ = {};
86
- for(var __WEBPACK_IMPORT_KEY__ in _remote_browser__WEBPACK_IMPORTED_MODULE_3__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
87
- return _remote_browser__WEBPACK_IMPORTED_MODULE_3__[key];
77
+ for(var __WEBPACK_IMPORT_KEY__ in _remote_browser__WEBPACK_IMPORTED_MODULE_2__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
78
+ return _remote_browser__WEBPACK_IMPORTED_MODULE_2__[key];
88
79
  }).bind(0, __WEBPACK_IMPORT_KEY__);
89
80
  __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
90
- var _base_browser__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__("./base-browser");
81
+ var _base_browser__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__("./base-browser");
91
82
  var __WEBPACK_REEXPORT_OBJECT__ = {};
92
- for(var __WEBPACK_IMPORT_KEY__ in _base_browser__WEBPACK_IMPORTED_MODULE_4__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
93
- return _base_browser__WEBPACK_IMPORTED_MODULE_4__[key];
83
+ for(var __WEBPACK_IMPORT_KEY__ in _base_browser__WEBPACK_IMPORTED_MODULE_3__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
84
+ return _base_browser__WEBPACK_IMPORTED_MODULE_3__[key];
94
85
  }).bind(0, __WEBPACK_IMPORT_KEY__);
95
86
  __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
96
87
  })();
97
- var __webpack_export_target__ = exports;
98
- for(var __webpack_i__ in __webpack_exports__)__webpack_export_target__[__webpack_i__] = __webpack_exports__[__webpack_i__];
99
- if (__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_target__, '__esModule', {
88
+ for(var __webpack_i__ in __webpack_exports__)exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
89
+ Object.defineProperty(exports, '__esModule', {
100
90
  value: true
101
91
  });
92
+
93
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["webpack://@agent-infra/browser/webpack/runtime/compat_get_default_export","webpack://@agent-infra/browser/webpack/runtime/define_property_getters","webpack://@agent-infra/browser/webpack/runtime/has_own_property","webpack://@agent-infra/browser/webpack/runtime/make_namespace_object"],"sourcesContent":["// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IACAA,oBAAoB,CAAC,GAAG,CAACC;QACxB,IAAIC,SAASD,UAAUA,OAAO,UAAU,GACvC,IAAOA,MAAM,CAAC,UAAU,GACxB,IAAOA;QACRD,oBAAoB,CAAC,CAACE,QAAQ;YAAE,GAAGA;QAAO;QAC1C,OAAOA;IACR;;;ICPAF,oBAAoB,CAAC,GAAG,CAAC,UAASG;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGH,oBAAoB,CAAC,CAACG,YAAYC,QAAQ,CAACJ,oBAAoB,CAAC,CAAC,UAASI,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAJ,oBAAoB,CAAC,GAAG,CAACM,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFP,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOQ,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D"}
package/dist/index.mjs CHANGED
@@ -3,7 +3,6 @@
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */
5
5
  export * from "./types.mjs";
6
- export * from "./browser-finder/index.mjs";
7
6
  export * from "./local-browser.mjs";
8
7
  export * from "./remote-browser.mjs";
9
8
  export * from "./base-browser.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"local-browser.d.ts","sourceRoot":"","sources":["../src/local-browser.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,KAAK,EAAe,aAAa,EAAE,MAAM,SAAS,CAAC;AAE1D;;;;GAIG;AACH,qBAAa,YAAa,SAAQ,WAAW;IAC3C;;;;;;OAMG;IACG,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmFxD,OAAO,CAAC,cAAc;CAsCvB"}
1
+ {"version":3,"file":"local-browser.d.ts","sourceRoot":"","sources":["../src/local-browser.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C;;;;GAIG;AACH,qBAAa,YAAa,SAAQ,WAAW;IAC3C;;;;;;OAMG;IACG,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkFxD,OAAO,CAAC,cAAc;CAsCvB"}
@@ -31,15 +31,15 @@ __webpack_require__.d(__webpack_exports__, {
31
31
  LocalBrowser: ()=>LocalBrowser
32
32
  });
33
33
  const external_puppeteer_core_namespaceObject = require("puppeteer-core");
34
- const index_js_namespaceObject = require("./browser-finder/index.js");
34
+ const browser_finder_namespaceObject = require("@agent-infra/browser-finder");
35
35
  const external_base_browser_js_namespaceObject = require("./base-browser.js");
36
36
  class LocalBrowser extends external_base_browser_js_namespaceObject.BaseBrowser {
37
37
  async launch(options = {}) {
38
38
  var _options_defaultViewport, _options_defaultViewport1;
39
39
  this.logger.info('Launching browser with options:', options);
40
40
  const { path, type } = this.getBrowserInfo(options);
41
- const viewportWidth = (null == options ? void 0 : null === (_options_defaultViewport = options.defaultViewport) || void 0 === _options_defaultViewport ? void 0 : _options_defaultViewport.width) ?? 1280;
42
- const viewportHeight = (null == options ? void 0 : null === (_options_defaultViewport1 = options.defaultViewport) || void 0 === _options_defaultViewport1 ? void 0 : _options_defaultViewport1.height) ?? 800;
41
+ const viewportWidth = (null == options ? void 0 : null == (_options_defaultViewport = options.defaultViewport) ? void 0 : _options_defaultViewport.width) ?? 1280;
42
+ const viewportHeight = (null == options ? void 0 : null == (_options_defaultViewport1 = options.defaultViewport) ? void 0 : _options_defaultViewport1.height) ?? 800;
43
43
  const puppeteerLaunchOptions = {
44
44
  browser: type,
45
45
  executablePath: path,
@@ -57,7 +57,6 @@ class LocalBrowser extends external_base_browser_js_namespaceObject.BaseBrowser
57
57
  '--no-sandbox',
58
58
  '--mute-audio',
59
59
  '--disable-gpu',
60
- '--disable-http2',
61
60
  '--disable-blink-features=AutomationControlled',
62
61
  '--disable-infobars',
63
62
  '--disable-background-timer-throttling',
@@ -113,7 +112,7 @@ class LocalBrowser extends external_base_browser_js_namespaceObject.BaseBrowser
113
112
  browserType = lowercasePath.includes('chrome') ? 'chrome' : lowercasePath.includes('edge') ? 'chrome' : lowercasePath.includes('firefox') ? 'firefox' : 'chrome';
114
113
  }
115
114
  } else {
116
- const browserInfo = new index_js_namespaceObject.BrowserFinder(this.logger).findBrowser();
115
+ const browserInfo = new browser_finder_namespaceObject.BrowserFinder(this.logger).findBrowser();
117
116
  browserPath = browserInfo.path;
118
117
  browserType = map[browserInfo.type];
119
118
  }
@@ -124,9 +123,11 @@ class LocalBrowser extends external_base_browser_js_namespaceObject.BaseBrowser
124
123
  };
125
124
  }
126
125
  }
127
- var __webpack_export_target__ = exports;
128
- for(var __webpack_i__ in __webpack_exports__)__webpack_export_target__[__webpack_i__] = __webpack_exports__[__webpack_i__];
129
- if (__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_target__, '__esModule', {
126
+ exports.LocalBrowser = __webpack_exports__.LocalBrowser;
127
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
128
+ "LocalBrowser"
129
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
130
+ Object.defineProperty(exports, '__esModule', {
130
131
  value: true
131
132
  });
132
133
 
@@ -1 +1 @@
1
- {"version":3,"file":"local-browser.js","sources":["webpack://@agent-infra/browser/./src/local-browser.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport * as puppeteer from 'puppeteer-core';\nimport { BrowserFinder } from './browser-finder';\nimport { BaseBrowser } from './base-browser';\n\nimport type { BrowserType, LaunchOptions } from './types';\n\n/**\n * LocalBrowser class for controlling locally installed browsers\n * Extends the BaseBrowser with functionality specific to managing local browser instances\n * @extends BaseBrowser\n */\nexport class LocalBrowser extends BaseBrowser {\n /**\n * Launches a local browser instance with specified options\n * Automatically detects installed browsers if no executable path is provided\n * @param {LaunchOptions} options - Configuration options for launching the browser\n * @returns {Promise<void>} Promise that resolves when the browser is successfully launched\n * @throws {Error} If the browser cannot be launched\n */\n async launch(options: LaunchOptions = {}): Promise<void> {\n this.logger.info('Launching browser with options:', options);\n\n const { path, type } = this.getBrowserInfo(options);\n const viewportWidth = options?.defaultViewport?.width ?? 1280;\n const viewportHeight = options?.defaultViewport?.height ?? 800;\n\n const puppeteerLaunchOptions: puppeteer.LaunchOptions = {\n browser: type,\n executablePath: path,\n dumpio: options?.dumpio ?? false,\n headless: options?.headless ?? false,\n defaultViewport: {\n width: viewportWidth,\n height: viewportHeight,\n // Setting this value to 0 will reset this value to the system default.\n // This parameter combined with `captureBeyondViewport: false`, will resolve the screenshot blinking issue.\n deviceScaleFactor: 0,\n },\n ...(options.userDataDir && {\n userDataDir: options.userDataDir,\n }),\n args: [\n '--no-sandbox',\n '--mute-audio',\n '--disable-gpu',\n '--disable-http2',\n '--disable-blink-features=AutomationControlled',\n '--disable-infobars',\n '--disable-background-timer-throttling',\n '--disable-popup-blocking',\n '--disable-backgrounding-occluded-windows',\n '--disable-renderer-backgrounding',\n '--disable-window-activation',\n '--disable-focus-on-load',\n '--no-default-browser-check', // disable default browser check\n '--disable-web-security', // disable CORS\n '--disable-features=IsolateOrigins,site-per-process',\n '--disable-site-isolation-trials',\n `--window-size=${viewportWidth},${viewportHeight + 90}`,\n options?.proxy ? `--proxy-server=${options.proxy}` : '',\n options?.proxyBypassList\n ? `--proxy-bypass-list=${options.proxyBypassList}`\n : '',\n options?.profilePath\n ? `--profile-directory=${options.profilePath}`\n : '',\n ...(options.args ?? []),\n ].filter((item) => {\n if (type === 'firefox') {\n // firefox not support rules\n if (\n item === '--disable-features=IsolateOrigins,site-per-process' ||\n item === `--window-size=${viewportWidth},${viewportHeight + 90}`\n ) {\n return false;\n }\n\n return !!item;\n }\n\n // chrome/edge\n return !!item;\n }),\n ignoreDefaultArgs: ['--enable-automation'],\n timeout: options.timeout ?? 0,\n downloadBehavior: {\n policy: 'deny',\n },\n };\n\n this.logger.info('Launch options:', puppeteerLaunchOptions);\n\n try {\n this.browser = await puppeteer.launch(puppeteerLaunchOptions);\n await this.setupPageListener();\n this.logger.success('Browser launched successfully');\n } catch (error) {\n this.logger.error('Failed to launch browser:', error);\n throw error;\n }\n }\n\n private getBrowserInfo(options: LaunchOptions = {}) {\n // pptr only support 'chrome' and 'firefox'\n const map: Record<BrowserType, Exclude<BrowserType, 'edge'>> = {\n chrome: 'chrome',\n edge: 'chrome',\n firefox: 'firefox',\n };\n\n let browserPath = options.executablePath;\n let browserType = options.browserType && map[options.browserType];\n\n if (!browserPath) {\n const browserInfo = new BrowserFinder(this.logger).findBrowser();\n browserPath = browserInfo.path;\n browserType = map[browserInfo.type];\n } else {\n if (!browserType) {\n const lowercasePath = browserPath.toLowerCase();\n\n if (lowercasePath.includes('chrome')) {\n browserType = 'chrome';\n } else if (lowercasePath.includes('edge')) {\n browserType = 'chrome'; // pptr only support 'chrome' and 'firefox'\n } else if (lowercasePath.includes('firefox')) {\n browserType = 'firefox';\n } else {\n browserType = 'chrome';\n }\n }\n }\n\n this.logger.info('Using executable path:', browserPath);\n\n return {\n path: browserPath,\n type: browserType,\n };\n }\n}\n"],"names":["LocalBrowser","BaseBrowser","options","_options_defaultViewport","_options_defaultViewport1","path","type","viewportWidth","viewportHeight","puppeteerLaunchOptions","item","puppeteer","error","map","browserPath","browserType","lowercasePath","browserInfo","BrowserFinder"],"mappings":"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"}
1
+ {"version":3,"file":"local-browser.js","sources":["webpack://@agent-infra/browser/webpack/runtime/define_property_getters","webpack://@agent-infra/browser/webpack/runtime/has_own_property","webpack://@agent-infra/browser/webpack/runtime/make_namespace_object","webpack://@agent-infra/browser/./src/local-browser.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport * as puppeteer from 'puppeteer-core';\nimport { BrowserFinder, type BrowserType } from '@agent-infra/browser-finder';\nimport { BaseBrowser } from './base-browser';\n\nimport type { LaunchOptions } from './types';\n\n/**\n * LocalBrowser class for controlling locally installed browsers\n * Extends the BaseBrowser with functionality specific to managing local browser instances\n * @extends BaseBrowser\n */\nexport class LocalBrowser extends BaseBrowser {\n /**\n * Launches a local browser instance with specified options\n * Automatically detects installed browsers if no executable path is provided\n * @param {LaunchOptions} options - Configuration options for launching the browser\n * @returns {Promise<void>} Promise that resolves when the browser is successfully launched\n * @throws {Error} If the browser cannot be launched\n */\n async launch(options: LaunchOptions = {}): Promise<void> {\n this.logger.info('Launching browser with options:', options);\n\n const { path, type } = this.getBrowserInfo(options);\n const viewportWidth = options?.defaultViewport?.width ?? 1280;\n const viewportHeight = options?.defaultViewport?.height ?? 800;\n\n const puppeteerLaunchOptions: puppeteer.LaunchOptions = {\n browser: type,\n executablePath: path,\n dumpio: options?.dumpio ?? false,\n headless: options?.headless ?? false,\n defaultViewport: {\n width: viewportWidth,\n height: viewportHeight,\n // Setting this value to 0 will reset this value to the system default.\n // This parameter combined with `captureBeyondViewport: false`, will resolve the screenshot blinking issue.\n deviceScaleFactor: 0,\n },\n ...(options.userDataDir && {\n userDataDir: options.userDataDir,\n }),\n args: [\n '--no-sandbox',\n '--mute-audio',\n '--disable-gpu',\n '--disable-blink-features=AutomationControlled',\n '--disable-infobars',\n '--disable-background-timer-throttling',\n '--disable-popup-blocking',\n '--disable-backgrounding-occluded-windows',\n '--disable-renderer-backgrounding',\n '--disable-window-activation',\n '--disable-focus-on-load',\n '--no-default-browser-check', // disable default browser check\n '--disable-web-security', // disable CORS\n '--disable-features=IsolateOrigins,site-per-process',\n '--disable-site-isolation-trials',\n `--window-size=${viewportWidth},${viewportHeight + 90}`,\n options?.proxy ? `--proxy-server=${options.proxy}` : '',\n options?.proxyBypassList\n ? `--proxy-bypass-list=${options.proxyBypassList}`\n : '',\n options?.profilePath\n ? `--profile-directory=${options.profilePath}`\n : '',\n ...(options.args ?? []),\n ].filter((item) => {\n if (type === 'firefox') {\n // firefox not support rules\n if (\n item === '--disable-features=IsolateOrigins,site-per-process' ||\n item === `--window-size=${viewportWidth},${viewportHeight + 90}`\n ) {\n return false;\n }\n\n return !!item;\n }\n\n // chrome/edge\n return !!item;\n }),\n ignoreDefaultArgs: ['--enable-automation'],\n timeout: options.timeout ?? 0,\n downloadBehavior: {\n policy: 'deny',\n },\n };\n\n this.logger.info('Launch options:', puppeteerLaunchOptions);\n\n try {\n this.browser = await puppeteer.launch(puppeteerLaunchOptions);\n await this.setupPageListener();\n this.logger.success('Browser launched successfully');\n } catch (error) {\n this.logger.error('Failed to launch browser:', error);\n throw error;\n }\n }\n\n private getBrowserInfo(options: LaunchOptions = {}) {\n // pptr only support 'chrome' and 'firefox'\n const map: Record<BrowserType, Exclude<BrowserType, 'edge'>> = {\n chrome: 'chrome',\n edge: 'chrome',\n firefox: 'firefox',\n };\n\n let browserPath = options.executablePath;\n let browserType = options.browserType && map[options.browserType];\n\n if (!browserPath) {\n const browserInfo = new BrowserFinder(this.logger).findBrowser();\n browserPath = browserInfo.path;\n browserType = map[browserInfo.type];\n } else {\n if (!browserType) {\n const lowercasePath = browserPath.toLowerCase();\n\n if (lowercasePath.includes('chrome')) {\n browserType = 'chrome';\n } else if (lowercasePath.includes('edge')) {\n browserType = 'chrome'; // pptr only support 'chrome' and 'firefox'\n } else if (lowercasePath.includes('firefox')) {\n browserType = 'firefox';\n } else {\n browserType = 'chrome';\n }\n }\n }\n\n this.logger.info('Using executable path:', browserPath);\n\n return {\n path: browserPath,\n type: browserType,\n };\n }\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","LocalBrowser","BaseBrowser","options","_options_defaultViewport","_options_defaultViewport1","path","type","viewportWidth","viewportHeight","puppeteerLaunchOptions","item","puppeteer","error","map","browserPath","browserType","lowercasePath","browserInfo","BrowserFinder"],"mappings":"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"}
@@ -2,16 +2,16 @@
2
2
  * Copyright (c) 2025 Bytedance, Inc. and its affiliates.
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */
5
- import * as __WEBPACK_EXTERNAL_MODULE_puppeteer_core_17481843__ from "puppeteer-core";
6
- import * as __WEBPACK_EXTERNAL_MODULE__browser_finder_index_mjs_208fd54f__ from "./browser-finder/index.mjs";
7
- import * as __WEBPACK_EXTERNAL_MODULE__base_browser_mjs_64d751a3__ from "./base-browser.mjs";
8
- class LocalBrowser extends __WEBPACK_EXTERNAL_MODULE__base_browser_mjs_64d751a3__.BaseBrowser {
5
+ import { launch } from "puppeteer-core";
6
+ import { BrowserFinder } from "@agent-infra/browser-finder";
7
+ import { BaseBrowser } from "./base-browser.mjs";
8
+ class LocalBrowser extends BaseBrowser {
9
9
  async launch(options = {}) {
10
10
  var _options_defaultViewport, _options_defaultViewport1;
11
11
  this.logger.info('Launching browser with options:', options);
12
12
  const { path, type } = this.getBrowserInfo(options);
13
- const viewportWidth = (null == options ? void 0 : null === (_options_defaultViewport = options.defaultViewport) || void 0 === _options_defaultViewport ? void 0 : _options_defaultViewport.width) ?? 1280;
14
- const viewportHeight = (null == options ? void 0 : null === (_options_defaultViewport1 = options.defaultViewport) || void 0 === _options_defaultViewport1 ? void 0 : _options_defaultViewport1.height) ?? 800;
13
+ const viewportWidth = (null == options ? void 0 : null == (_options_defaultViewport = options.defaultViewport) ? void 0 : _options_defaultViewport.width) ?? 1280;
14
+ const viewportHeight = (null == options ? void 0 : null == (_options_defaultViewport1 = options.defaultViewport) ? void 0 : _options_defaultViewport1.height) ?? 800;
15
15
  const puppeteerLaunchOptions = {
16
16
  browser: type,
17
17
  executablePath: path,
@@ -29,7 +29,6 @@ class LocalBrowser extends __WEBPACK_EXTERNAL_MODULE__base_browser_mjs_64d751a3_
29
29
  '--no-sandbox',
30
30
  '--mute-audio',
31
31
  '--disable-gpu',
32
- '--disable-http2',
33
32
  '--disable-blink-features=AutomationControlled',
34
33
  '--disable-infobars',
35
34
  '--disable-background-timer-throttling',
@@ -63,7 +62,7 @@ class LocalBrowser extends __WEBPACK_EXTERNAL_MODULE__base_browser_mjs_64d751a3_
63
62
  };
64
63
  this.logger.info('Launch options:', puppeteerLaunchOptions);
65
64
  try {
66
- this.browser = await __WEBPACK_EXTERNAL_MODULE_puppeteer_core_17481843__.launch(puppeteerLaunchOptions);
65
+ this.browser = await launch(puppeteerLaunchOptions);
67
66
  await this.setupPageListener();
68
67
  this.logger.success('Browser launched successfully');
69
68
  } catch (error) {
@@ -85,7 +84,7 @@ class LocalBrowser extends __WEBPACK_EXTERNAL_MODULE__base_browser_mjs_64d751a3_
85
84
  browserType = lowercasePath.includes('chrome') ? 'chrome' : lowercasePath.includes('edge') ? 'chrome' : lowercasePath.includes('firefox') ? 'firefox' : 'chrome';
86
85
  }
87
86
  } else {
88
- const browserInfo = new __WEBPACK_EXTERNAL_MODULE__browser_finder_index_mjs_208fd54f__.BrowserFinder(this.logger).findBrowser();
87
+ const browserInfo = new BrowserFinder(this.logger).findBrowser();
89
88
  browserPath = browserInfo.path;
90
89
  browserType = map[browserInfo.type];
91
90
  }
@@ -1 +1 @@
1
- {"version":3,"file":"local-browser.mjs","sources":["webpack://@agent-infra/browser/./src/local-browser.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport * as puppeteer from 'puppeteer-core';\nimport { BrowserFinder } from './browser-finder';\nimport { BaseBrowser } from './base-browser';\n\nimport type { BrowserType, LaunchOptions } from './types';\n\n/**\n * LocalBrowser class for controlling locally installed browsers\n * Extends the BaseBrowser with functionality specific to managing local browser instances\n * @extends BaseBrowser\n */\nexport class LocalBrowser extends BaseBrowser {\n /**\n * Launches a local browser instance with specified options\n * Automatically detects installed browsers if no executable path is provided\n * @param {LaunchOptions} options - Configuration options for launching the browser\n * @returns {Promise<void>} Promise that resolves when the browser is successfully launched\n * @throws {Error} If the browser cannot be launched\n */\n async launch(options: LaunchOptions = {}): Promise<void> {\n this.logger.info('Launching browser with options:', options);\n\n const { path, type } = this.getBrowserInfo(options);\n const viewportWidth = options?.defaultViewport?.width ?? 1280;\n const viewportHeight = options?.defaultViewport?.height ?? 800;\n\n const puppeteerLaunchOptions: puppeteer.LaunchOptions = {\n browser: type,\n executablePath: path,\n dumpio: options?.dumpio ?? false,\n headless: options?.headless ?? false,\n defaultViewport: {\n width: viewportWidth,\n height: viewportHeight,\n // Setting this value to 0 will reset this value to the system default.\n // This parameter combined with `captureBeyondViewport: false`, will resolve the screenshot blinking issue.\n deviceScaleFactor: 0,\n },\n ...(options.userDataDir && {\n userDataDir: options.userDataDir,\n }),\n args: [\n '--no-sandbox',\n '--mute-audio',\n '--disable-gpu',\n '--disable-http2',\n '--disable-blink-features=AutomationControlled',\n '--disable-infobars',\n '--disable-background-timer-throttling',\n '--disable-popup-blocking',\n '--disable-backgrounding-occluded-windows',\n '--disable-renderer-backgrounding',\n '--disable-window-activation',\n '--disable-focus-on-load',\n '--no-default-browser-check', // disable default browser check\n '--disable-web-security', // disable CORS\n '--disable-features=IsolateOrigins,site-per-process',\n '--disable-site-isolation-trials',\n `--window-size=${viewportWidth},${viewportHeight + 90}`,\n options?.proxy ? `--proxy-server=${options.proxy}` : '',\n options?.proxyBypassList\n ? `--proxy-bypass-list=${options.proxyBypassList}`\n : '',\n options?.profilePath\n ? `--profile-directory=${options.profilePath}`\n : '',\n ...(options.args ?? []),\n ].filter((item) => {\n if (type === 'firefox') {\n // firefox not support rules\n if (\n item === '--disable-features=IsolateOrigins,site-per-process' ||\n item === `--window-size=${viewportWidth},${viewportHeight + 90}`\n ) {\n return false;\n }\n\n return !!item;\n }\n\n // chrome/edge\n return !!item;\n }),\n ignoreDefaultArgs: ['--enable-automation'],\n timeout: options.timeout ?? 0,\n downloadBehavior: {\n policy: 'deny',\n },\n };\n\n this.logger.info('Launch options:', puppeteerLaunchOptions);\n\n try {\n this.browser = await puppeteer.launch(puppeteerLaunchOptions);\n await this.setupPageListener();\n this.logger.success('Browser launched successfully');\n } catch (error) {\n this.logger.error('Failed to launch browser:', error);\n throw error;\n }\n }\n\n private getBrowserInfo(options: LaunchOptions = {}) {\n // pptr only support 'chrome' and 'firefox'\n const map: Record<BrowserType, Exclude<BrowserType, 'edge'>> = {\n chrome: 'chrome',\n edge: 'chrome',\n firefox: 'firefox',\n };\n\n let browserPath = options.executablePath;\n let browserType = options.browserType && map[options.browserType];\n\n if (!browserPath) {\n const browserInfo = new BrowserFinder(this.logger).findBrowser();\n browserPath = browserInfo.path;\n browserType = map[browserInfo.type];\n } else {\n if (!browserType) {\n const lowercasePath = browserPath.toLowerCase();\n\n if (lowercasePath.includes('chrome')) {\n browserType = 'chrome';\n } else if (lowercasePath.includes('edge')) {\n browserType = 'chrome'; // pptr only support 'chrome' and 'firefox'\n } else if (lowercasePath.includes('firefox')) {\n browserType = 'firefox';\n } else {\n browserType = 'chrome';\n }\n }\n }\n\n this.logger.info('Using executable path:', browserPath);\n\n return {\n path: browserPath,\n type: browserType,\n };\n }\n}\n"],"names":["LocalBrowser","BaseBrowser","options","_options_defaultViewport","_options_defaultViewport1","path","type","viewportWidth","viewportHeight","puppeteerLaunchOptions","item","puppeteer","error","map","browserPath","browserType","lowercasePath","browserInfo","BrowserFinder"],"mappings":"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"}
1
+ {"version":3,"file":"local-browser.mjs","sources":["webpack://@agent-infra/browser/./src/local-browser.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport * as puppeteer from 'puppeteer-core';\nimport { BrowserFinder, type BrowserType } from '@agent-infra/browser-finder';\nimport { BaseBrowser } from './base-browser';\n\nimport type { LaunchOptions } from './types';\n\n/**\n * LocalBrowser class for controlling locally installed browsers\n * Extends the BaseBrowser with functionality specific to managing local browser instances\n * @extends BaseBrowser\n */\nexport class LocalBrowser extends BaseBrowser {\n /**\n * Launches a local browser instance with specified options\n * Automatically detects installed browsers if no executable path is provided\n * @param {LaunchOptions} options - Configuration options for launching the browser\n * @returns {Promise<void>} Promise that resolves when the browser is successfully launched\n * @throws {Error} If the browser cannot be launched\n */\n async launch(options: LaunchOptions = {}): Promise<void> {\n this.logger.info('Launching browser with options:', options);\n\n const { path, type } = this.getBrowserInfo(options);\n const viewportWidth = options?.defaultViewport?.width ?? 1280;\n const viewportHeight = options?.defaultViewport?.height ?? 800;\n\n const puppeteerLaunchOptions: puppeteer.LaunchOptions = {\n browser: type,\n executablePath: path,\n dumpio: options?.dumpio ?? false,\n headless: options?.headless ?? false,\n defaultViewport: {\n width: viewportWidth,\n height: viewportHeight,\n // Setting this value to 0 will reset this value to the system default.\n // This parameter combined with `captureBeyondViewport: false`, will resolve the screenshot blinking issue.\n deviceScaleFactor: 0,\n },\n ...(options.userDataDir && {\n userDataDir: options.userDataDir,\n }),\n args: [\n '--no-sandbox',\n '--mute-audio',\n '--disable-gpu',\n '--disable-blink-features=AutomationControlled',\n '--disable-infobars',\n '--disable-background-timer-throttling',\n '--disable-popup-blocking',\n '--disable-backgrounding-occluded-windows',\n '--disable-renderer-backgrounding',\n '--disable-window-activation',\n '--disable-focus-on-load',\n '--no-default-browser-check', // disable default browser check\n '--disable-web-security', // disable CORS\n '--disable-features=IsolateOrigins,site-per-process',\n '--disable-site-isolation-trials',\n `--window-size=${viewportWidth},${viewportHeight + 90}`,\n options?.proxy ? `--proxy-server=${options.proxy}` : '',\n options?.proxyBypassList\n ? `--proxy-bypass-list=${options.proxyBypassList}`\n : '',\n options?.profilePath\n ? `--profile-directory=${options.profilePath}`\n : '',\n ...(options.args ?? []),\n ].filter((item) => {\n if (type === 'firefox') {\n // firefox not support rules\n if (\n item === '--disable-features=IsolateOrigins,site-per-process' ||\n item === `--window-size=${viewportWidth},${viewportHeight + 90}`\n ) {\n return false;\n }\n\n return !!item;\n }\n\n // chrome/edge\n return !!item;\n }),\n ignoreDefaultArgs: ['--enable-automation'],\n timeout: options.timeout ?? 0,\n downloadBehavior: {\n policy: 'deny',\n },\n };\n\n this.logger.info('Launch options:', puppeteerLaunchOptions);\n\n try {\n this.browser = await puppeteer.launch(puppeteerLaunchOptions);\n await this.setupPageListener();\n this.logger.success('Browser launched successfully');\n } catch (error) {\n this.logger.error('Failed to launch browser:', error);\n throw error;\n }\n }\n\n private getBrowserInfo(options: LaunchOptions = {}) {\n // pptr only support 'chrome' and 'firefox'\n const map: Record<BrowserType, Exclude<BrowserType, 'edge'>> = {\n chrome: 'chrome',\n edge: 'chrome',\n firefox: 'firefox',\n };\n\n let browserPath = options.executablePath;\n let browserType = options.browserType && map[options.browserType];\n\n if (!browserPath) {\n const browserInfo = new BrowserFinder(this.logger).findBrowser();\n browserPath = browserInfo.path;\n browserType = map[browserInfo.type];\n } else {\n if (!browserType) {\n const lowercasePath = browserPath.toLowerCase();\n\n if (lowercasePath.includes('chrome')) {\n browserType = 'chrome';\n } else if (lowercasePath.includes('edge')) {\n browserType = 'chrome'; // pptr only support 'chrome' and 'firefox'\n } else if (lowercasePath.includes('firefox')) {\n browserType = 'firefox';\n } else {\n browserType = 'chrome';\n }\n }\n }\n\n this.logger.info('Using executable path:', browserPath);\n\n return {\n path: browserPath,\n type: browserType,\n };\n }\n}\n"],"names":["LocalBrowser","BaseBrowser","options","_options_defaultViewport","_options_defaultViewport1","path","type","viewportWidth","viewportHeight","puppeteerLaunchOptions","item","puppeteer","error","map","browserPath","browserType","lowercasePath","browserInfo","BrowserFinder"],"mappings":"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"}