{"version":3,"file":"retry.cjs","names":["patchConfigurable","isParentCommand","Command","getParentCheckpointNamespace","isGraphBubbleUp","CONFIG_KEY_RESUMING"],"sources":["../../src/pregel/retry.ts"],"sourcesContent":["import { Command, CONFIG_KEY_RESUMING } from \"../constants.js\";\nimport { isGraphBubbleUp, isParentCommand } from \"../errors.js\";\nimport type { LangGraphRunnableConfig } from \"./runnable_types.js\";\nimport { PregelExecutableTask } from \"./types.js\";\nimport { getParentCheckpointNamespace } from \"./utils/config.js\";\nimport { patchConfigurable, type RetryPolicy } from \"./utils/index.js\";\n\nexport const DEFAULT_INITIAL_INTERVAL = 500;\nexport const DEFAULT_BACKOFF_FACTOR = 2;\nexport const DEFAULT_MAX_INTERVAL = 128000;\nexport const DEFAULT_MAX_RETRIES = 3;\n\nconst DEFAULT_STATUS_NO_RETRY = [\n  400, // Bad Request\n  401, // Unauthorized\n  402, // Payment Required\n  403, // Forbidden\n  404, // Not Found\n  405, // Method Not Allowed\n  406, // Not Acceptable\n  407, // Proxy Authentication Required\n  409, // Conflict\n];\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst DEFAULT_RETRY_ON_HANDLER = (error: any) => {\n  if (\n    error.message.startsWith(\"Cancel\") ||\n    error.message.startsWith(\"AbortError\") ||\n    error.name === \"AbortError\"\n  ) {\n    return false;\n  }\n\n  // Thrown when interrupt is called without a checkpointer\n  if (error.name === \"GraphValueError\") {\n    return false;\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  if ((error as any)?.code === \"ECONNABORTED\") {\n    return false;\n  }\n\n  const status =\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    (error as any)?.response?.status ?? (error as any)?.status;\n  if (status && DEFAULT_STATUS_NO_RETRY.includes(+status)) {\n    return false;\n  }\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  if ((error as any)?.error?.code === \"insufficient_quota\") {\n    return false;\n  }\n  return true;\n};\n\nexport type SettledPregelTask = {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  task: PregelExecutableTask<any, any>;\n  error: Error;\n  signalAborted?: boolean;\n};\n\nexport async function _runWithRetry<\n  N extends PropertyKey,\n  C extends PropertyKey,\n>(\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  pregelTask: PregelExecutableTask<N, C>,\n  retryPolicy?: RetryPolicy,\n  configurable?: Record<string, unknown>,\n  signal?: AbortSignal\n): Promise<{\n  task: PregelExecutableTask<N, C>;\n  result: unknown;\n  error: Error | undefined;\n  signalAborted?: boolean;\n}> {\n  const resolvedRetryPolicy = pregelTask.retry_policy ?? retryPolicy;\n  let interval =\n    resolvedRetryPolicy !== undefined\n      ? (resolvedRetryPolicy.initialInterval ?? DEFAULT_INITIAL_INTERVAL)\n      : 0;\n  let attempts = 0;\n  let error;\n  let result;\n\n  let config: LangGraphRunnableConfig = pregelTask.config ?? {};\n  if (configurable) {\n    config = patchConfigurable(config, configurable);\n  }\n  config = { ...config, signal };\n\n  const firstAttemptTime = Date.now();\n  if (config.executionInfo != null) {\n    config.executionInfo = {\n      ...config.executionInfo,\n      nodeFirstAttemptTime: firstAttemptTime,\n    };\n  }\n\n  // eslint-disable-next-line no-constant-condition\n  while (true) {\n    if (signal?.aborted) {\n      // no need to throw here - we'll throw from the runner, instead.\n      // there's just no point in retrying if the user has requested an abort.\n      break;\n    }\n    // Clear any writes from previous attempts\n    pregelTask.writes.splice(0, pregelTask.writes.length);\n    error = undefined;\n    try {\n      result = await pregelTask.proc.invoke(pregelTask.input, config);\n      break;\n    } catch (e: unknown) {\n      error = e;\n      (error as { pregelTaskId: string }).pregelTaskId = pregelTask.id;\n      if (isParentCommand(error)) {\n        const ns: string = config?.configurable?.checkpoint_ns;\n        const cmd = error.command;\n        if (cmd.graph === ns) {\n          // this command is for the current graph, handle it\n          for (const writer of pregelTask.writers) {\n            await writer.invoke(cmd, config);\n          }\n          error = undefined;\n          break;\n        } else if (cmd.graph === Command.PARENT) {\n          // this command is for the parent graph, assign it to the parent\n          const parentNs = getParentCheckpointNamespace(ns);\n          error.command = new Command({\n            ...error.command,\n            graph: parentNs,\n          });\n        }\n      }\n      if (isGraphBubbleUp(error)) {\n        break;\n      }\n      if (resolvedRetryPolicy === undefined) {\n        break;\n      }\n      attempts += 1;\n      // check if we should give up\n      if (\n        attempts >= (resolvedRetryPolicy.maxAttempts ?? DEFAULT_MAX_RETRIES)\n      ) {\n        break;\n      }\n      const retryOn = resolvedRetryPolicy.retryOn ?? DEFAULT_RETRY_ON_HANDLER;\n      if (!retryOn(error)) {\n        break;\n      }\n      interval = Math.min(\n        resolvedRetryPolicy.maxInterval ?? DEFAULT_MAX_INTERVAL,\n        interval * (resolvedRetryPolicy.backoffFactor ?? DEFAULT_BACKOFF_FACTOR)\n      );\n      const intervalWithJitter = resolvedRetryPolicy.jitter\n        ? Math.floor(interval + Math.random() * 1000)\n        : interval;\n      // sleep before retrying\n      // eslint-disable-next-line no-promise-executor-return\n      await new Promise((resolve) => setTimeout(resolve, intervalWithJitter));\n      // log the retry\n      const errorName =\n        (error as Error).name ??\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        ((error as Error).constructor as any).unminifiable_name ??\n        (error as Error).constructor.name;\n      if (resolvedRetryPolicy?.logWarning ?? true) {\n        console.log(\n          `Retrying task \"${String(pregelTask.name)}\" after ${interval.toFixed(\n            2\n          )}ms (attempt ${attempts}) after ${errorName}: ${error}`\n        );\n      }\n\n      // signal subgraphs to resume (if available)\n      config = patchConfigurable(config, { [CONFIG_KEY_RESUMING]: true });\n\n      if (config.executionInfo != null) {\n        config.executionInfo = {\n          ...config.executionInfo,\n          nodeAttempt: attempts + 1,\n          nodeFirstAttemptTime: firstAttemptTime,\n        };\n      }\n    }\n  }\n  return {\n    task: pregelTask,\n    result,\n    error: error as Error | undefined,\n    signalAborted: signal?.aborted,\n  };\n}\n"],"mappings":";;;;AAYA,MAAM,0BAA0B;CAC9B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAGD,MAAM,4BAA4B,UAAe;AAC/C,KACE,MAAM,QAAQ,WAAW,SAAS,IAClC,MAAM,QAAQ,WAAW,aAAa,IACtC,MAAM,SAAS,aAEf,QAAO;AAIT,KAAI,MAAM,SAAS,kBACjB,QAAO;AAIT,KAAK,OAAe,SAAS,eAC3B,QAAO;CAGT,MAAM,SAEH,OAAe,UAAU,UAAW,OAAe;AACtD,KAAI,UAAU,wBAAwB,SAAS,CAAC,OAAO,CACrD,QAAO;AAGT,KAAK,OAAe,OAAO,SAAS,qBAClC,QAAO;AAET,QAAO;;AAUT,eAAsB,cAKpB,YACA,aACA,cACA,QAMC;CACD,MAAM,sBAAsB,WAAW,gBAAgB;CACvD,IAAI,WACF,wBAAwB,KAAA,IACnB,oBAAoB,mBAAA,MACrB;CACN,IAAI,WAAW;CACf,IAAI;CACJ,IAAI;CAEJ,IAAI,SAAkC,WAAW,UAAU,EAAE;AAC7D,KAAI,aACF,UAASA,cAAAA,kBAAkB,QAAQ,aAAa;AAElD,UAAS;EAAE,GAAG;EAAQ;EAAQ;CAE9B,MAAM,mBAAmB,KAAK,KAAK;AACnC,KAAI,OAAO,iBAAiB,KAC1B,QAAO,gBAAgB;EACrB,GAAG,OAAO;EACV,sBAAsB;EACvB;AAIH,QAAO,MAAM;AACX,MAAI,QAAQ,QAGV;AAGF,aAAW,OAAO,OAAO,GAAG,WAAW,OAAO,OAAO;AACrD,UAAQ,KAAA;AACR,MAAI;AACF,YAAS,MAAM,WAAW,KAAK,OAAO,WAAW,OAAO,OAAO;AAC/D;WACO,GAAY;AACnB,WAAQ;AACP,SAAmC,eAAe,WAAW;AAC9D,OAAIC,eAAAA,gBAAgB,MAAM,EAAE;IAC1B,MAAM,KAAa,QAAQ,cAAc;IACzC,MAAM,MAAM,MAAM;AAClB,QAAI,IAAI,UAAU,IAAI;AAEpB,UAAK,MAAM,UAAU,WAAW,QAC9B,OAAM,OAAO,OAAO,KAAK,OAAO;AAElC,aAAQ,KAAA;AACR;eACS,IAAI,UAAUC,kBAAAA,QAAQ,QAAQ;KAEvC,MAAM,WAAWC,eAAAA,6BAA6B,GAAG;AACjD,WAAM,UAAU,IAAID,kBAAAA,QAAQ;MAC1B,GAAG,MAAM;MACT,OAAO;MACR,CAAC;;;AAGN,OAAIE,eAAAA,gBAAgB,MAAM,CACxB;AAEF,OAAI,wBAAwB,KAAA,EAC1B;AAEF,eAAY;AAEZ,OACE,aAAa,oBAAoB,eAAA,GAEjC;AAGF,OAAI,EADY,oBAAoB,WAAW,0BAClC,MAAM,CACjB;AAEF,cAAW,KAAK,IACd,oBAAoB,eAAA,OACpB,YAAY,oBAAoB,iBAAA,GACjC;GACD,MAAM,qBAAqB,oBAAoB,SAC3C,KAAK,MAAM,WAAW,KAAK,QAAQ,GAAG,IAAK,GAC3C;AAGJ,SAAM,IAAI,SAAS,YAAY,WAAW,SAAS,mBAAmB,CAAC;GAEvE,MAAM,YACH,MAAgB,QAEf,MAAgB,YAAoB,qBACrC,MAAgB,YAAY;AAC/B,OAAI,qBAAqB,cAAc,KACrC,SAAQ,IACN,kBAAkB,OAAO,WAAW,KAAK,CAAC,UAAU,SAAS,QAC3D,EACD,CAAC,cAAc,SAAS,UAAU,UAAU,IAAI,QAClD;AAIH,YAASJ,cAAAA,kBAAkB,QAAQ,GAAGK,kBAAAA,sBAAsB,MAAM,CAAC;AAEnE,OAAI,OAAO,iBAAiB,KAC1B,QAAO,gBAAgB;IACrB,GAAG,OAAO;IACV,aAAa,WAAW;IACxB,sBAAsB;IACvB;;;AAIP,QAAO;EACL,MAAM;EACN;EACO;EACP,eAAe,QAAQ;EACxB"}