fix: normalize abort signals for telegram fetch

This commit is contained in:
Peter Steinberger
2026-01-21 16:46:49 +00:00
parent fb164b321e
commit 0e003cb7f1
7 changed files with 88 additions and 24 deletions

29
src/infra/fetch.ts Normal file
View File

@@ -0,0 +1,29 @@
export function wrapFetchWithAbortSignal(fetchImpl: typeof fetch): typeof fetch {
return (input: RequestInfo | URL, init?: RequestInit) => {
const signal = init?.signal;
if (!signal) return fetchImpl(input, init);
if (typeof AbortSignal !== "undefined" && signal instanceof AbortSignal) {
return fetchImpl(input, init);
}
if (typeof AbortController === "undefined") {
return fetchImpl(input, init);
}
if (typeof signal.addEventListener !== "function") {
return fetchImpl(input, init);
}
const controller = new AbortController();
const onAbort = () => controller.abort();
if (signal.aborted) {
controller.abort();
} else {
signal.addEventListener("abort", onAbort, { once: true });
}
const response = fetchImpl(input, { ...init, signal: controller.signal });
if (typeof signal.removeEventListener === "function") {
void response.finally(() => {
signal.removeEventListener("abort", onAbort);
});
}
return response;
};
}