Fix: make fetch-retry bail out AbortError from undici

This commit is contained in:
SukkaW 2024-10-10 16:53:38 +08:00
parent 6e65b9406f
commit d7a24b431a

View File

@ -7,6 +7,7 @@ function isClientError(err: unknown): err is NodeJS.ErrnoException {
if ('code' in err) return err.code === 'ERR_UNESCAPED_CHARACTERS'; if ('code' in err) return err.code === 'ERR_UNESCAPED_CHARACTERS';
if ('message' in err) return err.message === 'Request path contains 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; return false;
} }
@ -100,28 +101,33 @@ function createFetchRetry($fetch: typeof fetch): FetchWithRetry {
|| ('digest' in err && err.digest === 'AbortError') || ('digest' in err && err.digest === 'AbortError')
) && !retryOpts.retryOnAborted) { ) && !retryOpts.retryOnAborted) {
console.log(picocolors.gray('[fetch abort]'), url); console.log(picocolors.gray('[fetch abort]'), url);
return bail(err) as never; return true;
} }
if (err.name === 'Custom304NotModifiedError') { if (err.name === 'Custom304NotModifiedError') {
return bail(err) as never; return true;
} }
if (err.name === 'CustomNoETagFallbackError') { 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) { if (err instanceof AggregateError) {
for (const e of err.errors) { 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 // Do not retry on 404
if (err instanceof ResponseError && err.res.status === 404) { if (err instanceof ResponseError && err.res.status === 404) {