export async function withTimeout<T>(
work: (signal: AbortSignal | undefined) => Promise<T>,
timeoutMs?: number,
label?: string,
): Promise<T> {
const resolved =
typeof timeoutMs === "number" && Number.isFinite(timeoutMs)
? Math.max(1 , Math.floor(timeoutMs))
: undefined;
if (!resolved) {
return await work(undefined);
}
const abortCtrl = new AbortController();
const timeoutError = new Error(`${label ?? "request" } timed out`);
const timer = setTimeout(() => abortCtrl.abort(timeoutError), resolved);
timer.unref?.();
let abortListener: (() => void ) | undefined;
const abortPromise: Promise<never> = abortCtrl.signal.aborted
? Promise.reject(abortCtrl.signal.reason ?? timeoutError)
: new Promise((_, reject) => {
abortListener = () => reject(abortCtrl.signal.reason ?? timeoutError);
abortCtrl.signal.addEventListener("abort" , abortListener, { once: true });
});
try {
return await Promise.race([work(abortCtrl.signal), abortPromise]);
} finally {
clearTimeout(timer);
if (abortListener) {
abortCtrl.signal.removeEventListener("abort" , abortListener);
}
}
}
Messung V0.5 in Prozent C=100 H=100 G=100
¤ Dauer der Verarbeitung: 0.14 Sekunden
(vorverarbeitet am 2026-06-05)
¤
*© Formatika GbR, Deutschland