Files
dc-recorder/src/retry.ts

43 lines
797 B
TypeScript
Raw Normal View History

import pRetry from "p-retry";
import type { Logger } from "pino";
export interface RetryOptions {
retries?: number;
minTimeout?: number;
maxTimeout?: number;
factor?: number;
logger?: Logger;
}
export async function retryWithBackoff<T>(
fn: () => Promise<T>,
options: RetryOptions = {},
): Promise<T> {
const {
retries = 3,
minTimeout = 1000,
maxTimeout = 30000,
factor = 2,
logger,
} = options;
return pRetry(fn, {
retries,
minTimeout,
maxTimeout,
factor,
onFailedAttempt: (error) => {
if (logger) {
logger.warn(
{
attempt: error.attemptNumber,
retriesLeft: error.retriesLeft,
error: error.message,
},
"Retry attempt",
);
}
},
});
}