From d7a24b431a3086565a8cb6dc1c9deb3c1e93bc8e Mon Sep 17 00:00:00 2001 From: SukkaW Date: Thu, 10 Oct 2024 16:53:38 +0800 Subject: [PATCH] Fix: make fetch-retry bail out AbortError from undici --- Build/lib/fetch-retry.ts | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/Build/lib/fetch-retry.ts b/Build/lib/fetch-retry.ts index 9ed4d79e..2c4d4adb 100644 --- a/Build/lib/fetch-retry.ts +++ b/Build/lib/fetch-retry.ts @@ -7,6 +7,7 @@ function isClientError(err: unknown): err is NodeJS.ErrnoException { if ('code' in err) return err.code === 'ERR_UNESCAPED_CHARACTERS'; if ('message' in err) return err.message === 'Request path contains unescaped characters'; + if ('name' in err) return err.name === 'DOMException' || err.name === 'AbortError'; return false; } @@ -100,28 +101,33 @@ function createFetchRetry($fetch: typeof fetch): FetchWithRetry { || ('digest' in err && err.digest === 'AbortError') ) && !retryOpts.retryOnAborted) { console.log(picocolors.gray('[fetch abort]'), url); - return bail(err) as never; + return true; } if (err.name === 'Custom304NotModifiedError') { - return bail(err) as never; + return true; } if (err.name === 'CustomNoETagFallbackError') { - return bail(err) as never; + return true; } } - if (isClientError(err)) { - return bail(err) as never; - } + + return !!(isClientError(err)); + }; + + if (mayBailError(err)) { + return bail(err) as never; }; - mayBailError(err); if (err instanceof AggregateError) { for (const e of err.errors) { - mayBailError(e); + if (mayBailError(e)) { + // bail original error + return bail(err) as never; + }; } } - console.log(picocolors.gray('[fetch fail]'), url, (err as any).name, err); + console.log(picocolors.gray('[fetch fail]'), url, { name: (err as any).name }, err); // Do not retry on 404 if (err instanceof ResponseError && err.res.status === 404) {