From 15b2827fc178ac7ed748c23fed12e5a44f081db4 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Fri, 17 Apr 2026 09:59:12 +0530 Subject: [PATCH] test(gateway): stabilize canvas auth fetch retries --- src/gateway/server.canvas-auth.test.ts | 43 +++++++++++--------------- 1 file changed, 18 insertions(+), 25 deletions(-) diff --git a/src/gateway/server.canvas-auth.test.ts b/src/gateway/server.canvas-auth.test.ts index e18c244e2c2..7391af0845a 100644 --- a/src/gateway/server.canvas-auth.test.ts +++ b/src/gateway/server.canvas-auth.test.ts @@ -16,34 +16,27 @@ 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; - for (let depth = 0; depth < 4; depth += 1) { - if (!current || typeof current !== "object") { - return false; - } - const record = current as { code?: unknown; cause?: unknown }; - if (record.code === "ECONNRESET") { - return true; - } - current = record.cause; - } - return false; -} - 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, signal: controller.signal }); - } catch (err) { - if (isConnectionReset(err)) { - return await fetch(input, { ...init, signal: controller.signal }); + const headers = new Headers(init?.headers); + headers.set("connection", "close"); + for (let attempt = 0; attempt < 2; attempt += 1) { + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(), HTTP_REQUEST_TIMEOUT_MS); + try { + return await fetch(input, { + ...init, + headers, + signal: controller.signal, + }); + } catch (error) { + if (attempt === 1) { + throw error; + } + } finally { + clearTimeout(timer); } - throw err; - } finally { - clearTimeout(timer); } + throw new Error("unreachable"); } async function withTimeout(promise: Promise, timeoutMs: number, label: string): Promise {