From ab86aab10fe093dd2d48f366d7b94789fe9be02a Mon Sep 17 00:00:00 2001 From: Stefan Stidl Date: Sun, 12 Apr 2026 15:40:32 +0200 Subject: [PATCH] http fetch timeout fix --- tests/e2e/global-setup.js | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/tests/e2e/global-setup.js b/tests/e2e/global-setup.js index 2ecaaef..5bb3c7c 100644 --- a/tests/e2e/global-setup.js +++ b/tests/e2e/global-setup.js @@ -4,16 +4,37 @@ const https = require('node:https'); const COMPOSE_FILE = 'tests/docker-compose-playwright.yml'; -function isHttpOk(url) { - return new Promise((resolve, reject) => { +function isHttpOk(url, requestTimeoutMs = 10_000) { + return new Promise((resolve) => { const client = url.startsWith('https://') ? https : http; + let settled = false; + const settle = (value) => { + if (settled) { + return; + } + settled = true; + resolve(value); + }; + const req = client.get(url, (res) => { const status = res.statusCode || 0; // Drain body so sockets can be reused/closed cleanly. res.resume(); - resolve(status >= 200 && status < 300); + settle(status >= 200 && status < 300); + }); + + req.setTimeout(requestTimeoutMs, () => { + req.destroy(new Error(`Request timed out after ${requestTimeoutMs}ms`)); + }); + + req.on('timeout', () => { + req.destroy(new Error(`Request timed out after ${requestTimeoutMs}ms`)); + }); + + req.on('error', () => { + // Connection issues/timeouts are expected while services are starting. + settle(false); }); - req.on('error', reject); }); }