From 366ee11a806077292f85fe95cf2a80ca459c96b3 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 14 Apr 2026 02:23:03 +0100 Subject: [PATCH] test: bound canvas auth helper waits --- src/gateway/server.canvas-auth.test.ts | 34 +++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/src/gateway/server.canvas-auth.test.ts b/src/gateway/server.canvas-auth.test.ts index 0dfc81f3a5b..86b5bc817ee 100644 --- a/src/gateway/server.canvas-auth.test.ts +++ b/src/gateway/server.canvas-auth.test.ts @@ -13,6 +13,8 @@ import { withTempConfig } from "./test-temp-config.js"; const WS_REJECT_TIMEOUT_MS = 2_000; const WS_CONNECT_TIMEOUT_MS = 5_000; +const HTTP_REQUEST_TIMEOUT_MS = 5_000; +const SERVER_CLOSE_TIMEOUT_MS = 5_000; function isConnectionReset(value: unknown): boolean { let current: unknown = value; @@ -30,13 +32,33 @@ function isConnectionReset(value: unknown): boolean { } async function fetchCanvas(input: string, init?: RequestInit): Promise { + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(), HTTP_REQUEST_TIMEOUT_MS); try { - return await fetch(input, init); + return await fetch(input, { ...init, signal: controller.signal }); } catch (err) { if (isConnectionReset(err)) { - return await fetch(input, init); + return await fetch(input, { ...init, signal: controller.signal }); } throw err; + } finally { + clearTimeout(timer); + } +} + +async function withTimeout(promise: Promise, timeoutMs: number, label: string): Promise { + let timer: ReturnType | undefined; + try { + return await Promise.race([ + promise, + new Promise((_, reject) => { + timer = setTimeout(() => reject(new Error(`${label} timed out`)), timeoutMs); + }), + ]); + } finally { + if (timer) { + clearTimeout(timer); + } } } @@ -65,8 +87,12 @@ async function listen( for (const socket of sockets) { socket.destroy(); } - await new Promise((resolve, reject) => - server.close((err) => (err ? reject(err) : resolve())), + await withTimeout( + new Promise((resolve, reject) => + server.close((err) => (err ? reject(err) : resolve())), + ), + SERVER_CLOSE_TIMEOUT_MS, + "gateway test server close", ); }, };