OneSearch MCP Server
by yokingma
Verified
- one-search-mcp
- src
- libs
- browser
/*
* Copyright (c) 2025 Bytedance, Inc. and its affiliates.
* SPDX-License-Identifier: Apache-2.0
*/
import * as puppeteer from 'puppeteer-core';
import { LaunchOptions } from './types.js';
import { BrowserFinder } from './finder.js';
import { BaseBrowser } from './base.js';
/**
* LocalBrowser class for controlling locally installed browsers
* Extends the BaseBrowser with functionality specific to managing local browser instances
* @extends BaseBrowser
*/
export class LocalBrowser extends BaseBrowser {
/**
* Browser finder instance to detect and locate installed browsers
* @private
*/
private browserFinder = new BrowserFinder();
/**
* Launches a local browser instance with specified options
* Automatically detects installed browsers if no executable path is provided
* @param {LaunchOptions} options - Configuration options for launching the browser
* @returns {Promise<void>} Promise that resolves when the browser is successfully launched
* @throws {Error} If the browser cannot be launched
*/
async launch(options: LaunchOptions = {}): Promise<void> {
this.logger.info('Launching browser with options:', options);
const executablePath =
options?.executablePath || this.browserFinder.findBrowser().executable;
this.logger.info('Using executable path:', executablePath);
const viewportWidth = options?.defaultViewport?.width ?? 1280;
const viewportHeight = options?.defaultViewport?.height ?? 800;
const puppeteerLaunchOptions: puppeteer.LaunchOptions = {
executablePath,
headless: options?.headless ?? false,
defaultViewport: {
width: viewportWidth,
height: viewportHeight,
},
args: [
'--no-sandbox',
'--mute-audio',
'--disable-gpu',
'--disable-http2',
'--disable-blink-features=AutomationControlled',
'--disable-infobars',
'--disable-background-timer-throttling',
'--disable-popup-blocking',
'--disable-backgrounding-occluded-windows',
'--disable-renderer-backgrounding',
'--disable-window-activation',
'--disable-focus-on-load',
'--no-default-browser-check', // disable default browser check
'--disable-web-security', // disable CORS
'--disable-features=IsolateOrigins,site-per-process',
'--disable-site-isolation-trials',
`--window-size=${viewportWidth},${viewportHeight + 90}`,
options?.proxy ? `--proxy-server=${options.proxy}` : '',
options?.profilePath
? `--profile-directory=${options.profilePath}`
: '',
].filter(Boolean),
ignoreDefaultArgs: ['--enable-automation'],
timeout: options.timeout ?? 0,
downloadBehavior: {
policy: 'deny',
},
};
this.logger.info('Launch options:', puppeteerLaunchOptions);
try {
this.browser = await puppeteer.launch(puppeteerLaunchOptions);
await this.setupPageListener();
this.logger.success('Browser launched successfully');
} catch (error) {
this.logger.error('Failed to launch browser:', error);
throw error;
}
}
}
ID: rk8s2qldo1