@agent-infra/browser 0.0.3-beta.0 → 0.1.1-beta.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/base-browser.d.ts +5 -0
- package/dist/base-browser.d.ts.map +1 -1
- package/dist/base-browser.js +13 -1
- package/dist/base-browser.js.map +1 -1
- package/dist/base-browser.mjs +12 -0
- package/dist/base-browser.mjs.map +1 -1
- package/dist/browser-finder/chrome-paths.js +1 -1
- package/dist/browser-finder/firefox-paths.js +1 -1
- package/dist/browser-finder/index.js +1 -1
- package/dist/index.js +1 -1
- package/dist/local-browser.d.ts.map +1 -1
- package/dist/local-browser.js +6 -1
- package/dist/local-browser.js.map +1 -1
- package/dist/local-browser.mjs +5 -0
- package/dist/local-browser.mjs.map +1 -1
- package/dist/remote-browser.d.ts +3 -4
- package/dist/remote-browser.d.ts.map +1 -1
- package/dist/remote-browser.js +4 -5
- package/dist/remote-browser.js.map +1 -1
- package/dist/remote-browser.mjs +3 -4
- package/dist/remote-browser.mjs.map +1 -1
- package/dist/types.d.ts +17 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/package.json +3 -3
package/dist/base-browser.d.ts
CHANGED
|
@@ -36,6 +36,11 @@ export declare abstract class BaseBrowser implements BrowserInterface {
|
|
|
36
36
|
* @param {BaseBrowserOptions} [options] - Configuration options
|
|
37
37
|
*/
|
|
38
38
|
constructor(options?: BaseBrowserOptions);
|
|
39
|
+
/**
|
|
40
|
+
* Check if the browser instance is active and responding
|
|
41
|
+
* @returns {Promise<boolean>} True if browser is active, false otherwise
|
|
42
|
+
*/
|
|
43
|
+
isBrowserAlive(): Promise<boolean>;
|
|
39
44
|
/**
|
|
40
45
|
* Get the underlying Puppeteer browser instance
|
|
41
46
|
* @throws Error if browser is not launched
|
|
@@ -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;;;;;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;
|
|
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"}
|
package/dist/base-browser.js
CHANGED
|
@@ -16,7 +16,7 @@ var __webpack_require__ = {};
|
|
|
16
16
|
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
17
17
|
})();
|
|
18
18
|
(()=>{
|
|
19
|
-
__webpack_require__.r =
|
|
19
|
+
__webpack_require__.r = (exports1)=>{
|
|
20
20
|
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
21
21
|
value: 'Module'
|
|
22
22
|
});
|
|
@@ -42,6 +42,18 @@ function _define_property(obj, key, value) {
|
|
|
42
42
|
return obj;
|
|
43
43
|
}
|
|
44
44
|
class BaseBrowser {
|
|
45
|
+
async isBrowserAlive() {
|
|
46
|
+
if (!this.browser) return false;
|
|
47
|
+
try {
|
|
48
|
+
const version = await this.browser.version();
|
|
49
|
+
this.logger.info('Browser version:', version);
|
|
50
|
+
return true;
|
|
51
|
+
} catch (error) {
|
|
52
|
+
this.logger.warn('Browser instance is no longer active:', error);
|
|
53
|
+
this.browser = null;
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
45
57
|
getBrowser() {
|
|
46
58
|
if (!this.browser) throw new Error('Browser not launched');
|
|
47
59
|
return this.browser;
|
package/dist/base-browser.js.map
CHANGED
|
@@ -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 * 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 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","Error","target","page","_this_browser","error","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.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":"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"}
|
package/dist/base-browser.mjs
CHANGED
|
@@ -14,6 +14,18 @@ function _define_property(obj, key, value) {
|
|
|
14
14
|
return obj;
|
|
15
15
|
}
|
|
16
16
|
class BaseBrowser {
|
|
17
|
+
async isBrowserAlive() {
|
|
18
|
+
if (!this.browser) return false;
|
|
19
|
+
try {
|
|
20
|
+
const version = await this.browser.version();
|
|
21
|
+
this.logger.info('Browser version:', version);
|
|
22
|
+
return true;
|
|
23
|
+
} catch (error) {
|
|
24
|
+
this.logger.warn('Browser instance is no longer active:', error);
|
|
25
|
+
this.browser = null;
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
17
29
|
getBrowser() {
|
|
18
30
|
if (!this.browser) throw new Error('Browser not launched');
|
|
19
31
|
return this.browser;
|
|
@@ -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 * 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 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","Error","target","page","_this_browser","error","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;\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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"}
|
|
@@ -25,7 +25,7 @@ var __webpack_require__ = {};
|
|
|
25
25
|
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
26
26
|
})();
|
|
27
27
|
(()=>{
|
|
28
|
-
__webpack_require__.r =
|
|
28
|
+
__webpack_require__.r = (exports1)=>{
|
|
29
29
|
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
30
30
|
value: 'Module'
|
|
31
31
|
});
|
|
@@ -25,7 +25,7 @@ var __webpack_require__ = {};
|
|
|
25
25
|
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
26
26
|
})();
|
|
27
27
|
(()=>{
|
|
28
|
-
__webpack_require__.r =
|
|
28
|
+
__webpack_require__.r = (exports1)=>{
|
|
29
29
|
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
30
30
|
value: 'Module'
|
|
31
31
|
});
|
|
@@ -16,7 +16,7 @@ var __webpack_require__ = {};
|
|
|
16
16
|
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
17
17
|
})();
|
|
18
18
|
(()=>{
|
|
19
|
-
__webpack_require__.r =
|
|
19
|
+
__webpack_require__.r = (exports1)=>{
|
|
20
20
|
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
21
21
|
value: 'Module'
|
|
22
22
|
});
|
package/dist/index.js
CHANGED
|
@@ -51,7 +51,7 @@ function __webpack_require__(moduleId) {
|
|
|
51
51
|
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
52
52
|
})();
|
|
53
53
|
(()=>{
|
|
54
|
-
__webpack_require__.r =
|
|
54
|
+
__webpack_require__.r = (exports1)=>{
|
|
55
55
|
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
56
56
|
value: 'Module'
|
|
57
57
|
});
|
|
@@ -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;
|
|
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"}
|
package/dist/local-browser.js
CHANGED
|
@@ -16,7 +16,7 @@ var __webpack_require__ = {};
|
|
|
16
16
|
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
17
17
|
})();
|
|
18
18
|
(()=>{
|
|
19
|
-
__webpack_require__.r =
|
|
19
|
+
__webpack_require__.r = (exports1)=>{
|
|
20
20
|
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
21
21
|
value: 'Module'
|
|
22
22
|
});
|
|
@@ -43,12 +43,16 @@ class LocalBrowser extends external_base_browser_js_namespaceObject.BaseBrowser
|
|
|
43
43
|
const puppeteerLaunchOptions = {
|
|
44
44
|
browser: type,
|
|
45
45
|
executablePath: path,
|
|
46
|
+
dumpio: (null == options ? void 0 : options.dumpio) ?? false,
|
|
46
47
|
headless: (null == options ? void 0 : options.headless) ?? false,
|
|
47
48
|
defaultViewport: {
|
|
48
49
|
width: viewportWidth,
|
|
49
50
|
height: viewportHeight,
|
|
50
51
|
deviceScaleFactor: 0
|
|
51
52
|
},
|
|
53
|
+
...options.userDataDir && {
|
|
54
|
+
userDataDir: options.userDataDir
|
|
55
|
+
},
|
|
52
56
|
args: [
|
|
53
57
|
'--no-sandbox',
|
|
54
58
|
'--mute-audio',
|
|
@@ -68,6 +72,7 @@ class LocalBrowser extends external_base_browser_js_namespaceObject.BaseBrowser
|
|
|
68
72
|
'--disable-site-isolation-trials',
|
|
69
73
|
`--window-size=${viewportWidth},${viewportHeight + 90}`,
|
|
70
74
|
(null == options ? void 0 : options.proxy) ? `--proxy-server=${options.proxy}` : '',
|
|
75
|
+
(null == options ? void 0 : options.proxyBypassList) ? `--proxy-bypass-list=${options.proxyBypassList}` : '',
|
|
71
76
|
(null == options ? void 0 : options.profilePath) ? `--profile-directory=${options.profilePath}` : '',
|
|
72
77
|
...options.args ?? []
|
|
73
78
|
].filter((item)=>{
|
|
@@ -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 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 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?.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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeO,MAAMA,qBAAqBC,yCAAAA,WAAWA;IAQ3C,MAAM,OAAOC,UAAyB,CAAC,CAAC,EAAiB;YAIjCC,0BACCC;QAJvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmCF;QAEpD,MAAM,EAAEG,IAAI,EAAEC,IAAI,EAAE,GAAG,IAAI,CAAC,cAAc,CAACJ;QAC3C,MAAMK,gBAAgBJ,AAAAA,CAAAA,QAAAA,UAAAA,KAAAA,IAAAA,AAAwB,SAAxBA,CAAAA,2BAAAA,QAAS,eAAe,AAAD,KAAvBA,AAAAA,KAAAA,MAAAA,2BAAAA,KAAAA,IAAAA,yBAA0B,KAAK,AAAD,KAAK;QACzD,MAAMK,iBAAiBJ,AAAAA,CAAAA,QAAAA,UAAAA,KAAAA,IAAAA,AAAwB,SAAxBA,CAAAA,4BAAAA,QAAS,eAAe,AAAD,KAAvBA,AAAAA,KAAAA,MAAAA,4BAAAA,KAAAA,IAAAA,0BAA0B,MAAM,AAAD,KAAK;QAE3D,MAAMK,yBAAkD;YACtD,SAASH;YACT,gBAAgBD;YAChB,
|
|
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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"}
|
package/dist/local-browser.mjs
CHANGED
|
@@ -15,12 +15,16 @@ class LocalBrowser extends __WEBPACK_EXTERNAL_MODULE__base_browser_mjs_64d751a3_
|
|
|
15
15
|
const puppeteerLaunchOptions = {
|
|
16
16
|
browser: type,
|
|
17
17
|
executablePath: path,
|
|
18
|
+
dumpio: (null == options ? void 0 : options.dumpio) ?? false,
|
|
18
19
|
headless: (null == options ? void 0 : options.headless) ?? false,
|
|
19
20
|
defaultViewport: {
|
|
20
21
|
width: viewportWidth,
|
|
21
22
|
height: viewportHeight,
|
|
22
23
|
deviceScaleFactor: 0
|
|
23
24
|
},
|
|
25
|
+
...options.userDataDir && {
|
|
26
|
+
userDataDir: options.userDataDir
|
|
27
|
+
},
|
|
24
28
|
args: [
|
|
25
29
|
'--no-sandbox',
|
|
26
30
|
'--mute-audio',
|
|
@@ -40,6 +44,7 @@ class LocalBrowser extends __WEBPACK_EXTERNAL_MODULE__base_browser_mjs_64d751a3_
|
|
|
40
44
|
'--disable-site-isolation-trials',
|
|
41
45
|
`--window-size=${viewportWidth},${viewportHeight + 90}`,
|
|
42
46
|
(null == options ? void 0 : options.proxy) ? `--proxy-server=${options.proxy}` : '',
|
|
47
|
+
(null == options ? void 0 : options.proxyBypassList) ? `--proxy-bypass-list=${options.proxyBypassList}` : '',
|
|
43
48
|
(null == options ? void 0 : options.profilePath) ? `--profile-directory=${options.profilePath}` : '',
|
|
44
49
|
...options.args ?? []
|
|
45
50
|
].filter((item)=>{
|
|
@@ -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 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 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?.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":";;;;;;;AAeO,MAAMA,qBAAqBC,uDAAAA,WAAWA;IAQ3C,MAAM,OAAOC,UAAyB,CAAC,CAAC,EAAiB;YAIjCC,0BACCC;QAJvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmCF;QAEpD,MAAM,EAAEG,IAAI,EAAEC,IAAI,EAAE,GAAG,IAAI,CAAC,cAAc,CAACJ;QAC3C,MAAMK,gBAAgBJ,AAAAA,CAAAA,QAAAA,UAAAA,KAAAA,IAAAA,AAAwB,SAAxBA,CAAAA,2BAAAA,QAAS,eAAe,AAAD,KAAvBA,AAAAA,KAAAA,MAAAA,2BAAAA,KAAAA,IAAAA,yBAA0B,KAAK,AAAD,KAAK;QACzD,MAAMK,iBAAiBJ,AAAAA,CAAAA,QAAAA,UAAAA,KAAAA,IAAAA,AAAwB,SAAxBA,CAAAA,4BAAAA,QAAS,eAAe,AAAD,KAAvBA,AAAAA,KAAAA,MAAAA,4BAAAA,KAAAA,IAAAA,0BAA0B,MAAM,AAAD,KAAK;QAE3D,MAAMK,yBAAkD;YACtD,SAASH;YACT,gBAAgBD;YAChB,
|
|
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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"}
|
package/dist/remote-browser.d.ts
CHANGED
|
@@ -5,13 +5,12 @@ import { LaunchOptions } from './types';
|
|
|
5
5
|
* @extends BaseBrowserOptions
|
|
6
6
|
* @interface RemoteBrowserOptions
|
|
7
7
|
* @property {string} [wsEndpoint] - WebSocket endpoint URL for direct connection
|
|
8
|
-
* @property {string} [
|
|
9
|
-
* @property {number} [port] - Remote debugging port (default: 9222)
|
|
8
|
+
* @property {string} [cdpEndpoint] - Remote Chrome DevTools Protocol endpoint
|
|
10
9
|
*/
|
|
11
10
|
export interface RemoteBrowserOptions extends BaseBrowserOptions {
|
|
12
11
|
wsEndpoint?: string;
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
/** @default http://localhost:9222/json/version */
|
|
13
|
+
cdpEndpoint?: string;
|
|
15
14
|
}
|
|
16
15
|
/**
|
|
17
16
|
* RemoteBrowser class for connecting to remote browser instances
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-browser.d.ts","sourceRoot":"","sources":["../src/remote-browser.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC
|
|
1
|
+
{"version":3,"file":"remote-browser.d.ts","sourceRoot":"","sources":["../src/remote-browser.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC;;;;;;GAMG;AACH,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,aAAc,SAAQ,WAAW;IAKhC,OAAO,CAAC,OAAO,CAAC;IAJ5B;;;OAGG;gBACiB,OAAO,CAAC,EAAE,oBAAoB,YAAA;IAIlD;;;;;;OAMG;IACG,MAAM,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CA6BrD"}
|
package/dist/remote-browser.js
CHANGED
|
@@ -16,7 +16,7 @@ var __webpack_require__ = {};
|
|
|
16
16
|
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
17
17
|
})();
|
|
18
18
|
(()=>{
|
|
19
|
-
__webpack_require__.r =
|
|
19
|
+
__webpack_require__.r = (exports1)=>{
|
|
20
20
|
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
21
21
|
value: 'Module'
|
|
22
22
|
});
|
|
@@ -48,10 +48,9 @@ class RemoteBrowser extends external_base_browser_js_namespaceObject.BaseBrowser
|
|
|
48
48
|
this.logger.info('Browser Launch options:', options);
|
|
49
49
|
let browserWSEndpoint = null === (_this_options = this.options) || void 0 === _this_options ? void 0 : _this_options.wsEndpoint;
|
|
50
50
|
if (!browserWSEndpoint) {
|
|
51
|
-
var _this_options1
|
|
52
|
-
const
|
|
53
|
-
const
|
|
54
|
-
const response = await fetch(`http://${host}:${port}/json/version`);
|
|
51
|
+
var _this_options1;
|
|
52
|
+
const cdpEndpoint = (null === (_this_options1 = this.options) || void 0 === _this_options1 ? void 0 : _this_options1.cdpEndpoint) || "http://127.0.0.1:9222/json/version";
|
|
53
|
+
const response = await fetch(cdpEndpoint);
|
|
55
54
|
const { webSocketDebuggerUrl } = await response.json();
|
|
56
55
|
browserWSEndpoint = webSocketDebuggerUrl;
|
|
57
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-browser.js","sources":["webpack://@agent-infra/browser/./src/remote-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 { BaseBrowser, BaseBrowserOptions } from './base-browser';\nimport { LaunchOptions } from './types';\n\n/**\n * Configuration options for RemoteBrowser\n * @extends BaseBrowserOptions\n * @interface RemoteBrowserOptions\n * @property {string} [wsEndpoint] - WebSocket endpoint URL for direct connection\n * @property {string} [
|
|
1
|
+
{"version":3,"file":"remote-browser.js","sources":["webpack://@agent-infra/browser/./src/remote-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 { BaseBrowser, BaseBrowserOptions } from './base-browser';\nimport { LaunchOptions } from './types';\n\n/**\n * Configuration options for RemoteBrowser\n * @extends BaseBrowserOptions\n * @interface RemoteBrowserOptions\n * @property {string} [wsEndpoint] - WebSocket endpoint URL for direct connection\n * @property {string} [cdpEndpoint] - Remote Chrome DevTools Protocol endpoint\n */\nexport interface RemoteBrowserOptions extends BaseBrowserOptions {\n wsEndpoint?: string;\n /** @default http://localhost:9222/json/version */\n cdpEndpoint?: string;\n}\n\n/**\n * RemoteBrowser class for connecting to remote browser instances\n *\n * Currently, this RemoteBrowser is not production ready,\n * mainly because it still relies on `puppeteer-core`,\n * which can only run on Node.js.\n *\n * At the same time, Chrome instances built with\n * `--remote-debugging-address` on Linux have security risks\n *\n * @see https://issues.chromium.org/issues/41487252\n * @see https://issues.chromium.org/issues/40261787\n * @see https://github.com/pyppeteer/pyppeteer/pull/379\n * @see https://stackoverflow.com/questions/72760355/chrome-remote-debugging-not-working-computer-to-computer\n *\n * @extends BaseBrowser\n */\nexport class RemoteBrowser extends BaseBrowser {\n /**\n * Creates a new RemoteBrowser instance\n * @param {RemoteBrowserOptions} [options] - Configuration options for remote browser connection\n */\n constructor(private options?: RemoteBrowserOptions) {\n super(options);\n }\n\n /**\n * Connects to a remote browser instance using WebSocket\n * If no WebSocket endpoint is provided, attempts to discover it using the DevTools Protocol\n * @param {LaunchOptions} [options] - Launch configuration options\n * @returns {Promise<void>} Promise that resolves when connected to the remote browser\n * @throws {Error} If connection to the remote browser fails\n */\n async launch(options?: LaunchOptions): Promise<void> {\n this.logger.info('Browser Launch options:', options);\n\n let browserWSEndpoint = this.options?.wsEndpoint;\n\n if (!browserWSEndpoint) {\n const cdpEndpoint =\n this.options?.cdpEndpoint || `http://127.0.0.1:9222/json/version`;\n const response = await fetch(cdpEndpoint);\n const { webSocketDebuggerUrl } = await response.json();\n browserWSEndpoint = webSocketDebuggerUrl;\n }\n\n this.logger.info('Using WebSocket endpoint:', browserWSEndpoint);\n\n const puppeteerConnectOptions: puppeteer.ConnectOptions = {\n browserWSEndpoint,\n defaultViewport: options?.defaultViewport ?? { width: 1280, height: 800 },\n };\n\n try {\n this.browser = await puppeteer.connect(puppeteerConnectOptions);\n await this.setupPageListener();\n this.logger.success('Connected to remote browser successfully');\n } catch (error) {\n this.logger.error('Failed to connect to remote browser:', error);\n throw error;\n }\n }\n}\n"],"names":["RemoteBrowser","BaseBrowser","options","_this_options","browserWSEndpoint","_this_options1","cdpEndpoint","response","fetch","webSocketDebuggerUrl","puppeteerConnectOptions","puppeteer","error"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGC;;;;;;;;;;AAmCM,MAAMA,sBAAsBC,yCAAAA,WAAWA;IAgB5C,MAAM,OAAOC,OAAuB,EAAiB;YAG3BC;QAFxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2BD;QAE5C,IAAIE,oBAAoB,AAAY,SAAZD,CAAAA,gBAAAA,IAAI,CAAC,OAAO,AAAD,KAAXA,AAAAA,KAAAA,MAAAA,gBAAAA,KAAAA,IAAAA,cAAc,UAAU;QAEhD,IAAI,CAACC,mBAAmB;gBAEpBC;YADF,MAAMC,cACJD,AAAAA,CAAY,SAAZA,CAAAA,iBAAAA,IAAI,CAAC,OAAO,AAAD,KAAXA,AAAAA,KAAAA,MAAAA,iBAAAA,KAAAA,IAAAA,eAAc,WAAW,AAAD,KAAK;YAC/B,MAAME,WAAW,MAAMC,MAAMF;YAC7B,MAAM,EAAEG,oBAAoB,EAAE,GAAG,MAAMF,SAAS,IAAI;YACpDH,oBAAoBK;QACtB;QAEA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6BL;QAE9C,MAAMM,0BAAoD;YACxDN;YACA,iBAAiBF,AAAAA,CAAAA,QAAAA,UAAAA,KAAAA,IAAAA,QAAS,eAAe,AAAD,KAAK;gBAAE,OAAO;gBAAM,QAAQ;YAAI;QAC1E;QAEA,IAAI;YACF,IAAI,CAAC,OAAO,GAAG,MAAMS,wCAAAA,OAAiB,CAACD;YACvC,MAAM,IAAI,CAAC,iBAAiB;YAC5B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QACtB,EAAE,OAAOE,OAAO;YACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wCAAwCA;YAC1D,MAAMA;QACR;IACF;IAvCA,YAAoBV,OAA8B,CAAE;QAClD,KAAK,CAACA,UAAAA,iBAAAA,IAAAA,EAAAA,WAAAA,KAAAA,IAAAA,IAAAA,CADYA,OAAO,GAAPA;IAEpB;AAsCF"}
|
package/dist/remote-browser.mjs
CHANGED
|
@@ -20,10 +20,9 @@ class RemoteBrowser extends __WEBPACK_EXTERNAL_MODULE__base_browser_mjs_64d751a3
|
|
|
20
20
|
this.logger.info('Browser Launch options:', options);
|
|
21
21
|
let browserWSEndpoint = null === (_this_options = this.options) || void 0 === _this_options ? void 0 : _this_options.wsEndpoint;
|
|
22
22
|
if (!browserWSEndpoint) {
|
|
23
|
-
var _this_options1
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const response = await fetch(`http://${host}:${port}/json/version`);
|
|
23
|
+
var _this_options1;
|
|
24
|
+
const cdpEndpoint = (null === (_this_options1 = this.options) || void 0 === _this_options1 ? void 0 : _this_options1.cdpEndpoint) || "http://127.0.0.1:9222/json/version";
|
|
25
|
+
const response = await fetch(cdpEndpoint);
|
|
27
26
|
const { webSocketDebuggerUrl } = await response.json();
|
|
28
27
|
browserWSEndpoint = webSocketDebuggerUrl;
|
|
29
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-browser.mjs","sources":["webpack://@agent-infra/browser/./src/remote-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 { BaseBrowser, BaseBrowserOptions } from './base-browser';\nimport { LaunchOptions } from './types';\n\n/**\n * Configuration options for RemoteBrowser\n * @extends BaseBrowserOptions\n * @interface RemoteBrowserOptions\n * @property {string} [wsEndpoint] - WebSocket endpoint URL for direct connection\n * @property {string} [
|
|
1
|
+
{"version":3,"file":"remote-browser.mjs","sources":["webpack://@agent-infra/browser/./src/remote-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 { BaseBrowser, BaseBrowserOptions } from './base-browser';\nimport { LaunchOptions } from './types';\n\n/**\n * Configuration options for RemoteBrowser\n * @extends BaseBrowserOptions\n * @interface RemoteBrowserOptions\n * @property {string} [wsEndpoint] - WebSocket endpoint URL for direct connection\n * @property {string} [cdpEndpoint] - Remote Chrome DevTools Protocol endpoint\n */\nexport interface RemoteBrowserOptions extends BaseBrowserOptions {\n wsEndpoint?: string;\n /** @default http://localhost:9222/json/version */\n cdpEndpoint?: string;\n}\n\n/**\n * RemoteBrowser class for connecting to remote browser instances\n *\n * Currently, this RemoteBrowser is not production ready,\n * mainly because it still relies on `puppeteer-core`,\n * which can only run on Node.js.\n *\n * At the same time, Chrome instances built with\n * `--remote-debugging-address` on Linux have security risks\n *\n * @see https://issues.chromium.org/issues/41487252\n * @see https://issues.chromium.org/issues/40261787\n * @see https://github.com/pyppeteer/pyppeteer/pull/379\n * @see https://stackoverflow.com/questions/72760355/chrome-remote-debugging-not-working-computer-to-computer\n *\n * @extends BaseBrowser\n */\nexport class RemoteBrowser extends BaseBrowser {\n /**\n * Creates a new RemoteBrowser instance\n * @param {RemoteBrowserOptions} [options] - Configuration options for remote browser connection\n */\n constructor(private options?: RemoteBrowserOptions) {\n super(options);\n }\n\n /**\n * Connects to a remote browser instance using WebSocket\n * If no WebSocket endpoint is provided, attempts to discover it using the DevTools Protocol\n * @param {LaunchOptions} [options] - Launch configuration options\n * @returns {Promise<void>} Promise that resolves when connected to the remote browser\n * @throws {Error} If connection to the remote browser fails\n */\n async launch(options?: LaunchOptions): Promise<void> {\n this.logger.info('Browser Launch options:', options);\n\n let browserWSEndpoint = this.options?.wsEndpoint;\n\n if (!browserWSEndpoint) {\n const cdpEndpoint =\n this.options?.cdpEndpoint || `http://127.0.0.1:9222/json/version`;\n const response = await fetch(cdpEndpoint);\n const { webSocketDebuggerUrl } = await response.json();\n browserWSEndpoint = webSocketDebuggerUrl;\n }\n\n this.logger.info('Using WebSocket endpoint:', browserWSEndpoint);\n\n const puppeteerConnectOptions: puppeteer.ConnectOptions = {\n browserWSEndpoint,\n defaultViewport: options?.defaultViewport ?? { width: 1280, height: 800 },\n };\n\n try {\n this.browser = await puppeteer.connect(puppeteerConnectOptions);\n await this.setupPageListener();\n this.logger.success('Connected to remote browser successfully');\n } catch (error) {\n this.logger.error('Failed to connect to remote browser:', error);\n throw error;\n }\n }\n}\n"],"names":["RemoteBrowser","BaseBrowser","options","_this_options","browserWSEndpoint","_this_options1","cdpEndpoint","response","fetch","webSocketDebuggerUrl","puppeteerConnectOptions","puppeteer","error"],"mappings":";;;;;;AAGC;;;;;;;;;;AAmCM,MAAMA,sBAAsBC,uDAAAA,WAAWA;IAgB5C,MAAM,OAAOC,OAAuB,EAAiB;YAG3BC;QAFxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2BD;QAE5C,IAAIE,oBAAoB,AAAY,SAAZD,CAAAA,gBAAAA,IAAI,CAAC,OAAO,AAAD,KAAXA,AAAAA,KAAAA,MAAAA,gBAAAA,KAAAA,IAAAA,cAAc,UAAU;QAEhD,IAAI,CAACC,mBAAmB;gBAEpBC;YADF,MAAMC,cACJD,AAAAA,CAAY,SAAZA,CAAAA,iBAAAA,IAAI,CAAC,OAAO,AAAD,KAAXA,AAAAA,KAAAA,MAAAA,iBAAAA,KAAAA,IAAAA,eAAc,WAAW,AAAD,KAAK;YAC/B,MAAME,WAAW,MAAMC,MAAMF;YAC7B,MAAM,EAAEG,oBAAoB,EAAE,GAAG,MAAMF,SAAS,IAAI;YACpDH,oBAAoBK;QACtB;QAEA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6BL;QAE9C,MAAMM,0BAAoD;YACxDN;YACA,iBAAiBF,AAAAA,CAAAA,QAAAA,UAAAA,KAAAA,IAAAA,QAAS,eAAe,AAAD,KAAK;gBAAE,OAAO;gBAAM,QAAQ;YAAI;QAC1E;QAEA,IAAI;YACF,IAAI,CAAC,OAAO,GAAG,MAAMS,oDAAAA,OAAiB,CAACD;YACvC,MAAM,IAAI,CAAC,iBAAiB;YAC5B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QACtB,EAAE,OAAOE,OAAO;YACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wCAAwCA;YAC1D,MAAMA;QACR;IACF;IAvCA,YAAoBV,OAA8B,CAAE;QAClD,KAAK,CAACA,UAAAA,iBAAAA,IAAAA,EAAAA,WAAAA,KAAAA,IAAAA,IAAAA,CADYA,OAAO,GAAPA;IAEpB;AAsCF"}
|
package/dist/types.d.ts
CHANGED
|
@@ -9,6 +9,12 @@ export interface LaunchOptions {
|
|
|
9
9
|
* Additional command line arguments to pass to the browser instance.
|
|
10
10
|
*/
|
|
11
11
|
args?: string[];
|
|
12
|
+
/**
|
|
13
|
+
* If true, pipes the browser process stdout and stderr to `process.stdout`
|
|
14
|
+
* and `process.stderr`.
|
|
15
|
+
* @defaultValue `false`
|
|
16
|
+
*/
|
|
17
|
+
dumpio?: boolean;
|
|
12
18
|
/**
|
|
13
19
|
* Whether to run browser in headless mode
|
|
14
20
|
* @default false
|
|
@@ -47,6 +53,17 @@ export interface LaunchOptions {
|
|
|
47
53
|
* Used to route browser traffic through a proxy server
|
|
48
54
|
*/
|
|
49
55
|
proxy?: string;
|
|
56
|
+
/**
|
|
57
|
+
* Proxy bypass list, e.g. '*.example.com,*.test.com'
|
|
58
|
+
* Used to bypass the proxy server for specific domains
|
|
59
|
+
*/
|
|
60
|
+
proxyBypassList?: string;
|
|
61
|
+
/**
|
|
62
|
+
* Path to a user data directory.
|
|
63
|
+
* {@link https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/user_data_dir.md | see the Chromium docs}
|
|
64
|
+
* for more info.
|
|
65
|
+
*/
|
|
66
|
+
userDataDir?: string;
|
|
50
67
|
}
|
|
51
68
|
/**
|
|
52
69
|
* Options for evaluating JavaScript in a new page
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErE,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAExD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAE1B;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,eAAe,CAAC,EAAE;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErE,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAExD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAE1B;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,eAAe,CAAC,EAAE;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,MAAM,WAAW,wBAAwB,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC;IAC1D;;;OAGG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC;;;;;;OAMG;IACH,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;IAEhD;;;OAGG;IACH,kBAAkB,EAAE,CAAC,CAAC;IAEtB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtD;;;;;OAKG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErD;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC9D;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,MAAM,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/C;;;OAGG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;;OAGG;IACH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B;;;;;;;OAOG;IACH,iBAAiB,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,EAClC,OAAO,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,GACtC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAErB;;;OAGG;IACH,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC"}
|
package/dist/types.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"use strict";
|
|
6
6
|
var __webpack_require__ = {};
|
|
7
7
|
(()=>{
|
|
8
|
-
__webpack_require__.r =
|
|
8
|
+
__webpack_require__.r = (exports1)=>{
|
|
9
9
|
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
10
10
|
value: 'Module'
|
|
11
11
|
});
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-infra/browser",
|
|
3
3
|
"description": "A tiny Browser Control library, built for Agent Tars.",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.1.1-beta.0",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
"puppeteer-core": "24.7.2",
|
|
20
20
|
"which": "5.0.0",
|
|
21
21
|
"edge-paths": "3.0.5",
|
|
22
|
-
"@agent-infra/
|
|
23
|
-
"@agent-infra/
|
|
22
|
+
"@agent-infra/shared": "0.0.1",
|
|
23
|
+
"@agent-infra/logger": "0.0.1"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@types/which": "3.0.4",
|