From e5bc4e85ec5669399ea506233632b118dead0692 Mon Sep 17 00:00:00 2001 From: morluto <76467478+morluto@users.noreply.github.com> Date: Sun, 11 Oct 2026 11:04:26 +0800 Subject: [PATCH] fix(ci): close speculative browser fixture connections --- scripts/lib/browser-scenario-storage-e2e.mjs | 3 +++ scripts/verify-real-browser.mjs | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/scripts/lib/browser-scenario-storage-e2e.mjs b/scripts/lib/browser-scenario-storage-e2e.mjs index 601a10053..9cba53763 100644 --- a/scripts/lib/browser-scenario-storage-e2e.mjs +++ b/scripts/lib/browser-scenario-storage-e2e.mjs @@ -176,6 +176,9 @@ const startStorageSite = async () => { origin: `http://127.0.0.1:${port}`, close: async () => { server.close(); + // Chrome can leave speculative TCP connections without an HTTP request; + // server.close() alone waits indefinitely for those owned sockets. + server.closeAllConnections(); await once(server, "close"); }, }; diff --git a/scripts/verify-real-browser.mjs b/scripts/verify-real-browser.mjs index 224b20780..48c9bec08 100644 --- a/scripts/verify-real-browser.mjs +++ b/scripts/verify-real-browser.mjs @@ -277,11 +277,13 @@ try { throw new Error("Scenario attachment terminated its external browser"); const profilesBefore = await scenarioProfiles(); + process.stderr.write("Browser verifier: scenario environment\n"); const scenarioEnvironment = await verifyScenarioEnvironment( endpoint, target, site.origin, ); + process.stderr.write("Browser verifier: scenario storage\n"); const scenarioStorage = await verifyScenarioStorage({ executable, endpoint, @@ -339,7 +341,9 @@ try { `Browser scenario included unselected structured value: ${unselectedValue}`, ); + process.stderr.write("Browser verifier: large screenshot\n"); const largeScreenshot = await verifyLargeScreenshotE2e(endpoint, site.origin); + process.stderr.write("Browser verifier: popup coverage\n"); const popupEvents = await verifyPopupEventCoverage(executable); const networkEvidence = await verifyBrowserNetworkEvidence( executable,