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( fn: () => Promise, options: RetryOptions = {}, ): Promise { 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", ); } }, }); }