Skip to content

Retry With Delay

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

ksRetryWithDelay.ts

import {
  ksMapTo,
  ksOf,
  ksRetryWhen,
  ksSwitch,
  ksTimeout,
  none,
  some,
} from '@keiii/k-stream';

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

/**
 * Retry some action regularly with specific delay between.
 */
export const ksRetryWithDelay = <E, A>({
  stopWhen = (n: number) => n > 3,
  delay = (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(delay(attempt)).pipe(ksMapTo(none));
      }),
    ),
  );
};
Clone this wiki locally