chore(extension): start relay before creating MCP server (#548)

* HTTPS server launched and the relay server is created before MCP
server. This way we can pass CDP endpoint to its constructor.
* MCP HTTP transport is added to precreated HTTP server.
* A bunch of renames to fix style issues.
This commit is contained in:
Yury Semikhatsky
2025-06-13 16:13:40 -07:00
committed by GitHub
parent 6c3f3b6576
commit 96e234012d
5 changed files with 55 additions and 36 deletions

View File

@@ -14,16 +14,15 @@
* limitations under the License.
*/
import type http from 'http';
import { Option, program } from 'commander';
// @ts-ignore
import { startTraceViewerServer } from 'playwright-core/lib/server';
import { httpAddressToString, startHttpTransport, startStdioTransport } from './transport.js';
import { startHttpServer, startHttpTransport, startStdioTransport } from './transport.js';
import { resolveCLIConfig } from './config.js';
import { Server } from './server.js';
import { packageJSON } from './package.js';
import { CDPBridgeServer } from './cdp-relay.js';
import { startCDPRelayServer } from './cdpRelay.js';
program
.version('Version ' + packageJSON.version)
@@ -57,12 +56,19 @@ program
.addOption(new Option('--extension', 'Allow connecting to a running browser instance (Edge/Chrome only). Requires the \'Playwright MCP\' browser extension to be installed.').hideHelp())
.action(async options => {
const config = await resolveCLIConfig(options);
const server = new Server(config, { forceCdp: !!config.extension });
const httpServer = config.server.port !== undefined ? await startHttpServer(config.server) : undefined;
if (config.extension) {
if (!httpServer)
throw new Error('--port parameter is required for extension mode');
// Point CDP endpoint to the relay server.
config.browser.cdpEndpoint = await startCDPRelayServer(httpServer);
}
const server = new Server(config);
server.setupExitWatchdog();
let httpServer: http.Server | undefined = undefined;
if (config.server.port !== undefined)
httpServer = await startHttpTransport(server);
if (httpServer)
await startHttpTransport(httpServer, server);
else
await startStdioTransport(server);
@@ -73,14 +79,6 @@ program
// eslint-disable-next-line no-console
console.error('\nTrace viewer listening on ' + url);
}
if (config.extension && httpServer) {
const wsAddress = httpAddressToString(httpServer.address()).replace(/^http/, 'ws');
config.browser.cdpEndpoint = `${wsAddress}${CDPBridgeServer.CDP_PATH}`;
const cdpRelayServer = new CDPBridgeServer(httpServer);
process.on('exit', () => cdpRelayServer.stop());
// eslint-disable-next-line no-console
console.error(`CDP relay server started on ${wsAddress}${CDPBridgeServer.EXTENSION_PATH} - Connect to it using the browser extension.`);
}
});
function semicolonSeparatedList(value: string): string[] {