@odel/module-sdk
Version:
SDK for building Odel modules - MCP protocol over HTTP for Cloudflare Workers
96 lines • 3.38 kB
JavaScript
/**
* Standardized error handling for Odel modules
*/
/**
* Error codes for module operations
*/
export var ErrorCode;
(function (ErrorCode) {
// Validation errors (1xxx)
ErrorCode[ErrorCode["INVALID_INPUT"] = 1001] = "INVALID_INPUT";
ErrorCode[ErrorCode["MISSING_REQUIRED_FIELD"] = 1002] = "MISSING_REQUIRED_FIELD";
ErrorCode[ErrorCode["INVALID_FORMAT"] = 1003] = "INVALID_FORMAT";
// Authentication/secrets (2xxx)
ErrorCode[ErrorCode["MISSING_SECRET"] = 2001] = "MISSING_SECRET";
ErrorCode[ErrorCode["INVALID_SECRET"] = 2002] = "INVALID_SECRET";
ErrorCode[ErrorCode["UNAUTHORIZED"] = 2003] = "UNAUTHORIZED";
// External API errors (3xxx)
ErrorCode[ErrorCode["API_ERROR"] = 3001] = "API_ERROR";
ErrorCode[ErrorCode["NETWORK_ERROR"] = 3002] = "NETWORK_ERROR";
ErrorCode[ErrorCode["TIMEOUT"] = 3003] = "TIMEOUT";
ErrorCode[ErrorCode["NOT_FOUND"] = 3004] = "NOT_FOUND";
// Rate limiting (4xxx)
ErrorCode[ErrorCode["RATE_LIMIT_EXCEEDED"] = 4001] = "RATE_LIMIT_EXCEEDED";
ErrorCode[ErrorCode["QUOTA_EXCEEDED"] = 4002] = "QUOTA_EXCEEDED";
// Internal errors (5xxx)
ErrorCode[ErrorCode["INTERNAL_ERROR"] = 5001] = "INTERNAL_ERROR";
ErrorCode[ErrorCode["NOT_IMPLEMENTED"] = 5002] = "NOT_IMPLEMENTED";
ErrorCode[ErrorCode["CONFIGURATION_ERROR"] = 5003] = "CONFIGURATION_ERROR";
})(ErrorCode || (ErrorCode = {}));
/**
* Standardized module error class
*
* @example
* ```typescript
* throw new ModuleError(
* ErrorCode.MISSING_SECRET,
* 'RESEND_API_KEY secret is required',
* { secretName: 'RESEND_API_KEY' }
* );
* ```
*/
export class ModuleError extends Error {
/**
* Create a new module error
* @param code - Error code from ErrorCode enum
* @param message - Human-readable error message
* @param metadata - Optional additional error context
*/
constructor(code, message, metadata) {
super(message);
this.code = code;
this.metadata = metadata;
this.name = 'ModuleError';
// Maintains proper stack trace for where error was thrown (only available on V8)
if (typeof Error.captureStackTrace === 'function') {
Error.captureStackTrace(this, ModuleError);
}
}
/**
* Convert error to JSON response format
* @returns Success/error response object
*/
toJSON() {
return {
success: false,
error: this.message,
code: this.code,
...(this.metadata && { metadata: this.metadata })
};
}
/**
* Create a validation error
*/
static validationError(message, metadata) {
return new ModuleError(ErrorCode.INVALID_INPUT, message, metadata);
}
/**
* Create a missing secret error
*/
static missingSecret(secretName) {
return new ModuleError(ErrorCode.MISSING_SECRET, `Required secret "${secretName}" is not configured`, { secretName });
}
/**
* Create an API error
*/
static apiError(message, metadata) {
return new ModuleError(ErrorCode.API_ERROR, message, metadata);
}
/**
* Create a rate limit error
*/
static rateLimitError(retryAfter) {
return new ModuleError(ErrorCode.RATE_LIMIT_EXCEEDED, 'Rate limit exceeded', retryAfter ? { retryAfter } : undefined);
}
}
//# sourceMappingURL=errors.js.map