From 54ae11e87a97d1d9ae9f317310497c0e00c5b014 Mon Sep 17 00:00:00 2001 From: artboy <80608452+itxaiohanglover@users.noreply.github.com> Date: Sat, 20 Jun 2026 13:59:25 +0800 Subject: [PATCH] fix(retry): make retry delay responsive to abort signal The withRetry function only checked abortSignal at the start of each retry attempt. During the retry delay (up to 30s with default config), the abort signal was ignored, causing abort to not take effect until the next attempt cycle. Fix: use setTimeout + abort event listener so the delay promise rejects immediately when the signal fires. --- src/utils/retry.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/utils/retry.ts b/src/utils/retry.ts index 458de18..a948037 100644 --- a/src/utils/retry.ts +++ b/src/utils/retry.ts @@ -84,9 +84,19 @@ export async function withRetry( throw err } - // Wait before retry + // Wait before retry (abortable — responds to abort signal during delay) const delay = getRetryDelay(attempt, config) - await new Promise((resolve) => setTimeout(resolve, delay)) + await new Promise((resolve, reject) => { + const timer = setTimeout(resolve, delay) + abortSignal?.addEventListener( + 'abort', + () => { + clearTimeout(timer) + reject(new Error('Aborted')) + }, + { once: true }, + ) + }) } }