{"version":3,"file":"retryManager.cjs","names":["extractErrorMessage"],"sources":["../../../src/utils/retryManager.ts"],"sourcesContent":["import { logger } from '../logger';\nimport { extractErrorMessage } from './extractErrorMessage';\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?: (details: {\n    error: string;\n    attempt: number;\n    maxRetry: number;\n  }) => void;\n  /** function to call when the maximum number of retries is reached */\n  onMaxTryReached?: (details: {\n    error: string;\n    attempt: number;\n    maxRetry: number;\n  }) => void;\n};\n\nconst DEFAULT_MAX_RETRY = 3;\nconst DEFAULT_DELAY = 0;\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      onMaxTryReached,\n    }: RetryManagerOptions = {}\n  ): ((...args: Args) => Promise<R>) =>\n  // ───────────────────────────────^ returned wrapper function\n  async (...args: Args): Promise<R> => {\n    let lastError: unknown;\n\n    for (let attempt = 0; attempt <= maxRetry; attempt++) {\n      try {\n        return await fn(...args);\n      } catch (err) {\n        lastError = err;\n        const error = extractErrorMessage(err);\n\n        // If this was the last attempt, handle max retry reached\n        if (attempt >= maxRetry) {\n          if (onMaxTryReached) {\n            onMaxTryReached?.({ error, attempt, maxRetry });\n            return null as R;\n          }\n\n          // Otherwise, throw the error\n          throw err;\n        }\n\n        if (onError) {\n          onError?.({ error, attempt, maxRetry });\n        } else {\n          logger(error, {\n            level: 'error',\n          });\n        }\n\n        // Wait before retrying\n        if (delay > 0) {\n          await new Promise((res) => setTimeout(res, delay));\n        }\n      }\n    }\n\n    // This should never be reached, but TypeScript needs it\n    throw (\n      lastError ?? new Error('Unexpected: retry loop completed without result')\n    );\n  };\n"],"mappings":";;;;;AAsBA,MAAM,oBAAoB;AAC1B,MAAM,gBAAgB;;;;;;;;AAStB,MAAa,gBAET,IACA,EACE,WAAW,mBACX,QAAQ,eACR,SACA,oBACuB,EAAE,KAG7B,OAAO,GAAG,SAA2B;CACnC,IAAI;AAEJ,MAAK,IAAI,UAAU,GAAG,WAAW,UAAU,UACzC,KAAI;AACF,SAAO,MAAM,GAAG,GAAG,KAAK;UACjB,KAAK;AACZ,cAAY;EACZ,MAAM,QAAQA,sDAAoB,IAAI;AAGtC,MAAI,WAAW,UAAU;AACvB,OAAI,iBAAiB;AACnB,sBAAkB;KAAE;KAAO;KAAS;KAAU,CAAC;AAC/C,WAAO;;AAIT,SAAM;;AAGR,MAAI,QACF,WAAU;GAAE;GAAO;GAAS;GAAU,CAAC;MAEvC,uBAAO,OAAO,EACZ,OAAO,SACR,CAAC;AAIJ,MAAI,QAAQ,EACV,OAAM,IAAI,SAAS,QAAQ,WAAW,KAAK,MAAM,CAAC;;AAMxD,OACE,6BAAa,IAAI,MAAM,kDAAkD"}