From 5348bf78025d467775435cfdfeee6b6d195128bf Mon Sep 17 00:00:00 2001 From: Emanuele Triuzzi Date: Thu, 7 May 2026 14:45:40 +0200 Subject: [PATCH] fix(browser): raise protocolTimeout to 10min for heavy pages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Heavy pages (e.g. dev bundles >100MB) cannot ack `Network.enable` and other auto-attached CDP domain calls within puppeteer's default 180s. Once the timeout fires, puppeteer marks the connection dead and every subsequent call throws `Network.enable timed out` — only daemon restart recovers. Set `protocolTimeout: 600000` on both `puppeteer.connect()` and `puppeteer.launch()`. Env-overridable via `CHROME_DEVTOOLS_PROTOCOL_TIMEOUT_MS` for power users. Hit in real workloads against a Brightcove Studio dev bundle (~160MB JS) where the default timeout fired before `list_pages` could complete, leaving the daemon permanently wedged. --- src/browser.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/browser.ts b/src/browser.ts index 7deea75b4..90c3392f9 100644 --- a/src/browser.ts +++ b/src/browser.ts @@ -20,6 +20,17 @@ import {puppeteer} from './third_party/index.js'; let browser: Browser | undefined; +// Heavy pages (e.g. dev bundles >100MB) cannot ack `Network.enable` and +// other auto-attached domain calls within puppeteer's default 180s. +// Once that fires, the CDP connection is marked dead and every +// subsequent call throws — only daemon restart recovers. Bumping the +// ceiling to 10min covers realistic loads; override via env for power +// users. +const PROTOCOL_TIMEOUT_MS = parseInt( + process.env.CHROME_DEVTOOLS_PROTOCOL_TIMEOUT_MS ?? '600000', + 10, +); + function makeTargetFilter(enableExtensions = false) { const ignoredPrefixes = new Set(['chrome://', 'chrome-untrusted://']); if (!enableExtensions) { @@ -61,6 +72,7 @@ export async function ensureBrowserConnected(options: { targetFilter: makeTargetFilter(enableExtensions), defaultViewport: null, handleDevToolsAsPage: true, + protocolTimeout: PROTOCOL_TIMEOUT_MS, }; let autoConnect = false; @@ -228,6 +240,7 @@ export async function launch(options: McpLaunchOptions): Promise { ignoreDefaultArgs: ignoreDefaultArgs, acceptInsecureCerts: options.acceptInsecureCerts, handleDevToolsAsPage: true, + protocolTimeout: PROTOCOL_TIMEOUT_MS, enableExtensions: options.enableExtensions, }); if (options.logFile) {