UNPKG

@energica-city/shared-amplify-utils

Version:

Shared utilities for AWS Amplify projects

136 lines 14.6 kB
import { throwError, extractErrorMessage, createErrorContext, } from './error'; /** * WebSocket-specific error codes */ export const WebSocketErrorCodes = { VALIDATION_ERROR: 'VALIDATION_ERROR', AUTHENTICATION_ERROR: 'AUTHENTICATION_ERROR', AUTHORIZATION_ERROR: 'AUTHORIZATION_ERROR', CONNECTION_ERROR: 'CONNECTION_ERROR', MESSAGE_TOO_LARGE: 'MESSAGE_TOO_LARGE', RATE_LIMIT_EXCEEDED: 'RATE_LIMIT_EXCEEDED', INTERNAL_SERVER_ERROR: 'INTERNAL_SERVER_ERROR', BAD_REQUEST: 'BAD_REQUEST', SERVICE_UNAVAILABLE: 'SERVICE_UNAVAILABLE', }; /** * Creates a WebSocket-specific error with proper status code and error code */ export function throwWebSocketError(statusCode, code, message, context) { const { originalError, ...errorContext } = context || {}; const fullContext = createErrorContext({ ...errorContext, statusCode, code, originalError, }); throwError(message, fullContext); } /** * Convenience functions for common WebSocket error scenarios */ export const WebSocketErrors = { /** * Throws a validation error (400) */ validation(message, context, originalError) { throwWebSocketError(400, 'VALIDATION_ERROR', message, { ...context, originalError, }); }, /** * Throws an authentication error (401) */ authentication(message, context, originalError) { throwWebSocketError(401, 'AUTHENTICATION_ERROR', message, { ...context, originalError, }); }, /** * Throws an authorization error (403) */ authorization(message, context, originalError) { throwWebSocketError(403, 'AUTHORIZATION_ERROR', message, { ...context, originalError, }); }, /** * Throws a connection error (400) */ connection(message, context, originalError) { throwWebSocketError(400, 'CONNECTION_ERROR', message, { ...context, originalError, }); }, /** * Throws a message too large error (413) */ messageTooLarge(message, context, originalError) { throwWebSocketError(413, 'MESSAGE_TOO_LARGE', message, { ...context, originalError, }); }, /** * Throws a rate limit error (429) */ rateLimitExceeded(message, context, originalError) { throwWebSocketError(429, 'RATE_LIMIT_EXCEEDED', message, { ...context, originalError, }); }, /** * Throws a bad request error (400) */ badRequest(message, context, originalError) { throwWebSocketError(400, 'BAD_REQUEST', message, { ...context, originalError, }); }, /** * Throws a service unavailable error (503) */ serviceUnavailable(message, context, originalError) { throwWebSocketError(503, 'SERVICE_UNAVAILABLE', message, { ...context, originalError, }); }, /** * Throws an internal server error (500) */ internal(message, context, originalError) { throwWebSocketError(500, 'INTERNAL_SERVER_ERROR', message, { ...context, originalError, }); }, }; /** * Checks if an error is a WebSocket error with status code */ export function isWebSocketError(error) { return (error instanceof Error && 'context' in error && typeof error.context === 'object' && typeof error.statusCode === 'number' && typeof error.code === 'string'); } /** * Extracts WebSocket error information for response formatting */ export function extractWebSocketErrorInfo(error) { return { statusCode: error.statusCode || 500, code: error.code || WebSocketErrorCodes.INTERNAL_SERVER_ERROR, message: extractErrorMessage(error), context: error.context, }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vZXJyb3Ivd2Vic29ja2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLGtCQUFrQixHQUVuQixNQUFNLFNBQVMsQ0FBQztBQUVqQjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHO0lBQ2pDLGdCQUFnQixFQUFFLGtCQUFrQjtJQUNwQyxvQkFBb0IsRUFBRSxzQkFBc0I7SUFDNUMsbUJBQW1CLEVBQUUscUJBQXFCO0lBQzFDLGdCQUFnQixFQUFFLGtCQUFrQjtJQUNwQyxpQkFBaUIsRUFBRSxtQkFBbUI7SUFDdEMsbUJBQW1CLEVBQUUscUJBQXFCO0lBQzFDLHFCQUFxQixFQUFFLHVCQUF1QjtJQUM5QyxXQUFXLEVBQUUsYUFBYTtJQUMxQixtQkFBbUIsRUFBRSxxQkFBcUI7Q0FDbEMsQ0FBQztBQXNCWDs7R0FFRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsVUFBa0IsRUFDbEIsSUFBc0MsRUFDdEMsT0FBZSxFQUNmLE9BQTZEO0lBRTdELE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FBRyxZQUFZLEVBQUUsR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO0lBRXpELE1BQU0sV0FBVyxHQUFHLGtCQUFrQixDQUFDO1FBQ3JDLEdBQUcsWUFBWTtRQUNmLFVBQVU7UUFDVixJQUFJO1FBQ0osYUFBYTtLQUNkLENBQUMsQ0FBQztJQUVILFVBQVUsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHO0lBQzdCOztPQUVHO0lBQ0gsVUFBVSxDQUNSLE9BQWUsRUFDZixPQUErQixFQUMvQixhQUF1QjtRQUV2QixtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxFQUFFO1lBQ3BELEdB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RXJyb3IsXG4gIGV4dHJhY3RFcnJvck1lc3NhZ2UsXG4gIGNyZWF0ZUVycm9yQ29udGV4dCxcbiAgdHlwZSBFcnJvckNvbnRleHQsXG59IGZyb20gJy4vZXJyb3InO1xuXG4vKipcbiAqIFdlYlNvY2tldC1zcGVjaWZpYyBlcnJvciBjb2Rlc1xuICovXG5leHBvcnQgY29uc3QgV2ViU29ja2V0RXJyb3JDb2RlcyA9IHtcbiAgVkFMSURBVElPTl9FUlJPUjogJ1ZBTElEQVRJT05fRVJST1InLFxuICBBVVRIRU5USUNBVElPTl9FUlJPUjogJ0FVVEhFTlRJQ0FUSU9OX0VSUk9SJyxcbiAgQVVUSE9SSVpBVElPTl9FUlJPUjogJ0FVVEhPUklaQVRJT05fRVJST1InLFxuICBDT05ORUNUSU9OX0VSUk9SOiAnQ09OTkVDVElPTl9FUlJPUicsXG4gIE1FU1NBR0VfVE9PX0xBUkdFOiAnTUVTU0FHRV9UT09fTEFSR0UnLFxuICBSQVRFX0xJTUlUX0VYQ0VFREVEOiAnUkFURV9MSU1JVF9FWENFRURFRCcsXG4gIElOVEVSTkFMX1NFUlZFUl9FUlJPUjogJ0lOVEVSTkFMX1NFUlZFUl9FUlJPUicsXG4gIEJBRF9SRVFVRVNUOiAnQkFEX1JFUVVFU1QnLFxuICBTRVJWSUNFX1VOQVZBSUxBQkxFOiAnU0VSVklDRV9VTkFWQUlMQUJMRScsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIFdlYlNvY2tldCBlcnJvciBjb250ZXh0IHdpdGggY29ubmVjdGlvbi1zcGVjaWZpYyBpbmZvcm1hdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldEVycm9yQ29udGV4dCBleHRlbmRzIEVycm9yQ29udGV4dCB7XG4gIGNvbm5lY3Rpb25JZD86IHN0cmluZztcbiAgcm91dGVLZXk/OiBzdHJpbmc7XG4gIGV2ZW50VHlwZT86ICdDT05ORUNUJyB8ICdESVNDT05ORUNUJyB8ICdNRVNTQUdFJztcbiAgbWVzc2FnZUlkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEVuaGFuY2VkIFdlYlNvY2tldCBlcnJvciB3aXRoIHN0YXR1cyBjb2RlIGFuZCBlcnJvciBjb2RlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU29ja2V0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgY29kZTogc3RyaW5nO1xuICBjb250ZXh0PzogV2ViU29ja2V0RXJyb3JDb250ZXh0O1xuICBvcmlnaW5hbEVycm9yPzogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgV2ViU29ja2V0LXNwZWNpZmljIGVycm9yIHdpdGggcHJvcGVyIHN0YXR1cyBjb2RlIGFuZCBlcnJvciBjb2RlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd1dlYlNvY2tldEVycm9yKFxuICBzdGF0dXNDb2RlOiBudW1iZXIsXG4gIGNvZGU6IGtleW9mIHR5cGVvZiBXZWJTb2NrZXRFcnJvckNvZGVzLFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIGNvbnRleHQ/OiBXZWJTb2NrZXRFcnJvckNvbnRleHQgJiB7IG9yaWdpbmFsRXJyb3I/OiB1bmtub3duIH0sXG4pOiBuZXZlciB7XG4gIGNvbnN0IHsgb3JpZ2luYWxFcnJvciwgLi4uZXJyb3JDb250ZXh0IH0gPSBjb250ZXh0IHx8IHt9O1xuXG4gIGNvbnN0IGZ1bGxDb250ZXh0ID0gY3JlYXRlRXJyb3JDb250ZXh0KHtcbiAgICAuLi5lcnJvckNvbnRleHQsXG4gICAgc3RhdHVzQ29kZSxcbiAgICBjb2RlLFxuICAgIG9yaWdpbmFsRXJyb3IsXG4gIH0pO1xuXG4gIHRocm93RXJyb3IobWVzc2FnZSwgZnVsbENvbnRleHQpO1xufVxuXG4vKipcbiAqIENvbnZlbmllbmNlIGZ1bmN0aW9ucyBmb3IgY29tbW9uIFdlYlNvY2tldCBlcnJvciBzY2VuYXJpb3NcbiAqL1xuZXhwb3J0IGNvbnN0IFdlYlNvY2tldEVycm9ycyA9IHtcbiAgLyoqXG4gICAqIFRocm93cyBhIHZhbGlkYXRpb24gZXJyb3IgKDQwMClcbiAgICovXG4gIHZhbGlkYXRpb24oXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGNvbnRleHQ/OiBXZWJTb2NrZXRFcnJvckNvbnRleHQsXG4gICAgb3JpZ2luYWxFcnJvcj86IHVua25vd24sXG4gICk6IG5ldmVyIHtcbiAgICB0aHJvd1dlYlNvY2tldEVycm9yKDQwMCwgJ1ZBTElEQVRJT05fRVJST1InLCBtZXNzYWdlLCB7XG4gICAgICAuLi5jb250ZXh0LFxuICAgICAgb3JpZ2luYWxFcnJvcixcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogVGhyb3dzIGFuIGF1dGhlbnRpY2F0aW9uIGVycm9yICg0MDEpXG4gICAqL1xuICBhdXRoZW50aWNhdGlvbihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgY29udGV4dD86IFdlYlNvY2tldEVycm9yQ29udGV4dCxcbiAgICBvcmlnaW5hbEVycm9yPzogdW5rbm93bixcbiAgKTogbmV2ZXIge1xuICAgIHRocm93V2ViU29ja2V0RXJyb3IoNDAxLCAnQVVUSEVOVElDQVRJT05fRVJST1InLCBtZXNzYWdlLCB7XG4gICAgICAuLi5jb250ZXh0LFxuICAgICAgb3JpZ2luYWxFcnJvcixcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogVGhyb3dzIGFuIGF1dGhvcml6YXRpb24gZXJyb3IgKDQwMylcbiAgICovXG4gIGF1dGhvcml6YXRpb24oXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGNvbnRleHQ/OiBXZWJTb2NrZXRFcnJvckNvbnRleHQsXG4gICAgb3JpZ2luYWxFcnJvcj86IHVua25vd24sXG4gICk6IG5ldmVyIHtcbiAgICB0aHJvd1dlYlNvY2tldEVycm9yKDQwMywgJ0FVVEhPUklaQVRJT05fRVJST1InLCBtZXNzYWdlLCB7XG4gICAgICAuLi5jb250ZXh0LFxuICAgICAgb3JpZ2luYWxFcnJvcixcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogVGhyb3dzIGEgY29ubmVjdGlvbiBlcnJvciAoNDAwKVxuICAgKi9cbiAgY29ubmVjdGlvbihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgY29udGV4dD86IFdlYlNvY2tldEVycm9yQ29udGV4dCxcbiAgICBvcmlnaW5hbEVycm9yPzogdW5rbm93bixcbiAgKTogbmV2ZXIge1xuICAgIHRocm93V2ViU29ja2V0RXJyb3IoNDAwLCAnQ09OTkVDVElPTl9FUlJPUicsIG1lc3NhZ2UsIHtcbiAgICAgIC4uLmNvbnRleHQsXG4gICAgICBvcmlnaW5hbEVycm9yLFxuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYSBtZXNzYWdlIHRvbyBsYXJnZSBlcnJvciAoNDEzKVxuICAgKi9cbiAgbWVzc2FnZVRvb0xhcmdlKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBjb250ZXh0PzogV2ViU29ja2V0RXJyb3JDb250ZXh0LFxuICAgIG9yaWdpbmFsRXJyb3I/OiB1bmtub3duLFxuICApOiBuZXZlciB7XG4gICAgdGhyb3dXZWJTb2NrZXRFcnJvcig0MTMsICdNRVNTQUdFX1RPT19MQVJHRScsIG1lc3NhZ2UsIHtcbiAgICAgIC4uLmNvbnRleHQsXG4gICAgICBvcmlnaW5hbEVycm9yLFxuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYSByYXRlIGxpbWl0IGVycm9yICg0MjkpXG4gICAqL1xuICByYXRlTGltaXRFeGNlZWRlZChcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgY29udGV4dD86IFdlYlNvY2tldEVycm9yQ29udGV4dCxcbiAgICBvcmlnaW5hbEVycm9yPzogdW5rbm93bixcbiAgKTogbmV2ZXIge1xuICAgIHRocm93V2ViU29ja2V0RXJyb3IoNDI5LCAnUkFURV9MSU1JVF9FWENFRURFRCcsIG1lc3NhZ2UsIHtcbiAgICAgIC4uLmNvbnRleHQsXG4gICAgICBvcmlnaW5hbEVycm9yLFxuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYSBiYWQgcmVxdWVzdCBlcnJvciAoNDAwKVxuICAgKi9cbiAgYmFkUmVxdWVzdChcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgY29udGV4dD86IFdlYlNvY2tldEVycm9yQ29udGV4dCxcbiAgICBvcmlnaW5hbEVycm9yPzogdW5rbm93bixcbiAgKTogbmV2ZXIge1xuICAgIHRocm93V2ViU29ja2V0RXJyb3IoNDAwLCAnQkFEX1JFUVVFU1QnLCBtZXNzYWdlLCB7XG4gICAgICAuLi5jb250ZXh0LFxuICAgICAgb3JpZ2luYWxFcnJvcixcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogVGhyb3dzIGEgc2VydmljZSB1bmF2YWlsYWJsZSBlcnJvciAoNTAzKVxuICAgKi9cbiAgc2VydmljZVVuYXZhaWxhYmxlKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBjb250ZXh0PzogV2ViU29ja2V0RXJyb3JDb250ZXh0LFxuICAgIG9yaWdpbmFsRXJyb3I/OiB1bmtub3duLFxuICApOiBuZXZlciB7XG4gICAgdGhyb3dXZWJTb2NrZXRFcnJvcig1MDMsICdTRVJWSUNFX1VOQVZBSUxBQkxFJywgbWVzc2FnZSwge1xuICAgICAgLi4uY29udGV4dCxcbiAgICAgIG9yaWdpbmFsRXJyb3IsXG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFRocm93cyBhbiBpbnRlcm5hbCBzZXJ2ZXIgZXJyb3IgKDUwMClcbiAgICovXG4gIGludGVybmFsKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBjb250ZXh0PzogV2ViU29ja2V0RXJyb3JDb250ZXh0LFxuICAgIG9yaWdpbmFsRXJyb3I/OiB1bmtub3duLFxuICApOiBuZXZlciB7XG4gICAgdGhyb3dXZWJTb2NrZXRFcnJvcig1MDAsICdJTlRFUk5BTF9TRVJWRVJfRVJST1InLCBtZXNzYWdlLCB7XG4gICAgICAuLi5jb250ZXh0LFxuICAgICAgb3JpZ2luYWxFcnJvcixcbiAgICB9KTtcbiAgfSxcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGVycm9yIGlzIGEgV2ViU29ja2V0IGVycm9yIHdpdGggc3RhdHVzIGNvZGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV2ViU29ja2V0RXJyb3IoZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBXZWJTb2NrZXRFcnJvciB7XG4gIHJldHVybiAoXG4gICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAgICdjb250ZXh0JyBpbiBlcnJvciAmJlxuICAgIHR5cGVvZiAoZXJyb3IgYXMgeyBjb250ZXh0PzogdW5rbm93biB9KS5jb250ZXh0ID09PSAnb2JqZWN0JyAmJlxuICAgIHR5cGVvZiAoZXJyb3IgYXMgV2ViU29ja2V0RXJyb3IpLnN0YXR1c0NvZGUgPT09ICdudW1iZXInICYmXG4gICAgdHlwZW9mIChlcnJvciBhcyBXZWJTb2NrZXRFcnJvcikuY29kZSA9PT0gJ3N0cmluZydcbiAgKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBXZWJTb2NrZXQgZXJyb3IgaW5mb3JtYXRpb24gZm9yIHJlc3BvbnNlIGZvcm1hdHRpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RXZWJTb2NrZXRFcnJvckluZm8oZXJyb3I6IFdlYlNvY2tldEVycm9yKToge1xuICBzdGF0dXNDb2RlOiBudW1iZXI7XG4gIGNvZGU6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBjb250ZXh0PzogV2ViU29ja2V0RXJyb3JDb250ZXh0O1xufSB7XG4gIHJldHVybiB7XG4gICAgc3RhdHVzQ29kZTogZXJyb3Iuc3RhdHVzQ29kZSB8fCA1MDAsXG4gICAgY29kZTogZXJyb3IuY29kZSB8fCBXZWJTb2NrZXRFcnJvckNvZGVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUixcbiAgICBtZXNzYWdlOiBleHRyYWN0RXJyb3JNZXNzYWdlKGVycm9yKSxcbiAgICBjb250ZXh0OiBlcnJvci5jb250ZXh0LFxuICB9O1xufVxuIl19