From 6b614d559d56107484ffd7d16ee749be1bc558e0 Mon Sep 17 00:00:00 2001 From: Firdavs <102187486+Firdavs9512@users.noreply.github.com> Date: Wed, 18 Mar 2026 07:40:27 +0000 Subject: [PATCH] fix: clear timeout timer in runSource to prevent event loop hang The Promise.race timeout was never cleared on success/failure, keeping the Node event loop alive for ~30s after fast sweeps. Co-Authored-By: Claude Opus 4.6 (1M context) --- apis/briefing.mjs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/apis/briefing.mjs b/apis/briefing.mjs index 5e3e8e4..94e4173 100644 --- a/apis/briefing.mjs +++ b/apis/briefing.mjs @@ -47,15 +47,18 @@ const SOURCE_TIMEOUT_MS = 30_000; // 30s max per individual source export async function runSource(name, fn, ...args) { const start = Date.now(); + let timer; try { const dataPromise = fn(...args); - const timeoutPromise = new Promise((_, reject) => - setTimeout(() => reject(new Error(`Source ${name} timed out after ${SOURCE_TIMEOUT_MS / 1000}s`)), SOURCE_TIMEOUT_MS) - ); + const timeoutPromise = new Promise((_, reject) => { + timer = setTimeout(() => reject(new Error(`Source ${name} timed out after ${SOURCE_TIMEOUT_MS / 1000}s`)), SOURCE_TIMEOUT_MS); + }); const data = await Promise.race([dataPromise, timeoutPromise]); return { name, status: 'ok', durationMs: Date.now() - start, data }; } catch (e) { return { name, status: 'error', durationMs: Date.now() - start, error: e.message }; + } finally { + clearTimeout(timer); } }