export type BackoffPolicy = {
initialMs: number;
maxMs: number;
factor: number;
jitter: number;
};
export function computeBackoff(policy: BackoffPolicy, attempt: number) {
const base = policy.initialMs * policy.factor ** Math.max(attempt - 1 , 0 );
const jitter = base * policy.jitter * Math.random();
return Math.min(policy.maxMs, Math.round(base + jitter));
}
export async function sleepWithAbort(ms: number, abortSignal?: AbortSignal) {
if (ms <= 0 ) {
return ;
}
await new Promise<void >((resolve, reject) => {
let settled = false ;
let timer: ReturnType<typeof setTimeout> | null = null ;
const onAbort = () => {
if (settled) {
return ;
}
settled = true ;
if (timer) {
clearTimeout(timer);
timer = null ;
}
if (abortSignal) {
abortSignal.removeEventListener("abort" , onAbort);
}
reject(new Error("aborted" , { cause: abortSignal?.reason ?? new Error("aborted" ) }));
};
if (abortSignal) {
abortSignal.addEventListener("abort" , onAbort, { once: true });
if (abortSignal.aborted) {
onAbort();
return ;
}
}
timer = setTimeout(() => {
settled = true ;
if (abortSignal) {
abortSignal.removeEventListener("abort" , onAbort);
}
timer = null ;
resolve();
}, ms);
if (abortSignal) {
if (abortSignal.aborted) {
onAbort();
}
}
});
}
Messung V0.5 in Prozent C=100 H=100 G=100
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-06-09)
¤
*© Formatika GbR, Deutschland