retry.tsTypeScript
export async function withRetry<T>(run: () => Promise<T>, tries = 3): Promise<T> {
  for (let i = 1; ; i++) {
    try {
      return await run();
    } catch (err) {
      if (i >= tries) throw err;
      await new Promise((r) => setTimeout(r, 250 * 2 ** i)); // wait 0.5 s, then 1 s, then 2 s before trying again
    }
  }
}