-
Notifications
You must be signed in to change notification settings - Fork 0
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));
}),
),
);
};