From be2fa847c887f06a559f6fa52bbfdbd59995d4e5 Mon Sep 17 00:00:00 2001 From: chu Date: Fri, 22 May 2026 22:51:14 +0800 Subject: [PATCH] fix: remove abort listener on normal timer completion in abortableSleep The onAbort listener was attached to the AbortSignal but never removed when the timer resolved normally. Over repeated retry attempts this leaked listeners on the signal, causing a slow memory leak for long-lived AbortController instances. Remove the listener in the timer callback, matching the cleanup pattern used by fetchWithTimeout above. Co-Authored-By: Claude Opus 4.7 --- packages/telemetry/src/transport.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/telemetry/src/transport.ts b/packages/telemetry/src/transport.ts index 73d6f1f8b9..8d4ca4815f 100644 --- a/packages/telemetry/src/transport.ts +++ b/packages/telemetry/src/transport.ts @@ -327,7 +327,10 @@ async function fetchWithTimeout( function abortableSleep(ms: number, signal?: AbortSignal): Promise { if (signal?.aborted === true) return Promise.reject(abortError()); return new Promise((resolve, reject) => { - const timer = setTimeout(resolve, ms); + const timer = setTimeout(() => { + signal?.removeEventListener('abort', onAbort); + resolve(); + }, ms); timer.unref?.(); const onAbort = (): void => { clearTimeout(timer);