UNPKG

@energica-city/shared-amplify-utils

Version:

Shared utilities for AWS Amplify projects

64 lines 10.7 kB
import { logger } from '../../log'; import { isWebSocketError, WebSocketErrors } from '../../error'; import { buildErrorContext, setupStructuredLogging, getErrorMessage, getErrorStack, } from './utils'; function isMiddlewareError(error) { return (error instanceof Error && typeof error.middlewareName === 'string'); } function getMiddlewareInfo(error) { return { name: error.middlewareName || 'unknown', index: error.middlewareIndex ?? -1, total: error.totalMiddlewares ?? 0, chain: error.middlewareChain || [], }; } export function createWebSocketErrorHandler(config = {}) { const { includeStackTrace = process.env.NODE_ENV === 'development', defaultContext = {}, forceStructuredLogging = true, } = config; return async (input, next) => { setupStructuredLogging(input, forceStructuredLogging, defaultContext); try { return await next(input); } catch (error) { const message = getErrorMessage(error); const stack = includeStackTrace ? getErrorStack(error) : undefined; if (isWebSocketError(error)) { logger.error(`WebSocket error: ${message}`, { ...buildErrorContext(input, error, defaultContext), errorType: 'WebSocketError', ...(stack && { stack }), }); throw error; } if (isMiddlewareError(error)) { const middlewareInfo = getMiddlewareInfo(error); logger.error(`Middleware error in ${middlewareInfo.name}`, { ...buildErrorContext(input, null, defaultContext), middlewareError: middlewareInfo, originalError: message, errorType: 'MiddlewareError', ...(stack && { stack }), }); throw WebSocketErrors.internal(`Middleware error in ${middlewareInfo.name}`, { middlewareName: middlewareInfo.name, middlewareIndex: middlewareInfo.index, totalMiddlewares: middlewareInfo.total, middlewareChain: middlewareInfo.chain, originalError: message, }); } logger.error(`Unexpected error: ${message}`, { ...buildErrorContext(input, null, defaultContext), originalError: message, errorType: error instanceof Error ? error.constructor.name : 'Unknown', ...(stack && { stack }), }); throw WebSocketErrors.internal('Internal server error', { originalError: message, errorType: error instanceof Error ? error.constructor.name : 'Unknown', }); } }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ViU29ja2V0RXJyb3JIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbWlkZGxld2FyZS93ZWJzb2NrZXQvV2ViU29ja2V0RXJyb3JIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbkMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQVNoRSxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLHNCQUFzQixFQUN0QixlQUFlLEVBQ2YsYUFBYSxHQUNkLE1BQU0sU0FBUyxDQUFDO0FBRWpCLFNBQVMsaUJBQWlCLENBQUMsS0FBYztJQUN2QyxPQUFPLENBQ0wsS0FBSyxZQUFZLEtBQUs7UUFDdEIsT0FBUSxLQUF5QixDQUFDLGNBQWMsS0FBSyxRQUFRLENBQzlELENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxLQUFzQjtJQUMvQyxPQUFPO1FBQ0wsSUFBSSxFQUFFLEtBQUssQ0FBQyxjQUFjLElBQUksU0FBUztRQUN2QyxLQUFLLEVBQUUsS0FBSyxDQUFDLGVBQWUsSUFBSSxDQUFDLENBQUM7UUFDbEMsS0FBSyxFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDO1FBQ2xDLEtBQUssRUFBRSxLQUFLLENBQUMsZUFBZSxJQUFJLEVBQUU7S0FDbkMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsMkJBQTJCLENBT3pDLFNBQXNDLEVBQUU7SUFFeEMsTUFBTSxFQUNKLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLGFBQWEsRUFDMUQsY0FBYyxHQUFHLEVBQUUsRUFDbkIsc0JBQXNCLEdBQUcsSUFBSSxHQUM5QixHQUFHLE1BQU0sQ0FBQztJQUVYLE9BQU8sS0FBSyxFQUNWLEtBQXVDLEVBQ3ZDLElBQW9FLEVBQ2xELEVBQUU7UUFDcEIsc0JBQXNCLENBQUMsS0FBSyxFQUFFLHNCQUFzQixFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBRXRFLElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkMsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBRW5FLElBQUksZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsT0FBTyxFQUFFLEVBQUU7b0JBQzFDLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxjQUFjLENBQUM7b0JBQ2xELFNBQVMsRUFBRSxnQkFBZ0I7b0JBQzNCLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztpQkFDeEIsQ0FBQyxDQUFDO2dCQUNILE1BQU0sS0FBSyxDQUFDO1lBQ2QsQ0FBQztZQUVELElBQUksaUJBQWlCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxjQUFjLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hELE1BQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLGNBQWMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDekQsR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLGNBQWMsQ0FBQztvQkFDakQsZUFBZSxFQUFFLGNBQWM7b0JBQy9CLGFBQWEsRUFBRSxPQUFPO29CQUN0QixTQUFTLEVBQUUsaUJBQWlCO29CQUM1QixHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7aUJBQ3hCLENBQUMsQ0FBQztnQkFFSCxNQUFNLGVBQWUsQ0FBQyxRQUFRLENBQzVCLHVCQUF1QixjQUFjLENBQUMsSUFBSSxFQUFFLEVBQzVDO29CQUNFLGNBQWMsRUFBRSxjQUFjLENBQUMsSUFBSTtvQkFDbkMsZUFBZSxFQUFFLGNBQWMsQ0FBQyxLQUFLO29CQUNyQyxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsS0FBSztvQkFDdEMsZUFBZSxFQUFFLGNBQWMsQ0FBQyxLQUFLO29CQUNyQyxhQUFhLEVBQUUsT0FBTztpQkFDdkIsQ0FDRixDQUFDO1lBQ0osQ0FBQztZQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMscUJBQXFCLE9BQU8sRUFBRSxFQUFFO2dCQUMzQyxHQUFHLGlCQUFpQixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDO2dCQUNqRCxhQUFhLEVBQUUsT0FBTztnQkFDdEIsU0FBUyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTO2dCQUN0RSxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7YUFDeEIsQ0FBQyxDQUFDO1lBRUgsTUFBTSxlQUFlLENBQUMsUUFBUSxDQUFDLHVCQUF1QixFQUFFO2dCQUN0RCxhQUFhLEVBQUUsT0FBTztnQkFDdEIsU0FBUyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTO2FBQ3ZFLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vbG9nJztcbmltcG9ydCB7IGlzV2ViU29ja2V0RXJyb3IsIFdlYlNvY2tldEVycm9ycyB9IGZyb20gJy4uLy4uL2Vycm9yJztcbmltcG9ydCB0eXBlIHsgTWlkZGxld2FyZSB9IGZyb20gJy4uL21pZGRsZXdhcmVDaGFpbic7XG5pbXBvcnQgdHlwZSB7XG4gIFdlYlNvY2tldFJlc3BvbnNlLFxuICBXZWJTb2NrZXRJbnB1dFdpdGhNb2RlbHMsXG4gIFdlYlNvY2tldEVycm9ySGFuZGxlckNvbmZpZyxcbiAgTWlkZGxld2FyZUVycm9yLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQW1wbGlmeU1vZGVsVHlwZSB9IGZyb20gJy4uLy4uL3F1ZXJpZXMvdHlwZXMnO1xuaW1wb3J0IHtcbiAgYnVpbGRFcnJvckNvbnRleHQsXG4gIHNldHVwU3RydWN0dXJlZExvZ2dpbmcsXG4gIGdldEVycm9yTWVzc2FnZSxcbiAgZ2V0RXJyb3JTdGFjayxcbn0gZnJvbSAnLi91dGlscyc7XG5cbmZ1bmN0aW9uIGlzTWlkZGxld2FyZUVycm9yKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgTWlkZGxld2FyZUVycm9yIHtcbiAgcmV0dXJuIChcbiAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgdHlwZW9mIChlcnJvciBhcyBNaWRkbGV3YXJlRXJyb3IpLm1pZGRsZXdhcmVOYW1lID09PSAnc3RyaW5nJ1xuICApO1xufVxuXG5mdW5jdGlvbiBnZXRNaWRkbGV3YXJlSW5mbyhlcnJvcjogTWlkZGxld2FyZUVycm9yKSB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogZXJyb3IubWlkZGxld2FyZU5hbWUgfHwgJ3Vua25vd24nLFxuICAgIGluZGV4OiBlcnJvci5taWRkbGV3YXJlSW5kZXggPz8gLTEsXG4gICAgdG90YWw6IGVycm9yLnRvdGFsTWlkZGxld2FyZXMgPz8gMCxcbiAgICBjaGFpbjogZXJyb3IubWlkZGxld2FyZUNoYWluIHx8IFtdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV2ViU29ja2V0RXJyb3JIYW5kbGVyPFxuICBUVHlwZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBBbXBsaWZ5TW9kZWxUeXBlPiA9IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgQW1wbGlmeU1vZGVsVHlwZVxuICA+LFxuICBUT3V0cHV0ID0gV2ViU29ja2V0UmVzcG9uc2UsXG4+KFxuICBjb25maWc6IFdlYlNvY2tldEVycm9ySGFuZGxlckNvbmZpZyA9IHt9LFxuKTogTWlkZGxld2FyZTxXZWJTb2NrZXRJbnB1dFdpdGhNb2RlbHM8VFR5cGVzPiwgVE91dHB1dD4ge1xuICBjb25zdCB7XG4gICAgaW5jbHVkZVN0YWNrVHJhY2UgPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyxcbiAgICBkZWZhdWx0Q29udGV4dCA9IHt9LFxuICAgIGZvcmNlU3RydWN0dXJlZExvZ2dpbmcgPSB0cnVlLFxuICB9ID0gY29uZmlnO1xuXG4gIHJldHVybiBhc3luYyAoXG4gICAgaW5wdXQ6IFdlYlNvY2tldElucHV0V2l0aE1vZGVsczxUVHlwZXM+LFxuICAgIG5leHQ6IChpbnB1dD86IFdlYlNvY2tldElucHV0V2l0aE1vZGVsczxUVHlwZXM+KSA9PiBQcm9taXNlPFRPdXRwdXQ+LFxuICApOiBQcm9taXNlPFRPdXRwdXQ+ID0+IHtcbiAgICBzZXR1cFN0cnVjdHVyZWRMb2dnaW5nKGlucHV0LCBmb3JjZVN0cnVjdHVyZWRMb2dnaW5nLCBkZWZhdWx0Q29udGV4dCk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IG5leHQoaW5wdXQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZ2V0RXJyb3JNZXNzYWdlKGVycm9yKTtcbiAgICAgIGNvbnN0IHN0YWNrID0gaW5jbHVkZVN0YWNrVHJhY2UgPyBnZXRFcnJvclN0YWNrKGVycm9yKSA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKGlzV2ViU29ja2V0RXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgV2ViU29ja2V0IGVycm9yOiAke21lc3NhZ2V9YCwge1xuICAgICAgICAgIC4uLmJ1aWxkRXJyb3JDb250ZXh0KGlucHV0LCBlcnJvciwgZGVmYXVsdENvbnRleHQpLFxuICAgICAgICAgIGVycm9yVHlwZTogJ1dlYlNvY2tldEVycm9yJyxcbiAgICAgICAgICAuLi4oc3RhY2sgJiYgeyBzdGFjayB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNNaWRkbGV3YXJlRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIGNvbnN0IG1pZGRsZXdhcmVJbmZvID0gZ2V0TWlkZGxld2FyZUluZm8oZXJyb3IpO1xuICAgICAgICBsb2dnZXIuZXJyb3IoYE1pZGRsZXdhcmUgZXJyb3IgaW4gJHttaWRkbGV3YXJlSW5mby5uYW1lfWAsIHtcbiAgICAgICAgICAuLi5idWlsZEVycm9yQ29udGV4dChpbnB1dCwgbnVsbCwgZGVmYXVsdENvbnRleHQpLFxuICAgICAgICAgIG1pZGRsZXdhcmVFcnJvcjogbWlkZGxld2FyZUluZm8sXG4gICAgICAgICAgb3JpZ2luYWxFcnJvcjogbWVzc2FnZSxcbiAgICAgICAgICBlcnJvclR5cGU6ICdNaWRkbGV3YXJlRXJyb3InLFxuICAgICAgICAgIC4uLihzdGFjayAmJiB7IHN0YWNrIH0pLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aHJvdyBXZWJTb2NrZXRFcnJvcnMuaW50ZXJuYWwoXG4gICAgICAgICAgYE1pZGRsZXdhcmUgZXJyb3IgaW4gJHttaWRkbGV3YXJlSW5mby5uYW1lfWAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWlkZGxld2FyZU5hbWU6IG1pZGRsZXdhcmVJbmZvLm5hbWUsXG4gICAgICAgICAgICBtaWRkbGV3YXJlSW5kZXg6IG1pZGRsZXdhcmVJbmZvLmluZGV4LFxuICAgICAgICAgICAgdG90YWxNaWRkbGV3YXJlczogbWlkZGxld2FyZUluZm8udG90YWwsXG4gICAgICAgICAgICBtaWRkbGV3YXJlQ2hhaW46IG1pZGRsZXdhcmVJbmZvLmNoYWluLFxuICAgICAgICAgICAgb3JpZ2luYWxFcnJvcjogbWVzc2FnZSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuZXJyb3IoYFVuZXhwZWN0ZWQgZXJyb3I6ICR7bWVzc2FnZX1gLCB7XG4gICAgICAgIC4uLmJ1aWxkRXJyb3JDb250ZXh0KGlucHV0LCBudWxsLCBkZWZhdWx0Q29udGV4dCksXG4gICAgICAgIG9yaWdpbmFsRXJyb3I6IG1lc3NhZ2UsXG4gICAgICAgIGVycm9yVHlwZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgOiAnVW5rbm93bicsXG4gICAgICAgIC4uLihzdGFjayAmJiB7IHN0YWNrIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIHRocm93IFdlYlNvY2tldEVycm9ycy5pbnRlcm5hbCgnSW50ZXJuYWwgc2VydmVyIGVycm9yJywge1xuICAgICAgICBvcmlnaW5hbEVycm9yOiBtZXNzYWdlLFxuICAgICAgICBlcnJvclR5cGU6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5jb25zdHJ1Y3Rvci5uYW1lIDogJ1Vua25vd24nLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xufVxuIl19