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 { BaseBrowser, BaseBrowserOptions } from './base.js';
import { LaunchOptions } from './types.js';
/**
* Configuration options for RemoteBrowser
* @extends BaseBrowserOptions
* @interface RemoteBrowserOptions
* @property {string} [wsEndpoint] - WebSocket endpoint URL for direct connection
* @property {string} [host] - Remote host address (default: 'localhost')
* @property {number} [port] - Remote debugging port (default: 9222)
*/
export interface RemoteBrowserOptions extends BaseBrowserOptions {
wsEndpoint?: string;
host?: string;
port?: number;
}
/**
* RemoteBrowser class for connecting to remote browser instances
*
* Currently, this RemoteBrowser is not production ready,
* mainly because it still relies on `puppeteer-core`,
* which can only run on Node.js.
*
* At the same time, Chrome instances built with
* `--remote-debugging-address` on Linux have security risks
*
* @see https://issues.chromium.org/issues/41487252
* @see https://issues.chromium.org/issues/40261787
* @see https://github.com/pyppeteer/pyppeteer/pull/379
* @see https://stackoverflow.com/questions/72760355/chrome-remote-debugging-not-working-computer-to-computer
*
* @extends BaseBrowser
*/
export class RemoteBrowser extends BaseBrowser {
/**
* Creates a new RemoteBrowser instance
* @param {RemoteBrowserOptions} [options] - Configuration options for remote browser connection
*/
constructor(private options?: RemoteBrowserOptions) {
super(options);
}
/**
* Connects to a remote browser instance using WebSocket
* If no WebSocket endpoint is provided, attempts to discover it using the DevTools Protocol
* @param {LaunchOptions} [options] - Launch configuration options
* @returns {Promise<void>} Promise that resolves when connected to the remote browser
* @throws {Error} If connection to the remote browser fails
*/
async launch(options?: LaunchOptions): Promise<void> {
this.logger.info('Browser Launch options:', options);
let browserWSEndpoint = this.options?.wsEndpoint;
if (!browserWSEndpoint) {
const host = this.options?.host || 'localhost';
const port = this.options?.port || 9222;
const response = await fetch(`http://${host}:${port}/json/version`);
const { webSocketDebuggerUrl } = await response.json();
browserWSEndpoint = webSocketDebuggerUrl;
}
this.logger.info('Using WebSocket endpoint:', browserWSEndpoint);
const puppeteerConnectOptions: puppeteer.ConnectOptions = {
browserWSEndpoint,
defaultViewport: options?.defaultViewport ?? { width: 1280, height: 800 },
};
try {
this.browser = await puppeteer.connect(puppeteerConnectOptions);
await this.setupPageListener();
this.logger.success('Connected to remote browser successfully');
} catch (error) {
this.logger.error('Failed to connect to remote browser:', error);
throw error;
}
}
}
ID: rk8s2qldo1