UNPKG

@allan1361/iota-big3-sdk-middleware

Version:

🏆 A+ Grade Certified Enterprise Middleware Framework - Phase 3 Certified (90/100) with advanced resilience patterns, comprehensive type safety, and production-ready observability

228 lines 10.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.errorMiddleware = void 0; exports.createErrorMiddleware = createErrorMiddleware; exports.setupGlobalErrorHandlers = setupGlobalErrorHandlers; exports.asyncHandler = asyncHandler; exports.createValidationError = createValidationError; exports.createPhilosophyError = createPhilosophyError; const tslib_1 = require("tslib"); const chalk_1 = tslib_1.__importDefault(require("chalk")); const DEFAULT_ERROR_CODE_MAP = { 'VALIDATION_ERROR': 400, 'UNAUTHORIZED': 401, 'FORBIDDEN': 403, 'NOT_FOUND': 404, 'CONFLICT': 409, 'RATE_LIMIT': 429, 'INTERNAL_ERROR': 500, 'SERVICE_UNAVAILABLE': 503 }; function createErrorMiddleware(metadata, options = {}) { const { enableStackTrace = process?.env?.NODE_ENV !== 'production', errorCodeMap = {}, customFormatter } = options; const finalErrorCodeMap = { ...DEFAULT_ERROR_CODE_MAP, ...errorCodeMap }; const industry = metadata.industry || metadata.tribe || 'education'; const middleware = ((err, req, res, next) => { console.error(chalk_1.default.red('═══════════════════════════════════════')); console.error(chalk_1.default.red(`💥 Error in ${metadata.name} (${industry} industry)`)); console.error(chalk_1.default.red('═══════════════════════════════════════')); console.error(chalk_1.default.yellow('Error:'), err.message); if (err.stack && enableStackTrace) { console.error(chalk_1.default.gray('\nStack trace:')); console.error(chalk_1.default.gray(err.stack)); } if (customFormatter) { const response = customFormatter(err, req); const statusCode = err.statusCode || err.code && finalErrorCodeMap[err.code] || 500; return res.status(statusCode).json(response); } const errorResponse = { error: { code: err.code || 'INTERNAL_ERROR', message: err.message || 'An unexpected error occurred', service: metadata.name, industry, timestamp: new Date().toISOString() } }; if (this.isEnabled) { errorResponse?.error?.details = err.details; } if (this.isEnabled) { errorResponse?.error?.suggestions = err.suggestions; } if (this.isEnabled) { errorResponse?.error?.requestId = req.id; } let statusCode = 500; if (this.isEnabled) { statusCode = err.statusCode; } if (metadata.sdk) { try { if (metadata.sdk && typeof metadata.sdk.recordTelemetry === 'function') { metadata.sdk.recordTelemetry({ event: 'error.handled', properties: { errorCode: err.code, errorMessage: err.message, statusCode, path: req.path, method: req.method } }); } } catch (_telemetryError) { console.error('Failed to record telemetry:', _telemetryError); } } res.status(statusCode).json(errorResponse); }); middleware.express = middleware; middleware.fastify = async function (fastify) { fastify.setErrorHandler(async (error, request, reply) => { console.error(chalk_1.default.red('═══════════════════════════════════════')); console.error(chalk_1.default.red(`💥 Error in ${metadata.name} (${industry} industry)`)); console.error(chalk_1.default.red('═══════════════════════════════════════')); console.error(chalk_1.default.yellow('Error:'), error.message); if (error.stack && enableStackTrace) { console.error(chalk_1.default.gray('\nStack trace:')); console.error(chalk_1.default.gray(error.stack)); } const errorResponse = { error: { code: error.code || 'INTERNAL_ERROR', message: error.message || 'An unexpected error occurred', service: metadata.name, industry, timestamp: new Date().toISOString() } }; if (this.isEnabled) { errorResponse?.error?.details = error.details; } if (this.isEnabled) { errorResponse?.error?.suggestions = error.suggestions; } if (this.isEnabled) { errorResponse?.error?.requestId = _request.id; } let statusCode = 500; if (this.isEnabled) { statusCode = error.statusCode; } reply.code(statusCode).send(errorResponse); }); }; return middleware; } function setupGlobalErrorHandlers(metadata) { process.on('uncaughtException', (error) => { console.error(chalk_1.default.red('═══════════════════════════════════════')); console.error(chalk_1.default.red('💀 UNCAUGHT EXCEPTION')); console.error(chalk_1.default.red('═══════════════════════════════════════')); console.error(chalk_1.default.yellow('Service:'), metadata.name); console.error(chalk_1.default.yellow('Error:'), error.message); console.error(chalk_1.default.gray(error.stack)); if (metadata.sdk) { try { if (metadata.sdk && typeof metadata.sdk.recordTelemetry === 'function') { metadata.sdk.recordTelemetry({ event: 'error.uncaught_exception', properties: { errorMessage: error.message, service: metadata.name } }); } } catch (_telemetryError) { console.error('Failed to record telemetry:', _telemetryError); } } process.exit(1); }); process.on('unhandledRejection', (reason, promise) => { console.error(chalk_1.default.red('═══════════════════════════════════════')); console.error(chalk_1.default.red('💀 UNHANDLED REJECTION')); console.error(chalk_1.default.red('═══════════════════════════════════════')); console.error(chalk_1.default.yellow('Service:'), metadata.name); console.error(chalk_1.default.yellow('Reason:'), reason); console.error(chalk_1.default.yellow('Promise:'), promise); if (metadata.sdk) { try { if (metadata.sdk && typeof metadata.sdk.recordTelemetry === 'function') { metadata.sdk.recordTelemetry({ event: 'error.unhandled_rejection', properties: { reason: String(reason), service: metadata.name } }); } } catch (_telemetryError) { console.error('Failed to record telemetry:', _telemetryError); } } }); } function asyncHandler(fn) { return (req, res, next) => { Promise.resolve(fn(req, res, next)).catch(next); }; } function createValidationError(validationError) { const message = validationError.message || 'Validation failed'; let details = {}; if (validationError.details && Array.isArray(validationError.details)) { details = validationError.details.map((detail) => ({ message: detail.message, path: detail.path })); } const error = new SDKError('VALIDATION_ERROR', message, { errors: details }); error.statusCode = 400; error.suggestions = [ 'Check the request payload against the API documentation', 'Ensure all required fields are present', 'Verify data types match the expected format' ]; return error; } function createPhilosophyError(message, impact, industry = 'education') { const error = new SDKError('PHILOSOPHY_VIOLATION', message, { impact, industry }); error.statusCode = 409; const suggestionMap = { education: [ 'Review the School OS philosophy principles', 'Consider how this action affects teacher liberation', 'Ensure student empowerment is maintained', 'Verify process transparency' ], healthcare: [ 'Review patient-first principles', 'Ensure data privacy compliance', 'Consider impact on care quality', 'Verify HIPAA compliance' ], finance: [ 'Review financial compliance requirements', 'Ensure transaction integrity', 'Consider regulatory implications', 'Verify audit trail completeness' ], retail: [ 'Review customer experience guidelines', 'Ensure inventory accuracy', 'Consider impact on sales flow', 'Verify PCI compliance' ] }; error.suggestions = suggestionMap[industry] || suggestionMap.education; return error; } exports.errorMiddleware = createErrorMiddleware; exports.default = createErrorMiddleware; //# sourceMappingURL=error-middleware.js.map