@@ -892,14 +892,10 @@ export async function fetchJson(url, options = {}) {
|
892 | 892 | let removeExternalAbort = () => {}; |
893 | 893 | const abortPromise = externalSignal |
894 | 894 | ? new Promise((_, reject) => { |
895 | | -const abortError = () => |
896 | | -externalSignal.reason instanceof Error |
897 | | - ? externalSignal.reason |
898 | | - : new Error("fetch aborted"); |
899 | 895 | const onAbort = () => { |
900 | | -const error = abortError(); |
| 896 | +const error = getExternalAbortReason(externalSignal); |
901 | 897 | controller.abort(error); |
902 | | -reject(new Error(error.message, { cause: error })); |
| 898 | +reject(createExternalAbortError(externalSignal)); |
903 | 899 | }; |
904 | 900 | if (externalSignal.aborted) { |
905 | 901 | onAbort(); |
@@ -939,7 +935,7 @@ export async function fetchJson(url, options = {}) {
|
939 | 935 | if (attempt >= attempts || !isRetryableTransientNetworkError(error)) { |
940 | 936 | throw error; |
941 | 937 | } |
942 | | -await delay(options.retryDelayMs ?? 250); |
| 938 | +await delayWithAbort(options.retryDelayMs ?? 250, externalSignal); |
943 | 939 | } finally { |
944 | 940 | removeExternalAbort(); |
945 | 941 | if (timeout) { |
@@ -950,6 +946,33 @@ export async function fetchJson(url, options = {}) {
|
950 | 946 | throw toLintErrorObject(lastError ?? new Error(`fetch ${url} failed`), "Non-Error thrown"); |
951 | 947 | } |
952 | 948 | |
| 949 | +function getExternalAbortReason(signal) { |
| 950 | +return signal?.reason instanceof Error ? signal.reason : new Error("fetch aborted"); |
| 951 | +} |
| 952 | + |
| 953 | +function createExternalAbortError(signal) { |
| 954 | +const reason = getExternalAbortReason(signal); |
| 955 | +return new Error(reason.message, { cause: reason }); |
| 956 | +} |
| 957 | + |
| 958 | +async function delayWithAbort(delayMs, signal) { |
| 959 | +if (!signal) { |
| 960 | +await delay(delayMs); |
| 961 | +return; |
| 962 | +} |
| 963 | +if (signal.aborted) { |
| 964 | +throw createExternalAbortError(signal); |
| 965 | +} |
| 966 | +try { |
| 967 | +await delay(delayMs, undefined, { signal }); |
| 968 | +} catch (error) { |
| 969 | +if (signal.aborted) { |
| 970 | +throw createExternalAbortError(signal); |
| 971 | +} |
| 972 | +throw error; |
| 973 | +} |
| 974 | +} |
| 975 | + |
953 | 976 | export async function readBoundedResponseText(response, byteLimit, timeoutPromise) { |
954 | 977 | const resolvedByteLimit = byteLimit ?? resolveKitchenSinkRpcConfig().fetchBodyMaxBytes; |
955 | 978 | const contentLength = response.headers?.get?.("content-length"); |
|