@parzh/retryable
Version:
Convenience function to retry an action
100 lines (99 loc) • 2.87 kB
TypeScript
import type { Delay } from "../delays";
export declare type OnMaxRetryCountExceeded = "resolve" | "reject" | (() => unknown);
export interface RetryerProps {
/**
* Readonly number of retries that occurred so far.
* Always 1 less than the number of total attempts.
* @example
* console.log(retry.count);
* // [attempt #1] logs 0
* // [attempt #2] logs 1
* // [attempt #3] logs 2
* // ...
*
* retry();
*/
readonly count: number;
/**
* Set value of `retry.count` for the next attempt
* @example
* retry.setCount(42);
*
* console.log(retry.count);
* // [attempt #1] logs 0
* // [attempt #2] logs 42
* // [attempt #3] logs 42
* // ...
*
* retry();
*/
setCount(newValue: number): void;
/**
* Set upper limit for the value of `retry.count`
* @param value Value of `retry.count`
* @param onExceeded (defaults to `"reject"`) Limit exceed action
* @example
* // (assuming that every attempt ends with retry)
*
* retry.setMaxCount(0);
* retry.setMaxCount(0, "reject");
* // [attempt #1] reject with "Retry limit exceeded …"
*
* retry.setMaxCount(1);
* // [attempt #1] retry
* // [attempt #2] reject with "Retry limit exceeded …"
*
* retry.setMaxCount(1, "resolve");
* retry.setMaxCount(1, resolve);
* // [attempt #1] retry
* // [attempt #2] resolve to `undefined`
*
* retry.setMaxCount(1, () => resolve(42));
* // [attempt #1] retry
* // [attempt #2] resolve to `42`
*
* retry.setMaxCount(1, () => retry.setCount(0));
* // [attempt #1] retry
* // [attempt #2] retry (update count)
* // [attempt #3] retry
* // [attempt #4] retry (update count)
* // [attempt #5] retry
* // ...
*
* retry.setMaxCount(1, () => retry.setCount(1));
* // [attempt #1] retry
* // [attempt #2] retry (update count)
* // [attempt #3] retry (update count)
* // [attempt #4] retry (update count)
* // [attempt #5] retry (update count)
* // ...
*/
setMaxCount(value: number, onExceeded?: OnMaxRetryCountExceeded): void;
/**
* Delays retry(s) by a given strategy or timer
* @param delay The delay
* @example
* retry.after(300);
* // retry after 300 milliseconds
*
* retry.after(1000);
* // retry after 1 second
*
* retry.after("exponential");
* // use "Exponential backoff" retry strategy
*
* retry.after(0);
* // retry asynchronously
*/
after(delay: Delay): void;
/**
* Cancel the delayed retry
* @example
* retry.after(1000); // won't retry
* retry.cancel();
*/
cancel(): void;
}
export default interface Retryer extends RetryerProps {
(): void;
}