Skip to content

Retry With Delay

Ivan Kasenkov edited this page Jul 27, 2021 · 5 revisions

ksRetryWithDelay.ts

type RetryWithDelayCfg =
  | {
      stopWhen?: (attempt: number) => boolean;
      timeScale?: (attempt: number) => number;
    }
  | undefined;

export const ksRetryWithDelay = <E, A>({
  stopWhen = (n: number) => n > 3,
  timeScale = (n: number) => n * 1_000,
}: RetryWithDelayCfg = {}) => {
  let attempt = 0;
  return ksRetryWhen<E, A>(errors =>
    errors.pipe(
      ksSwitch(error => {
        return stopWhen(++attempt)
          ? // stop retry
            ksOf(some(error))
          : // retry with delay
            ksTimeout(timeScale(attempt)).pipe(ksMapTo(none));
      }),
    ),
  );
};
Clone this wiki locally