{"version":3,"file":"errors.mjs","names":[],"sources":["../../src/runtime/errors.ts"],"sourcesContent":["import { ORPCError } from \"@orpc/contract\";\nimport { Cause, Data } from \"effect\";\nimport type { z } from \"zod\";\n\nexport class PluginRuntimeError extends Data.TaggedError(\"PluginRuntimeError\")<{\n  readonly pluginId?: string;\n  readonly operation?: string;\n  readonly procedureName?: string;\n  readonly cause?: Error;\n  readonly retryable: boolean;\n}> {}\n\nexport class ModuleFederationError extends Data.TaggedError(\"ModuleFederationError\")<{\n  readonly pluginId: string;\n  readonly remoteUrl: string;\n  readonly cause?: Error;\n}> {}\n\nexport class ValidationError extends Data.TaggedError(\"ValidationError\")<{\n  readonly pluginId: string;\n  readonly stage: \"config\" | \"input\" | \"output\" | \"state\";\n  readonly zodError: z.ZodError;\n}> {}\n\nconst extractErrorMessage = (error: unknown): string => {\n  if (!error) return \"Unknown error\";\n\n  if (error instanceof Error) {\n    if (error.message) return error.message;\n    if ((error as any).cause instanceof Error) {\n      return extractErrorMessage((error as any).cause);\n    }\n  }\n\n  if (error instanceof AggregateError && error.errors?.length) {\n    return error.errors.map((e) => extractErrorMessage(e)).join(\"; \");\n  }\n\n  if (typeof error === \"object\" && \"message\" in error) {\n    return String((error as any).message);\n  }\n\n  return String(error);\n};\n\nconst formatValidationIssue = (issue: any, index: number, maxDisplay: number): string => {\n  if (index >= maxDisplay) return \"\";\n\n  const path =\n    Array.isArray(issue.path) && issue.path.length > 0\n      ? issue.path.join(\".\")\n      : issue.path || \"root\";\n\n  const message = issue.message || \"Validation failed\";\n\n  return `│    ${index + 1}. ${path}: ${message}`;\n};\n\nconst formatDataPreview = (data: unknown, maxLength = 100): string => {\n  if (!data) return \"undefined\";\n\n  try {\n    const str = JSON.stringify(data);\n    if (str.length <= maxLength) return str;\n\n    if (typeof data === \"object\" && data !== null) {\n      if (Array.isArray(data)) {\n        return `Array(${data.length}) [...]`;\n      }\n      const keys = Object.keys(data);\n      return `{ ${keys.slice(0, 3).join(\", \")}${keys.length > 3 ? \", ...\" : \"\"} }`;\n    }\n\n    return `${str.slice(0, maxLength)}...`;\n  } catch {\n    return String(data).slice(0, maxLength);\n  }\n};\n\nconst formatORPCValidationError = (error: any): string[] | null => {\n  const cause = error?.cause || error;\n\n  if (!cause?.issues || !Array.isArray(cause.issues) || cause.issues.length === 0) {\n    return null;\n  }\n\n  const lines: string[] = [];\n  const errorType = error?.message || cause?.message || \"Validation failed\";\n\n  lines.push(`\\n╭─ oRPC Validation Error ${\"─\".repeat(30)}`);\n  lines.push(`│  ${errorType}`);\n  lines.push(`│`);\n\n  const maxDisplay = 10;\n  const totalIssues = cause.issues.length;\n\n  lines.push(`│  Issues (${totalIssues}):`);\n\n  const displayedIssues = cause.issues.slice(0, maxDisplay);\n  displayedIssues.forEach((issue: any, idx: number) => {\n    const formatted = formatValidationIssue(issue, idx, maxDisplay);\n    if (formatted) lines.push(formatted);\n  });\n\n  if (totalIssues > maxDisplay) {\n    lines.push(`│    ... and ${totalIssues - maxDisplay} more`);\n  }\n\n  if (cause.data !== undefined) {\n    lines.push(`│`);\n    lines.push(`│  Data preview: ${formatDataPreview(cause.data, 80)}`);\n  }\n\n  lines.push(`╰${\"─\".repeat(50)}\\n`);\n\n  return lines;\n};\n\nexport const formatORPCError = (error: any): string | null => {\n  if (!(error instanceof ORPCError)) {\n    return null;\n  }\n\n  const validationLines = formatORPCValidationError(error);\n  if (validationLines) {\n    return validationLines.join(\"\\n\");\n  }\n\n  const lines: string[] = [];\n  const code = error.code || \"UNKNOWN\";\n  const status = error.status || 500;\n  const message = error.message || \"An error occurred\";\n\n  lines.push(`\\n╭─ oRPC Error ${\"─\".repeat(40)}`);\n  const messageLines = message.split(\"\\n\");\n  for (const line of messageLines) {\n    lines.push(`│  ${line}`);\n  }\n  lines.push(`│  Code: ${code} (${status})`);\n  lines.push(`│`);\n\n  if (error.data) {\n    const dataType = typeof error.data;\n    if (dataType === \"object\" && error.data !== null) {\n      if (\"retryAfter\" in error.data) {\n        lines.push(`│  Retry after: ${error.data.retryAfter} seconds`);\n      }\n      if (\"remainingRequests\" in error.data) {\n        lines.push(`│  Remaining: ${error.data.remainingRequests} requests`);\n      }\n      if (\"host\" in error.data) {\n        lines.push(`│  Host: ${error.data.host}`);\n      }\n      if (\"port\" in error.data) {\n        lines.push(`│  Port: ${error.data.port}`);\n      }\n      if (\"suggestion\" in error.data) {\n        lines.push(`│  → ${error.data.suggestion}`);\n      }\n      if (\"resource\" in error.data) {\n        lines.push(`│  Resource: ${error.data.resource}`);\n      }\n      if (\"resourceId\" in error.data) {\n        lines.push(`│  ID: ${error.data.resourceId}`);\n      }\n    }\n  }\n\n  switch (code) {\n    case \"UNAUTHORIZED\":\n      lines.push(`│  → Check your API key or credentials`);\n      break;\n    case \"TOO_MANY_REQUESTS\":\n      lines.push(`│  → Wait before retrying`);\n      break;\n    case \"SERVICE_UNAVAILABLE\":\n    case \"BAD_GATEWAY\":\n    case \"GATEWAY_TIMEOUT\":\n      lines.push(`│  → The service may be temporarily unavailable`);\n      break;\n    case \"TIMEOUT\":\n      lines.push(`│  → The operation took too long`);\n      break;\n  }\n\n  lines.push(`╰${\"─\".repeat(50)}\\n`);\n  return lines.join(\"\\n\");\n};\n\nconst isRetryableError = (message: string): boolean => {\n  const retryablePatterns = [\"ETIMEDOUT\", \"ECONNRESET\", \"timeout\", \"503\", \"429\"];\n  return retryablePatterns.some((p) => message.toLowerCase().includes(p.toLowerCase()));\n};\n\n// Helper to determine if an oRPC error code is retryable\nexport const isRetryableORPCCode = (code: string): boolean => {\n  switch (code) {\n    case \"TOO_MANY_REQUESTS\":\n    case \"SERVICE_UNAVAILABLE\":\n    case \"BAD_GATEWAY\":\n    case \"GATEWAY_TIMEOUT\":\n    case \"TIMEOUT\":\n      return true;\n    default:\n      return false;\n  }\n};\n\n// Convert ORPC errors from plugin procedures to PluginRuntimeError\nexport const wrapORPCError = (\n  orpcError: ORPCError<string, unknown>,\n  pluginId?: string,\n  procedureName?: string,\n  operation?: string,\n): PluginRuntimeError => {\n  return new PluginRuntimeError({\n    pluginId,\n    operation,\n    procedureName,\n    retryable: isRetryableORPCCode(orpcError.code),\n    cause: orpcError as Error,\n  });\n};\n\n/**\n * Extracts the underlying error from Effect's FiberFailure wrapper.\n * When Effect.runPromise rejects, errors are wrapped in FiberFailure.\n * This extracts the original error so oRPC can handle it properly.\n */\nexport const extractFromFiberFailure = (error: unknown): unknown => {\n  if (!error || typeof error !== \"object\") return error;\n\n  if (\"cause\" in error) {\n    const cause = (error as { cause?: unknown }).cause;\n\n    if (cause && typeof cause === \"object\" && \"_tag\" in cause) {\n      try {\n        const squashed = Cause.squash(cause as Cause.Cause<unknown>);\n        if (squashed instanceof ORPCError) {\n          return squashed;\n        }\n        return squashed;\n      } catch {\n        // Not a valid Cause\n      }\n    }\n\n    if (cause instanceof ORPCError) {\n      return cause;\n    }\n  }\n\n  return error;\n};\n\n// Universal error converter for the runtime\nexport const toPluginRuntimeError = (\n  error: unknown,\n  pluginId?: string,\n  procedureName?: string,\n  operation?: string,\n  defaultRetryable = false,\n): PluginRuntimeError => {\n  if (error instanceof ORPCError) {\n    return wrapORPCError(error, pluginId, procedureName, operation);\n  }\n\n  if (error instanceof PluginRuntimeError) {\n    return error;\n  }\n\n  return new PluginRuntimeError({\n    pluginId,\n    operation,\n    procedureName,\n    retryable: defaultRetryable || isRetryableError(extractErrorMessage(error)),\n    cause: error instanceof Error ? error : new Error(extractErrorMessage(error)),\n  });\n};\n"],"mappings":"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"}