{"version":3,"sources":["../../src/retryManager.ts"],"sourcesContent":["import { logger } from './logger';\n\nexport type RetryManagerOptions = {\n  /** maximum number of retries before giving up */\n  maxRetry?: number;\n  /** delay between attempts, in milliseconds */\n  delay?: number;\n  /** function to call when an error occurs */\n  onError?: (err: Error) => void;\n};\n\nconst DEFAULT_MAX_RETRY = 3;\nconst DEFAULT_DELAY = 60_000; // 60 seconds\n\n/**\n * Wrap an async function `fn` so it’s retried on failure.\n *\n * @param fn       The async function to wrap\n * @param options  { maxRetry, delay }\n * @returns        A new function with the same signature as `fn`\n */\nexport const retryManager =\n  <Args extends any[], R>(\n    fn: (...args: Args) => Promise<R>,\n    {\n      maxRetry = DEFAULT_MAX_RETRY,\n      delay = DEFAULT_DELAY,\n      onError,\n    }: RetryManagerOptions = {}\n  ): ((...args: Args) => Promise<R>) =>\n  // ───────────────────────────────^ returned wrapper function\n  async (...args: Args): Promise<R> => {\n    for (let attempt = 0; ; attempt++) {\n      try {\n        return await fn(...args);\n      } catch (err) {\n        onError?.(err as Error);\n        logger(['Request failed', err], {\n          level: 'error',\n        });\n        if (attempt >= maxRetry) throw err; // out of retries\n        if (delay > 0) await new Promise((res) => setTimeout(res, delay));\n      }\n    }\n  };\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAuB;AAWvB,MAAM,oBAAoB;AAC1B,MAAM,gBAAgB;AASf,MAAM,eACX,CACE,IACA;AAAA,EACE,WAAW;AAAA,EACX,QAAQ;AAAA,EACR;AACF,IAAyB,CAAC;AAAA;AAAA,EAG5B,UAAU,SAA2B;AACnC,aAAS,UAAU,KAAK,WAAW;AACjC,UAAI;AACF,eAAO,MAAM,GAAG,GAAG,IAAI;AAAA,MACzB,SAAS,KAAK;AACZ,kBAAU,GAAY;AACtB,kCAAO,CAAC,kBAAkB,GAAG,GAAG;AAAA,UAC9B,OAAO;AAAA,QACT,CAAC;AACD,YAAI,WAAW,SAAU,OAAM;AAC/B,YAAI,QAAQ,EAAG,OAAM,IAAI,QAAQ,CAAC,QAAQ,WAAW,KAAK,KAAK,CAAC;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAAA;","names":[]}