UNPKG

every-plugin

Version:
144 lines (142 loc) 3.48 kB
import { z } from "./zod.mjs"; import { ModuleFederationError, PluginRuntimeError, ValidationError, extractFromFiberFailure, formatORPCError, isRetryableORPCCode, toPluginRuntimeError, wrapORPCError } from "./runtime/errors.mjs"; //#region src/errors.ts /** * Error pattern constants for categorizing infrastructure errors */ const ERROR_PATTERNS = { CONNECTION_REFUSED: ["ECONNREFUSED"], HOST_NOT_FOUND: ["ENOTFOUND", "EHOSTUNREACH"], TIMEOUT: [ "ETIMEDOUT", "ESOCKETTIMEDOUT", "timeout" ], CONNECTION_RESET: ["ECONNRESET", "EPIPE"], PERMISSION: [ "EACCES", "EPERM", "permission denied" ], AUTH: [ "401", "unauthorized", "authentication failed" ], RATE_LIMITED: [ "429", "too many requests", "rate limit" ], SERVICE_UNAVAILABLE: ["503", "service unavailable"] }; /** * Common error schemas for plugin contracts. * Import individually or use the grouped PluginErrors export. * * @example * ```typescript * import { NOT_FOUND, FORBIDDEN, UNAUTHORIZED } from "every-plugin/errors"; * * export const contract = oc.router({ * getData: oc.route(...) * .errors({ NOT_FOUND, FORBIDDEN, UNAUTHORIZED }) * }); * ``` */ const UNAUTHORIZED = { status: 401, data: z.object({ apiKeyProvided: z.boolean(), provider: z.string().optional(), authType: z.enum([ "apiKey", "oauth", "token" ]).optional() }) }; const RATE_LIMITED = { status: 429, data: z.object({ retryAfter: z.number().int().min(1), remainingRequests: z.number().int().min(0).optional(), resetTime: z.string().datetime().optional(), limitType: z.enum([ "requests", "tokens", "bandwidth" ]).optional() }) }; const SERVICE_UNAVAILABLE = { status: 503, data: z.object({ retryAfter: z.number().int().optional(), maintenanceWindow: z.boolean().default(false), estimatedUptime: z.string().datetime().optional() }) }; const BAD_REQUEST = { status: 400, data: z.object({ invalidFields: z.array(z.string()).optional(), validationErrors: z.array(z.object({ field: z.string(), message: z.string(), code: z.string().optional() })).optional() }) }; const NOT_FOUND = { status: 404, data: z.object({ resource: z.string().optional(), resourceId: z.string().optional() }) }; const FORBIDDEN = { status: 403, data: z.object({ requiredPermissions: z.array(z.string()).optional(), action: z.string().optional() }) }; const TIMEOUT = { status: 504, data: z.object({ timeoutMs: z.number().int().min(0).optional(), operation: z.string().optional(), retryable: z.boolean().default(true) }) }; const CONNECTION_ERROR = { status: 502, data: z.object({ errorCode: z.string().optional(), host: z.string().optional(), port: z.number().int().optional(), suggestion: z.string().optional() }) }; /** * Grouped export for all plugin errors. * Use individual imports for cleaner code. */ const PluginErrors = { UNAUTHORIZED, RATE_LIMITED, SERVICE_UNAVAILABLE, BAD_REQUEST, NOT_FOUND, FORBIDDEN, TIMEOUT, CONNECTION_ERROR }; /** * @deprecated Use individual imports or PluginErrors instead */ const CommonPluginErrors = PluginErrors; //#endregion export { BAD_REQUEST, CONNECTION_ERROR, CommonPluginErrors, ERROR_PATTERNS, FORBIDDEN, ModuleFederationError, NOT_FOUND, PluginErrors, PluginRuntimeError, RATE_LIMITED, SERVICE_UNAVAILABLE, TIMEOUT, UNAUTHORIZED, ValidationError, extractFromFiberFailure, formatORPCError, isRetryableORPCCode, toPluginRuntimeError, wrapORPCError }; //# sourceMappingURL=errors.mjs.map