/** * Runs the function `fn` * and retries automatically if it fails. * * Tries max `1 + retries` times * with `retryIntervalMs` milliseconds between retries. * * From https://mtsknn.fi/blog/js-retry-on-fail/ */ export const retry = async ( fn: () => Promise | T, { retries, retryIntervalMs }: { retries: number; retryIntervalMs: number }, ): Promise => { try { return await fn(); } catch (error) { if (retries <= 0) { throw error; } await sleep(retryIntervalMs); return retry(fn, { retries: retries - 1, retryIntervalMs }); } }; export const sleep = (ms = 0) => new Promise((resolve) => setTimeout(resolve, ms));