@kitiumai/error
Version:
Enterprise-grade error primitives for Kitium products: rich metadata, HTTP/Problem Details mapping, observability, and registry-driven error governance.
1 lines • 33.2 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { getLogger } from '@kitiumai/logger';\nimport {\n ErrorKind,\n ErrorRegistry,\n ErrorRegistryEntry,\n ErrorSeverity,\n ErrorShape,\n ProblemDetails,\n ErrorContext,\n ErrorMetrics,\n RetryBackoff,\n RetryOutcome,\n RetryOptions,\n TraceSpanLike,\n} from './types';\n\nconst DEFAULT_DOCS_URL = 'https://docs.kitium.ai/errors';\nconst log = getLogger();\n\n/**\n * Type guard to check if value is a plain object\n * @param value - Value to check\n * @returns true if value is a plain object\n */\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction cloneValue<T>(value: T): T {\n return isObject(value) ? (JSON.parse(JSON.stringify(value)) as T) : value;\n}\n\nfunction redactValueAtPath(\n target: Record<string, unknown>,\n path: string[],\n redaction: string\n): void {\n const [head, ...tail] = path;\n if (!head) {\n return;\n }\n\n if (!(head in target)) {\n return;\n }\n if (tail.length === 0) {\n target[head] = redaction;\n return;\n }\n\n const next = target[head];\n if (isObject(next)) {\n redactValueAtPath(next, tail, redaction);\n }\n}\n\nfunction applyRedactions(\n context: ErrorContext | undefined,\n redactPaths: string[] | undefined,\n redaction = '[REDACTED]'\n): ErrorContext | undefined {\n if (!context || !redactPaths?.length) {\n return context;\n }\n const clone = cloneValue(context);\n redactPaths.forEach((path) => redactValueAtPath(clone, path.split('.'), redaction));\n return clone;\n}\n\n// Error code validation pattern: lowercase alphanumeric with underscores and forward slashes\n// Examples: \"auth/forbidden\", \"validation/required_field\", \"internal/server_error\"\nconst ERROR_CODE_PATTERN = /^[a-z0-9_]+(\\/[a-z0-9_]+)*$/;\n\n// Error metrics tracking\nconst errorMetrics: {\n totalErrors: number;\n errorsByKind: Record<ErrorKind, number>;\n errorsBySeverity: Record<ErrorSeverity, number>;\n retryableErrors: number;\n nonRetryableErrors: number;\n} = {\n totalErrors: 0,\n errorsByKind: {\n business: 0,\n validation: 0,\n auth: 0,\n rate_limit: 0,\n not_found: 0,\n conflict: 0,\n dependency: 0,\n internal: 0,\n },\n errorsBySeverity: {\n fatal: 0,\n error: 0,\n warning: 0,\n info: 0,\n debug: 0,\n },\n retryableErrors: 0,\n nonRetryableErrors: 0,\n};\n\n/**\n * Validates error code format\n * @param code - Error code to validate\n * @returns true if valid, false otherwise\n */\nexport function isValidErrorCode(code: string): boolean {\n return ERROR_CODE_PATTERN.test(code);\n}\n\n/**\n * Validates error code and throws if invalid\n * @param code - Error code to validate\n * @throws Error if code format is invalid\n */\nexport function validateErrorCode(code: string): void {\n if (!isValidErrorCode(code)) {\n throw new Error(\n `Invalid error code format: \"${code}\". Error codes must match pattern: ${ERROR_CODE_PATTERN.source}. Examples: \"auth/forbidden\", \"validation/required_field\"`\n );\n }\n}\n\nfunction validateLifecycle(lifecycle: ErrorShape['lifecycle'] | undefined): void {\n if (!lifecycle) {\n return;\n }\n if (!['draft', 'active', 'deprecated'].includes(lifecycle)) {\n throw new Error(`Invalid lifecycle state: ${lifecycle}. Allowed: draft | active | deprecated.`);\n }\n}\n\nexport class KitiumError extends Error implements ErrorShape {\n readonly code: string;\n readonly statusCode?: number;\n readonly severity: ErrorSeverity;\n readonly kind: ErrorKind;\n readonly lifecycle?: ErrorShape['lifecycle'];\n readonly schemaVersion?: string;\n readonly retryable: boolean;\n readonly retryDelay?: number;\n readonly maxRetries?: number;\n readonly backoff?: RetryBackoff;\n readonly help?: string;\n readonly docs?: string;\n readonly source?: string;\n readonly userMessage?: string;\n readonly i18nKey?: string;\n readonly redact?: string[];\n readonly context?: ErrorContext;\n readonly cause?: unknown;\n\n constructor(shape: ErrorShape, validateCode = true) {\n super(shape.message);\n this.name = 'KitiumError';\n\n if (validateCode) {\n validateErrorCode(shape.code);\n }\n validateLifecycle(shape.lifecycle);\n\n this.code = shape.code;\n this.statusCode = shape.statusCode;\n this.severity = shape.severity;\n this.kind = shape.kind;\n this.lifecycle = shape.lifecycle;\n this.schemaVersion = shape.schemaVersion;\n this.retryable = shape.retryable;\n this.retryDelay = shape.retryDelay;\n this.maxRetries = shape.maxRetries;\n this.backoff = shape.backoff;\n this.help = shape.help;\n this.docs = shape.docs;\n this.source = shape.source;\n this.userMessage = shape.userMessage;\n this.i18nKey = shape.i18nKey;\n this.redact = shape.redact;\n this.context = shape.context;\n this.cause = shape.cause;\n\n // Update metrics\n errorMetrics.totalErrors++;\n errorMetrics.errorsByKind[this.kind]++;\n errorMetrics.errorsBySeverity[this.severity]++;\n if (this.retryable) {\n errorMetrics.retryableErrors++;\n } else {\n errorMetrics.nonRetryableErrors++;\n }\n }\n\n toJSON(): ErrorShape {\n return {\n code: this.code,\n message: this.message,\n ...(this.statusCode !== undefined ? { statusCode: this.statusCode } : {}),\n severity: this.severity,\n kind: this.kind,\n ...(this.lifecycle !== undefined ? { lifecycle: this.lifecycle } : {}),\n ...(this.schemaVersion !== undefined ? { schemaVersion: this.schemaVersion } : {}),\n retryable: this.retryable,\n ...(this.retryDelay !== undefined ? { retryDelay: this.retryDelay } : {}),\n ...(this.maxRetries !== undefined ? { maxRetries: this.maxRetries } : {}),\n ...(this.backoff !== undefined ? { backoff: this.backoff } : {}),\n ...(this.help !== undefined ? { help: this.help } : {}),\n ...(this.docs !== undefined ? { docs: this.docs } : {}),\n ...(this.source !== undefined ? { source: this.source } : {}),\n ...(this.userMessage !== undefined ? { userMessage: this.userMessage } : {}),\n ...(this.i18nKey !== undefined ? { i18nKey: this.i18nKey } : {}),\n ...(this.redact !== undefined ? { redact: this.redact } : {}),\n ...(this.context !== undefined\n ? { context: applyRedactions(this.context, this.redact) }\n : {}),\n ...(this.cause !== undefined ? { cause: this.cause } : {}),\n };\n }\n}\n\nexport function createErrorRegistry(defaults?: Partial<ErrorRegistryEntry>): ErrorRegistry {\n const entries = new Map<string, ErrorRegistryEntry>();\n\n const toProblemDetails = (error: ErrorShape): ProblemDetails => {\n const entry = entries.get(error.code) ?? defaults;\n const redactions = error.redact ?? entry?.redact;\n const context = applyRedactions(error.context, redactions);\n const typeUrl = entry?.docs ?? error.docs ?? `${DEFAULT_DOCS_URL}/${error.code}`;\n const status = error.statusCode ?? entry?.statusCode;\n const userMessage = error.userMessage ?? entry?.userMessage;\n const lifecycle = error.lifecycle ?? entry?.lifecycle;\n\n if (entry?.toProblem) {\n return entry.toProblem(error);\n }\n\n return {\n type: typeUrl,\n title: userMessage ?? error.message,\n ...(status !== undefined ? { status } : {}),\n ...(error.help !== undefined ? { detail: error.help } : {}),\n ...((error.context?.correlationId ?? error.context?.requestId)\n ? { instance: error.context?.correlationId ?? error.context?.requestId }\n : {}),\n extensions: {\n code: error.code,\n severity: error.severity,\n retryable: error.retryable,\n ...(lifecycle !== undefined ? { lifecycle } : {}),\n ...(error.schemaVersion !== undefined ? { schemaVersion: error.schemaVersion } : {}),\n ...(error.retryDelay !== undefined ? { retryDelay: error.retryDelay } : {}),\n ...(error.maxRetries !== undefined ? { maxRetries: error.maxRetries } : {}),\n ...(error.backoff !== undefined ? { backoff: error.backoff } : {}),\n kind: error.kind,\n ...(context !== undefined ? { context } : {}),\n ...(userMessage !== undefined ? { userMessage } : {}),\n ...((error.i18nKey ?? entry?.i18nKey) ? { i18nKey: error.i18nKey ?? entry?.i18nKey } : {}),\n ...((error.source ?? entry?.source) ? { source: error.source ?? entry?.source } : {}),\n },\n };\n };\n\n return {\n register(entry: ErrorRegistryEntry): void {\n validateErrorCode(entry.code);\n validateLifecycle(entry.lifecycle ?? defaults?.lifecycle);\n entries.set(entry.code, { ...defaults, ...entry });\n },\n resolve(code: string): ErrorRegistryEntry | undefined {\n return entries.get(code);\n },\n toProblemDetails,\n };\n}\n\nexport function toKitiumError(error: unknown, fallback?: ErrorShape): KitiumError {\n if (error instanceof KitiumError) {\n return error;\n }\n\n if (isObject(error) && 'code' in error && 'message' in error) {\n const shape = error as Record<string, unknown>;\n return new KitiumError(\n {\n code: String(shape['code']),\n message: String(shape['message']),\n statusCode: typeof shape['statusCode'] === 'number' ? shape['statusCode'] : undefined,\n severity: (shape['severity'] as ErrorSeverity) ?? 'error',\n kind: (shape['kind'] as ErrorKind) ?? 'internal',\n retryable: Boolean(shape['retryable']),\n retryDelay: typeof shape['retryDelay'] === 'number' ? shape['retryDelay'] : undefined,\n maxRetries: typeof shape['maxRetries'] === 'number' ? shape['maxRetries'] : undefined,\n backoff: ['linear', 'exponential', 'fixed'].includes(String(shape['backoff']))\n ? (shape['backoff'] as RetryBackoff)\n : undefined,\n help: typeof shape['help'] === 'string' ? shape['help'] : undefined,\n docs: typeof shape['docs'] === 'string' ? shape['docs'] : undefined,\n source: typeof shape['source'] === 'string' ? shape['source'] : undefined,\n lifecycle: ['draft', 'active', 'deprecated'].includes(String(shape['lifecycle']))\n ? (shape['lifecycle'] as ErrorShape['lifecycle'])\n : undefined,\n schemaVersion:\n typeof shape['schemaVersion'] === 'string' ? shape['schemaVersion'] : undefined,\n userMessage: typeof shape['userMessage'] === 'string' ? shape['userMessage'] : undefined,\n i18nKey: typeof shape['i18nKey'] === 'string' ? shape['i18nKey'] : undefined,\n redact: Array.isArray(shape['redact']) ? (shape['redact'] as string[]) : undefined,\n context: isObject(shape['context']) ? (shape['context'] as ErrorContext) : undefined,\n cause: shape['cause'],\n },\n false // Don't validate code for normalized errors\n );\n }\n\n if (fallback) {\n return new KitiumError(fallback);\n }\n\n return new KitiumError({\n code: 'unknown_error',\n message: error instanceof Error ? error.message : 'Unknown error',\n statusCode: 500,\n severity: 'error',\n kind: 'internal',\n retryable: false,\n cause: error,\n });\n}\n\nexport function logError(error: KitiumError): void {\n const entry = httpErrorRegistry.resolve(error.code);\n const context = applyRedactions(error.context, error.redact ?? entry?.redact);\n const payload = {\n code: error.code,\n message: error.message,\n severity: error.severity,\n retryable: error.retryable,\n ...(error.statusCode !== undefined ? { statusCode: error.statusCode } : {}),\n ...(error.retryDelay !== undefined ? { retryDelay: error.retryDelay } : {}),\n ...(error.maxRetries !== undefined ? { maxRetries: error.maxRetries } : {}),\n ...(error.backoff !== undefined ? { backoff: error.backoff } : {}),\n ...(context !== undefined ? { context } : {}),\n ...(error.source !== undefined ? { source: error.source } : {}),\n ...(error.schemaVersion !== undefined ? { schemaVersion: error.schemaVersion } : {}),\n ...(error.lifecycle !== undefined ? { lifecycle: error.lifecycle } : {}),\n fingerprint: getErrorFingerprint(error),\n };\n\n switch (error.severity) {\n case 'fatal':\n case 'error':\n log?.error(error.message, payload);\n break;\n case 'warning':\n log?.warn(error.message, payload);\n break;\n case 'info':\n log?.info(error.message, payload);\n break;\n default:\n log?.debug(error.message, payload);\n }\n}\n\nconst SPAN_STATUS_ERROR = 2;\n\nexport function recordException(error: KitiumError, span?: TraceSpanLike): void {\n if (!span) {\n return;\n }\n const fingerprint = getErrorFingerprint(error);\n span.setAttribute('kitium.error.code', error.code);\n span.setAttribute('kitium.error.kind', error.kind);\n span.setAttribute('kitium.error.severity', error.severity);\n span.setAttribute('kitium.error.retryable', error.retryable);\n span.setAttribute('kitium.error.fingerprint', fingerprint);\n if (error.lifecycle) {\n span.setAttribute('kitium.error.lifecycle', error.lifecycle);\n }\n if (error.schemaVersion) {\n span.setAttribute('kitium.error.schema_version', error.schemaVersion);\n }\n if (error.statusCode) {\n span.setAttribute('http.status_code', error.statusCode);\n }\n span.recordException({ ...error.toJSON(), name: error.name });\n span.setStatus({ code: SPAN_STATUS_ERROR, message: error.message });\n}\n\nexport const httpErrorRegistry = createErrorRegistry({\n statusCode: 500,\n severity: 'error',\n kind: 'internal',\n retryable: false,\n});\n\nexport function problemDetailsFrom(error: KitiumError): ProblemDetails {\n return httpErrorRegistry.toProblemDetails(error);\n}\n\nexport function enrichError(error: KitiumError, context: Record<string, unknown>): KitiumError {\n const mergedContext = { ...(error.context ?? {}), ...context };\n return new KitiumError({ ...error.toJSON(), context: mergedContext }, false);\n}\n\nfunction computeDelay(baseDelay: number, backoff: RetryBackoff, attempt: number): number {\n if (backoff === 'fixed') {\n return baseDelay;\n }\n if (backoff === 'linear') {\n return baseDelay * attempt;\n }\n return baseDelay * 2 ** Math.max(0, attempt - 1);\n}\n\nexport async function runWithRetry<T>(\n operation: () => Promise<T>,\n options?: RetryOptions\n): Promise<RetryOutcome<T>> {\n const maxAttempts = Math.max(1, options?.maxAttempts ?? 3);\n const baseDelay = options?.baseDelayMs ?? 200;\n const backoff = options?.backoff ?? 'exponential';\n\n let attempt = 0;\n let lastDelay: number | undefined;\n\n while (attempt < maxAttempts) {\n attempt++;\n try {\n const result = await operation();\n return { attempts: attempt, result, lastDelayMs: lastDelay };\n } catch (err) {\n const kitiumError = toKitiumError(err);\n options?.onAttempt?.(attempt, kitiumError);\n if (!kitiumError.retryable || attempt >= maxAttempts) {\n return { attempts: attempt, error: kitiumError, lastDelayMs: lastDelay };\n }\n\n const delay = kitiumError.retryDelay ?? baseDelay;\n const backoffStrategy = kitiumError.backoff ?? backoff;\n lastDelay = computeDelay(delay, backoffStrategy, attempt);\n await new Promise((resolve) => setTimeout(resolve, lastDelay));\n }\n }\n\n return { attempts: attempt, lastDelayMs: lastDelay };\n}\n\n/**\n * Generates a fingerprint for error grouping in observability systems\n * @param error - Error to fingerprint\n * @returns Fingerprint string for error grouping\n */\nexport function getErrorFingerprint(error: KitiumError | ErrorShape): string {\n if (error instanceof KitiumError) {\n const shape = error.toJSON();\n // Use registry fingerprint if available\n const entry = httpErrorRegistry.resolve(shape.code);\n if (entry?.fingerprint) {\n return entry.fingerprint;\n }\n // Generate fingerprint from code and kind\n return `${shape.code}:${shape.kind}`;\n }\n return `${error.code}:${error.kind}`;\n}\n\n/**\n * Gets current error metrics\n * @returns Error metrics snapshot\n */\nexport function getErrorMetrics(): ErrorMetrics {\n return {\n totalErrors: errorMetrics.totalErrors,\n errorsByKind: { ...errorMetrics.errorsByKind },\n errorsBySeverity: { ...errorMetrics.errorsBySeverity },\n retryableErrors: errorMetrics.retryableErrors,\n nonRetryableErrors: errorMetrics.nonRetryableErrors,\n };\n}\n\n/**\n * Resets error metrics (useful for testing)\n */\nexport function resetErrorMetrics(): void {\n errorMetrics.totalErrors = 0;\n errorMetrics.errorsByKind = {\n business: 0,\n validation: 0,\n auth: 0,\n rate_limit: 0,\n not_found: 0,\n conflict: 0,\n dependency: 0,\n internal: 0,\n };\n errorMetrics.errorsBySeverity = {\n fatal: 0,\n error: 0,\n warning: 0,\n info: 0,\n debug: 0,\n };\n errorMetrics.retryableErrors = 0;\n errorMetrics.nonRetryableErrors = 0;\n}\n\n// Typed Error Subclasses\nexport class ValidationError extends KitiumError {\n constructor(shape: Omit<ErrorShape, 'kind'> & Partial<Pick<ErrorShape, 'kind'>>) {\n super(\n {\n ...shape,\n kind: shape.kind ?? 'validation',\n severity: shape.severity ?? 'warning',\n statusCode: shape.statusCode ?? 400,\n },\n true\n );\n this.name = 'ValidationError';\n }\n}\n\nexport class AuthenticationError extends KitiumError {\n constructor(shape: Omit<ErrorShape, 'kind'> & Partial<Pick<ErrorShape, 'kind'>>) {\n super(\n {\n ...shape,\n kind: shape.kind ?? 'auth',\n severity: shape.severity ?? 'error',\n statusCode: shape.statusCode ?? 401,\n },\n true\n );\n this.name = 'AuthenticationError';\n }\n}\n\nexport class AuthorizationError extends KitiumError {\n constructor(shape: Omit<ErrorShape, 'kind'> & Partial<Pick<ErrorShape, 'kind'>>) {\n super(\n {\n ...shape,\n kind: shape.kind ?? 'auth',\n severity: shape.severity ?? 'warning',\n statusCode: shape.statusCode ?? 403,\n },\n true\n );\n this.name = 'AuthorizationError';\n }\n}\n\nexport class NotFoundError extends KitiumError {\n constructor(shape: Omit<ErrorShape, 'kind'> & Partial<Pick<ErrorShape, 'kind'>>) {\n super(\n {\n ...shape,\n kind: shape.kind ?? 'not_found',\n severity: shape.severity ?? 'warning',\n statusCode: shape.statusCode ?? 404,\n },\n true\n );\n this.name = 'NotFoundError';\n }\n}\n\nexport class ConflictError extends KitiumError {\n constructor(shape: Omit<ErrorShape, 'kind'> & Partial<Pick<ErrorShape, 'kind'>>) {\n super(\n {\n ...shape,\n kind: shape.kind ?? 'conflict',\n severity: shape.severity ?? 'warning',\n statusCode: shape.statusCode ?? 409,\n },\n true\n );\n this.name = 'ConflictError';\n }\n}\n\nexport class RateLimitError extends KitiumError {\n constructor(shape: Omit<ErrorShape, 'kind'> & Partial<Pick<ErrorShape, 'kind'>>) {\n super(\n {\n ...shape,\n kind: shape.kind ?? 'rate_limit',\n severity: shape.severity ?? 'warning',\n statusCode: shape.statusCode ?? 429,\n retryable: shape.retryable ?? true,\n retryDelay: shape.retryDelay ?? 1000,\n backoff: shape.backoff ?? 'exponential',\n },\n true\n );\n this.name = 'RateLimitError';\n }\n}\n\nexport class DependencyError extends KitiumError {\n constructor(shape: Omit<ErrorShape, 'kind'> & Partial<Pick<ErrorShape, 'kind'>>) {\n super(\n {\n ...shape,\n kind: shape.kind ?? 'dependency',\n severity: shape.severity ?? 'error',\n statusCode: shape.statusCode ?? 502,\n retryable: shape.retryable ?? true,\n retryDelay: shape.retryDelay ?? 500,\n backoff: shape.backoff ?? 'exponential',\n maxRetries: shape.maxRetries ?? 3,\n },\n true\n );\n this.name = 'DependencyError';\n }\n}\n\nexport class BusinessError extends KitiumError {\n constructor(shape: Omit<ErrorShape, 'kind'> & Partial<Pick<ErrorShape, 'kind'>>) {\n super(\n {\n ...shape,\n kind: shape.kind ?? 'business',\n severity: shape.severity ?? 'error',\n statusCode: shape.statusCode ?? 400,\n retryable: shape.retryable ?? false,\n },\n true\n );\n this.name = 'BusinessError';\n }\n}\n\nexport class InternalError extends KitiumError {\n constructor(shape: Omit<ErrorShape, 'kind'> & Partial<Pick<ErrorShape, 'kind'>>) {\n super(\n {\n ...shape,\n kind: shape.kind ?? 'internal',\n severity: shape.severity ?? 'error',\n statusCode: shape.statusCode ?? 500,\n retryable: shape.retryable ?? false,\n },\n true\n );\n this.name = 'InternalError';\n }\n}\n\nexport * from './types';\n"],"mappings":"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","names":[]}