{"version":3,"sources":["../../../src/internals/helpers/retry.ts"],"names":["pRetry","fn","options","handler","attempt","remaining","factor","ms","Math","round","pow","setTimeout","undefined","signal","e","meta","FrameworkError","isAbortError","cause","onFailedAttempt","shouldRetry","signalRace","retries"],"mappings":";;;;;;;;AAsBA,eAAsBA,MAAAA,CACpBC,IACAC,OAAAA,EAAiB;AAEjB,EAAA,MAAMC,OAAAA,mBAAU,MAAA,CAAA,OAAOC,OAAAA,EAAiBC,SAAAA,KAAAA;AACtC,IAAA,IAAI;AACF,MAAA,MAAMC,MAAAA,GAASJ,SAASI,MAAAA,IAAU,CAAA;AAClC,MAAA,IAAIF,UAAU,CAAA,EAAG;AACf,QAAA,MAAMG,EAAAA,GAAKC,KAAKC,KAAAA,CAAMD,IAAAA,CAAKE,IAAIJ,MAAAA,EAAQF,OAAAA,GAAU,CAAA,CAAA,CAAA,GAAM,GAAA;AACvD,QAAA,MAAMO,mBAAAA,CAAWJ,IAAIK,KAAAA,CAAAA,EAAW;AAC9BC,UAAAA,MAAAA,EAAQX,OAAAA,EAASW;SACnB,CAAA;AACF,MAAA;AAEA,MAAA,OAAO,MAAMZ,GAAGG,OAAAA,CAAAA;AAClB,IAAA,CAAA,CAAA,OAASU,CAAAA,EAAG;AACV,MAAA,MAAMC,IAAAA,GAAa;AACjBX,QAAAA,OAAAA;AACAC,QAAAA;AACF,OAAA;AAEA,MAAA,IAAIW,yBAAAA,CAAeC,YAAAA,CAAaH,CAAAA,CAAAA,EAAI;AAClC,QAAA,MAAMA,EAAEI,KAAAA,IAASJ,CAAAA;AACnB,MAAA;AAEA,MAAA,MAAMZ,OAAAA,EAASiB,eAAAA,GAAkBL,CAAAA,EAAGC,IAAAA,CAAAA;AACpC,MAAA,IAAIV,aAAa,CAAA,EAAG;AAClB,QAAA,MAAMS,CAAAA;AACR,MAAA;AAEA,MAAA,IAAK,MAAMZ,OAAAA,EAASkB,WAAAA,GAAcN,CAAAA,EAAGC,IAAAA,MAAW,KAAA,EAAO;AACrD,QAAA,MAAMD,CAAAA;AACR,MAAA;AACA,MAAA,OAAO,MAAMX,OAAAA,CAAQC,OAAAA,GAAU,CAAA,EAAGC,YAAY,CAAA,CAAA;AAChD,IAAA;EACF,CAAA,EA/BgB,SAAA,CAAA;AAiChB,EAAA,OAAO,MAAMgB,sBAAAA,CAAW,MAAMlB,OAAAA,CAAQ,CAAA,EAAGD,SAASoB,OAAAA,IAAW,CAAA,CAAA,EAAIpB,OAAAA,EAASW,MAAAA,CAAAA;AAC5E;AAtCsBb,MAAAA,CAAAA,MAAAA,EAAAA,QAAAA,CAAAA","file":"retry.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { setTimeout } from \"node:timers/promises\";\nimport { signalRace } from \"@/internals/helpers/promise.js\";\nimport { FrameworkError } from \"@/errors.js\";\n\ninterface Meta {\n  attempt: number;\n  remaining: number;\n}\n\ninterface Options {\n  signal?: AbortSignal;\n  factor?: number;\n  retries?: number;\n  shouldRetry?: (e: Error, meta: Meta) => boolean | Promise<boolean>;\n  onFailedAttempt?: (e: Error, meta: Meta) => void | Promise<void>;\n}\n\nexport async function pRetry<T>(\n  fn: (attempt: number) => Promise<T>,\n  options?: Options,\n): Promise<T> {\n  const handler = async (attempt: number, remaining: number) => {\n    try {\n      const factor = options?.factor ?? 2;\n      if (attempt > 1) {\n        const ms = Math.round(Math.pow(factor, attempt - 1)) * 1000;\n        await setTimeout(ms, undefined, {\n          signal: options?.signal,\n        });\n      }\n\n      return await fn(attempt);\n    } catch (e) {\n      const meta: Meta = {\n        attempt,\n        remaining,\n      };\n\n      if (FrameworkError.isAbortError(e)) {\n        throw e.cause || e;\n      }\n\n      await options?.onFailedAttempt?.(e, meta);\n      if (remaining <= 0) {\n        throw e;\n      }\n\n      if ((await options?.shouldRetry?.(e, meta)) === false) {\n        throw e;\n      }\n      return await handler(attempt + 1, remaining - 1);\n    }\n  };\n\n  return await signalRace(() => handler(1, options?.retries ?? 0), options?.signal);\n}\n"]}