@aws-cdk-testing/cli-integ
Version:
Integration tests for the AWS CDK CLI
43 lines (37 loc) • 1.16 kB
text/typescript
/**
* @param maxAttempts the maximum number of attempts
* @param interval interval in milliseconds to observe between attempts
*/
export type EventuallyOptions = {
maxAttempts?: number;
interval?: number;
};
const wait = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));
const DEFAULT_INTERVAL = 1000;
const DEFAULT_MAX_ATTEMPTS = 10;
/**
* Runs a function on an interval until the maximum number of attempts has
* been reached.
*
* Default interval = 1000 milliseconds
* Default maxAttempts = 10
*
* @param fn function to run
* @param options EventuallyOptions
*/
const eventually = async <T>(call: () => Promise<T>, options?: EventuallyOptions): Promise<T> => {
const opts = {
interval: options?.interval ? options.interval : DEFAULT_INTERVAL,
maxAttempts: options?.maxAttempts ? options.maxAttempts : DEFAULT_MAX_ATTEMPTS,
};
while (opts.maxAttempts-- >= 0) {
try {
return await call();
} catch (err) {
if (opts.maxAttempts <= 0) throw err;
}
await wait(opts.interval);
}
throw new Error('An unexpected error has occurred.');
};
export default eventually;