@energica-city/shared-amplify-utils
Version:
Shared utilities for AWS Amplify projects
94 lines • 10.6 kB
JavaScript
import { logger } from '../../log';
/**
* Build standardized log context for WebSocket operations
*/
export function buildWebSocketContext(input, additionalContext = {}) {
const { event, context } = input;
const { requestContext } = event;
return {
...additionalContext,
connectionId: requestContext.connectionId,
routeKey: requestContext.routeKey,
eventType: requestContext.eventType,
messageId: requestContext.messageId,
requestId: context.awsRequestId,
functionName: context.functionName,
functionVersion: context.functionVersion,
};
}
/**
* Extract basic event information for logging
*/
export function extractEventInfo(event) {
const { requestContext, body } = event;
return {
connectionId: requestContext.connectionId,
routeKey: requestContext.routeKey,
eventType: requestContext.eventType,
messageId: requestContext.messageId,
hasBody: !!body,
bodyLength: body?.length || 0,
};
}
/**
* Safely parse JSON body with error handling
*/
export function parseJsonBody(body, context) {
if (!body)
return null;
try {
return JSON.parse(body);
}
catch (error) {
logger.warn('Failed to parse WebSocket message body', {
...context,
bodyLength: body.length,
error: error instanceof Error ? error.message : String(error),
});
return null;
}
}
/**
* Setup structured logging for WebSocket middleware
*/
export function setupStructuredLogging(input, forceStructuredLogging = true, defaultContext = {}) {
if (forceStructuredLogging && !logger.isStructuredLoggingEnabled()) {
logger.setStructuredLogging(true);
}
logger.setContext({
...buildWebSocketContext(input, defaultContext),
});
}
/**
* Check if event is a MESSAGE type
*/
export function isMessageEvent(event) {
return event.requestContext.eventType === 'MESSAGE';
}
/**
* Extract error message safely
*/
export function getErrorMessage(error) {
return error instanceof Error ? error.message : String(error);
}
/**
* Get error stack trace if available
*/
export function getErrorStack(error) {
return error instanceof Error ? error.stack : undefined;
}
/**
* Build error context with WebSocket information
*/
export function buildErrorContext(input, error, additionalContext = {}) {
const baseContext = buildWebSocketContext(input, additionalContext);
if (error) {
return {
...baseContext,
errorCode: error.code,
statusCode: error.statusCode,
};
}
return baseContext;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9taWRkbGV3YXJlL3dlYnNvY2tldC91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBSW5DOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQU1uQyxLQUF1QyxFQUN2QyxvQkFBNkMsRUFBRTtJQUUvQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxHQUFHLEtBQUssQ0FBQztJQUNqQyxNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUcsS0FBSyxDQUFDO0lBRWpDLE9BQU87UUFDTCxHQUFHLGlCQUFpQjtRQUNwQixZQUFZLEVBQUUsY0FBYyxDQUFDLFlBQVk7UUFDekMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxRQUFRO1FBQ2pDLFNBQVMsRUFBRSxjQUFjLENBQUMsU0FBUztRQUNuQyxTQUFTLEVBQUUsY0FBYyxDQUFDLFNBQVM7UUFDbkMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxZQUFZO1FBQy9CLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtRQUNsQyxlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWU7S0FDekMsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsS0FBcUI7SUFFckIsTUFBTSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFFdkMsT0FBTztRQUNMLFlBQVksRUFBRSxjQUFjLENBQUMsWUFBWTtRQUN6QyxRQUFRLEVBQUUsY0FBYyxDQUFDLFFBQVE7UUFDakMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxTQUFTO1FBQ25DLFNBQVMsRUFBRSxjQUFjLENBQUMsU0FBUztRQUNuQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUk7UUFDZixVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDO0tBQzlCLENBQUM7QUFDSixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUMzQixJQUF3QixFQUN4QixPQUFnQztJQUVoQyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRXZCLElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0NBQXdDLEVBQUU7WUFDcEQsR0FBRyxPQUFPO1lBQ1YsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ3ZCLEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQzlELENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FNcEMsS0FBdUMsRUFDdkMseUJBQWtDLElBQUksRUFDdEMsaUJBQTBDLEVBQUU7SUFFNUMsSUFBSSxzQkFBc0IsSUFBSSxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsRUFBRSxFQUFFLENBQUM7UUFDbkUsTUFBTSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxNQUFNLENBQUMsVUFBVSxDQUFDO1FBQ2hCLEdBQUcscUJBQXFCLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQztLQUNoRCxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQXFCO0lBQ2xELE9BQU8sS0FBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBYztJQUM1QyxPQUFPLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLEtBQWM7SUFDMUMsT0FBTyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDMUQsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQU0vQixLQUF1QyxFQUN2QyxLQUFvRCxFQUNwRCxvQkFBNkMsRUFBRTtJQUUvQyxNQUFNLFdBQVcsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUVwRSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1YsT0FBTztZQUNMLEdBQUcsV0FBVztZQUNkLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSTtZQUNyQixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7U0FDN0IsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vbG9nJztcbmltcG9ydCB0eXBlIHsgV2ViU29ja2V0SW5wdXRXaXRoTW9kZWxzLCBXZWJTb2NrZXRFdmVudCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBbXBsaWZ5TW9kZWxUeXBlIH0gZnJvbSAnLi4vLi4vcXVlcmllcy90eXBlcyc7XG5cbi8qKlxuICogQnVpbGQgc3RhbmRhcmRpemVkIGxvZyBjb250ZXh0IGZvciBXZWJTb2NrZXQgb3BlcmF0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRXZWJTb2NrZXRDb250ZXh0PFxuICBUVHlwZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBBbXBsaWZ5TW9kZWxUeXBlPiA9IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgQW1wbGlmeU1vZGVsVHlwZVxuICA+LFxuPihcbiAgaW5wdXQ6IFdlYlNvY2tldElucHV0V2l0aE1vZGVsczxUVHlwZXM+LFxuICBhZGRpdGlvbmFsQ29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSxcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgeyBldmVudCwgY29udGV4dCB9ID0gaW5wdXQ7XG4gIGNvbnN0IHsgcmVxdWVzdENvbnRleHQgfSA9IGV2ZW50O1xuXG4gIHJldHVybiB7XG4gICAgLi4uYWRkaXRpb25hbENvbnRleHQsXG4gICAgY29ubmVjdGlvbklkOiByZXF1ZXN0Q29udGV4dC5jb25uZWN0aW9uSWQsXG4gICAgcm91dGVLZXk6IHJlcXVlc3RDb250ZXh0LnJvdXRlS2V5LFxuICAgIGV2ZW50VHlwZTogcmVxdWVzdENvbnRleHQuZXZlbnRUeXBlLFxuICAgIG1lc3NhZ2VJZDogcmVxdWVzdENvbnRleHQubWVzc2FnZUlkLFxuICAgIHJlcXVlc3RJZDogY29udGV4dC5hd3NSZXF1ZXN0SWQsXG4gICAgZnVuY3Rpb25OYW1lOiBjb250ZXh0LmZ1bmN0aW9uTmFtZSxcbiAgICBmdW5jdGlvblZlcnNpb246IGNvbnRleHQuZnVuY3Rpb25WZXJzaW9uLFxuICB9O1xufVxuXG4vKipcbiAqIEV4dHJhY3QgYmFzaWMgZXZlbnQgaW5mb3JtYXRpb24gZm9yIGxvZ2dpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RFdmVudEluZm8oXG4gIGV2ZW50OiBXZWJTb2NrZXRFdmVudCxcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgeyByZXF1ZXN0Q29udGV4dCwgYm9keSB9ID0gZXZlbnQ7XG5cbiAgcmV0dXJuIHtcbiAgICBjb25uZWN0aW9uSWQ6IHJlcXVlc3RDb250ZXh0LmNvbm5lY3Rpb25JZCxcbiAgICByb3V0ZUtleTogcmVxdWVzdENvbnRleHQucm91dGVLZXksXG4gICAgZXZlbnRUeXBlOiByZXF1ZXN0Q29udGV4dC5ldmVudFR5cGUsXG4gICAgbWVzc2FnZUlkOiByZXF1ZXN0Q29udGV4dC5tZXNzYWdlSWQsXG4gICAgaGFzQm9keTogISFib2R5LFxuICAgIGJvZHlMZW5ndGg6IGJvZHk/Lmxlbmd0aCB8fCAwLFxuICB9O1xufVxuXG4vKipcbiAqIFNhZmVseSBwYXJzZSBKU09OIGJvZHkgd2l0aCBlcnJvciBoYW5kbGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VKc29uQm9keShcbiAgYm9keTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IHVua25vd24ge1xuICBpZiAoIWJvZHkpIHJldHVybiBudWxsO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoYm9keSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBwYXJzZSBXZWJTb2NrZXQgbWVzc2FnZSBib2R5Jywge1xuICAgICAgLi4uY29udGV4dCxcbiAgICAgIGJvZHlMZW5ndGg6IGJvZHkubGVuZ3RoLFxuICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIFNldHVwIHN0cnVjdHVyZWQgbG9nZ2luZyBmb3IgV2ViU29ja2V0IG1pZGRsZXdhcmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldHVwU3RydWN0dXJlZExvZ2dpbmc8XG4gIFRUeXBlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIEFtcGxpZnlNb2RlbFR5cGU+ID0gUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBBbXBsaWZ5TW9kZWxUeXBlXG4gID4sXG4+KFxuICBpbnB1dDogV2ViU29ja2V0SW5wdXRXaXRoTW9kZWxzPFRUeXBlcz4sXG4gIGZvcmNlU3RydWN0dXJlZExvZ2dpbmc6IGJvb2xlYW4gPSB0cnVlLFxuICBkZWZhdWx0Q29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSxcbik6IHZvaWQge1xuICBpZiAoZm9yY2VTdHJ1Y3R1cmVkTG9nZ2luZyAmJiAhbG9nZ2VyLmlzU3RydWN0dXJlZExvZ2dpbmdFbmFibGVkKCkpIHtcbiAgICBsb2dnZXIuc2V0U3RydWN0dXJlZExvZ2dpbmcodHJ1ZSk7XG4gIH1cblxuICBsb2dnZXIuc2V0Q29udGV4dCh7XG4gICAgLi4uYnVpbGRXZWJTb2NrZXRDb250ZXh0KGlucHV0LCBkZWZhdWx0Q29udGV4dCksXG4gIH0pO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGV2ZW50IGlzIGEgTUVTU0FHRSB0eXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01lc3NhZ2VFdmVudChldmVudDogV2ViU29ja2V0RXZlbnQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGV2ZW50LnJlcXVlc3RDb250ZXh0LmV2ZW50VHlwZSA9PT0gJ01FU1NBR0UnO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgZXJyb3IgbWVzc2FnZSBzYWZlbHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVycm9yTWVzc2FnZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG59XG5cbi8qKlxuICogR2V0IGVycm9yIHN0YWNrIHRyYWNlIGlmIGF2YWlsYWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXJyb3JTdGFjayhlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQnVpbGQgZXJyb3IgY29udGV4dCB3aXRoIFdlYlNvY2tldCBpbmZvcm1hdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFcnJvckNvbnRleHQ8XG4gIFRUeXBlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIEFtcGxpZnlNb2RlbFR5cGU+ID0gUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBBbXBsaWZ5TW9kZWxUeXBlXG4gID4sXG4+KFxuICBpbnB1dDogV2ViU29ja2V0SW5wdXRXaXRoTW9kZWxzPFRUeXBlcz4sXG4gIGVycm9yOiB7IGNvZGU/OiBzdHJpbmc7IHN0YXR1c0NvZGU/OiBudW1iZXIgfSB8IG51bGwsXG4gIGFkZGl0aW9uYWxDb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCBiYXNlQ29udGV4dCA9IGJ1aWxkV2ViU29ja2V0Q29udGV4dChpbnB1dCwgYWRkaXRpb25hbENvbnRleHQpO1xuXG4gIGlmIChlcnJvcikge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5iYXNlQ29udGV4dCxcbiAgICAgIGVycm9yQ29kZTogZXJyb3IuY29kZSxcbiAgICAgIHN0YXR1c0NvZGU6IGVycm9yLnN0YXR1c0NvZGUsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBiYXNlQ29udGV4dDtcbn1cbiJdfQ==