UNPKG

@energica-city/shared-amplify-utils

Version:

Shared utilities for AWS Amplify projects

110 lines 14.8 kB
import { logger } from '../../log'; import { sanitizeObject } from '../utils/sanitization'; import { extractEventInfo, setupStructuredLogging } from './utils'; function extractResponseInfo(response, config) { const { excludeResponseFields = [], maxDepth = 3 } = config; if (response && typeof response === 'object' && 'statusCode' in response && 'body' in response) { const wsResponse = response; const info = { statusCode: wsResponse.statusCode, isBase64Encoded: wsResponse.isBase64Encoded, }; if (wsResponse.body) { try { const parsedBody = JSON.parse(wsResponse.body); info.body = sanitizeObject(parsedBody, { excludeFields: excludeResponseFields, maxDepth, }); } catch { info.bodyLength = wsResponse.body.length; info.body = '[Non-JSON response]'; } } if (wsResponse.headers && Object.keys(wsResponse.headers).length > 0) { info.headers = sanitizeObject(wsResponse.headers, { excludeFields: excludeResponseFields, maxDepth: 2, }); } return info; } return { responseType: typeof response, responseData: sanitizeObject(response, { excludeFields: excludeResponseFields, maxDepth, }), }; } function extractDetailedEventInfo(input, config) { const { event } = input; const { logMessageBody = false, excludeEventFields = [], maxDepth = 3, } = config; const basicInfo = extractEventInfo(event); if (logMessageBody && event.requestContext.eventType === 'MESSAGE' && event.body) { try { const parsedBody = JSON.parse(event.body); return { ...basicInfo, body: sanitizeObject(parsedBody, { excludeFields: excludeEventFields, maxDepth, }), }; } catch { return { ...basicInfo, body: '[Invalid JSON]', }; } } return basicInfo; } export function createWebSocketRequestLogger(config = {}) { const { logEvent = process.env.NODE_ENV === 'development', logResponse = process.env.NODE_ENV === 'development', logTiming = true, defaultContext = {}, logLevel = 'info', forceStructuredLogging = true, } = config; return async (input, next) => { const startTime = Date.now(); const { context } = input; setupStructuredLogging(input, forceStructuredLogging, defaultContext); try { if (logEvent) { const eventInfo = extractDetailedEventInfo(input, config); logger[logLevel]('WebSocket request received', { ...eventInfo, requestId: context.awsRequestId, functionName: context.functionName, functionVersion: context.functionVersion, }); } const result = await next(input); if (logResponse && result !== undefined) { const responseInfo = extractResponseInfo(result, config); const duration = Date.now() - startTime; logger[logLevel]('WebSocket response sent', { ...responseInfo, duration: `${duration}ms`, requestId: context.awsRequestId, }); } if (logTiming) { const duration = Date.now() - startTime; logger.debug('WebSocket request completed', { duration: `${duration}ms`, requestId: context.awsRequestId, }); } return result; } finally { logger.clearContext(); } }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ViU29ja2V0UmVxdWVzdExvZ2dlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL21pZGRsZXdhcmUvd2Vic29ja2V0L1dlYlNvY2tldFJlcXVlc3RMb2dnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFRdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRW5FLFNBQVMsbUJBQW1CLENBQzFCLFFBQWlCLEVBQ2pCLE1BQW9DO0lBRXBDLE1BQU0sRUFBRSxxQkFBcUIsR0FBRyxFQUFFLEVBQUUsUUFBUSxHQUFHLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUU1RCxJQUNFLFFBQVE7UUFDUixPQUFPLFFBQVEsS0FBSyxRQUFRO1FBQzVCLFlBQVksSUFBSSxRQUFRO1FBQ3hCLE1BQU0sSUFBSSxRQUFRLEVBQ2xCLENBQUM7UUFDRCxNQUFNLFVBQVUsR0FBRyxRQUE2QixDQUFDO1FBQ2pELE1BQU0sSUFBSSxHQUE0QjtZQUNwQyxVQUFVLEVBQUUsVUFBVSxDQUFDLFVBQVU7WUFDakMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxlQUFlO1NBQzVDLENBQUM7UUFFRixJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFDLFVBQVUsRUFBRTtvQkFDckMsYUFBYSxFQUFFLHFCQUFxQjtvQkFDcEMsUUFBUTtpQkFDVCxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFB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QkFDbEMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxlQUFlO2lCQUN6QyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFakMsSUFBSSxXQUFXLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN4QyxNQUFNLFlBQVksR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3pELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUM7Z0JBRXhDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyx5QkFBeUIsRUFBRTtvQkFDMUMsR0FBRyxZQUFZO29CQUNmLFFBQVEsRUFBRSxHQUFHLFFBQVEsSUFBSTtvQkFDekIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxZQUFZO2lCQUNoQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDO2dCQUN4QyxNQUFNLENBQUMsS0FBSyxDQUFDLDZCQUE2QixFQUFFO29CQUMxQyxRQUFRLEVBQUUsR0FBRyxRQUFRLElBQUk7b0JBQ3pCLFNBQVMsRUFBRSxPQUFPLENBQUMsWUFBWTtpQkFDaEMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUVELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7Z0JBQVMsQ0FBQztZQUNULE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN4QixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL2xvZyc7XG5pbXBvcnQgeyBzYW5pdGl6ZU9iamVjdCB9IGZyb20gJy4uL3V0aWxzL3Nhbml0aXphdGlvbic7XG5pbXBvcnQgdHlwZSB7IE1pZGRsZXdhcmUgfSBmcm9tICcuLi9taWRkbGV3YXJlQ2hhaW4nO1xuaW1wb3J0IHR5cGUge1xuICBXZWJTb2NrZXRSZXNwb25zZSxcbiAgV2ViU29ja2V0SW5wdXRXaXRoTW9kZWxzLFxuICBXZWJTb2NrZXRSZXF1ZXN0TG9nZ2VyQ29uZmlnLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQW1wbGlmeU1vZGVsVHlwZSB9IGZyb20gJy4uLy4uL3F1ZXJpZXMvdHlwZXMnO1xuaW1wb3J0IHsgZXh0cmFjdEV2ZW50SW5mbywgc2V0dXBTdHJ1Y3R1cmVkTG9nZ2luZyB9IGZyb20gJy4vdXRpbHMnO1xuXG5mdW5jdGlvbiBleHRyYWN0UmVzcG9uc2VJbmZvKFxuICByZXNwb25zZTogdW5rbm93bixcbiAgY29uZmlnOiBXZWJTb2NrZXRSZXF1ZXN0TG9nZ2VyQ29uZmlnLFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCB7IGV4Y2x1ZGVSZXNwb25zZUZpZWxkcyA9IFtdLCBtYXhEZXB0aCA9IDMgfSA9IGNvbmZpZztcblxuICBpZiAoXG4gICAgcmVzcG9uc2UgJiZcbiAgICB0eXBlb2YgcmVzcG9uc2UgPT09ICdvYmplY3QnICYmXG4gICAgJ3N0YXR1c0NvZGUnIGluIHJlc3BvbnNlICYmXG4gICAgJ2JvZHknIGluIHJlc3BvbnNlXG4gICkge1xuICAgIGNvbnN0IHdzUmVzcG9uc2UgPSByZXNwb25zZSBhcyBXZWJTb2NrZXRSZXNwb25zZTtcbiAgICBjb25zdCBpbmZvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgIHN0YXR1c0NvZGU6IHdzUmVzcG9uc2Uuc3RhdHVzQ29kZSxcbiAgICAgIGlzQmFzZTY0RW5jb2RlZDogd3NSZXNwb25zZS5pc0Jhc2U2NEVuY29kZWQsXG4gICAgfTtcblxuICAgIGlmICh3c1Jlc3BvbnNlLmJvZHkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZEJvZHkgPSBKU09OLnBhcnNlKHdzUmVzcG9uc2UuYm9keSk7XG4gICAgICAgIGluZm8uYm9keSA9IHNhbml0aXplT2JqZWN0KHBhcnNlZEJvZHksIHtcbiAgICAgICAgICBleGNsdWRlRmllbGRzOiBleGNsdWRlUmVzcG9uc2VGaWVsZHMsXG4gICAgICAgICAgbWF4RGVwdGgsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGluZm8uYm9keUxlbmd0aCA9IHdzUmVzcG9uc2UuYm9keS5sZW5ndGg7XG4gICAgICAgIGluZm8uYm9keSA9ICdbTm9uLUpTT04gcmVzcG9uc2VdJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod3NSZXNwb25zZS5oZWFkZXJzICYmIE9iamVjdC5rZXlzKHdzUmVzcG9uc2UuaGVhZGVycykubGVuZ3RoID4gMCkge1xuICAgICAgaW5mby5oZWFkZXJzID0gc2FuaXRpemVPYmplY3Qod3NSZXNwb25zZS5oZWFkZXJzLCB7XG4gICAgICAgIGV4Y2x1ZGVGaWVsZHM6IGV4Y2x1ZGVSZXNwb25zZUZpZWxkcyxcbiAgICAgICAgbWF4RGVwdGg6IDIsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5mbztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVzcG9uc2VUeXBlOiB0eXBlb2YgcmVzcG9uc2UsXG4gICAgcmVzcG9uc2VEYXRhOiBzYW5pdGl6ZU9iamVjdChyZXNwb25zZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwge1xuICAgICAgZXhjbHVkZUZpZWxkczogZXhjbHVkZVJlc3BvbnNlRmllbGRzLFxuICAgICAgbWF4RGVwdGgsXG4gICAgfSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3REZXRhaWxlZEV2ZW50SW5mbzxcbiAgVFR5cGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgQW1wbGlmeU1vZGVsVHlwZT4gPSBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIEFtcGxpZnlNb2RlbFR5cGVcbiAgPixcbj4oXG4gIGlucHV0OiBXZWJTb2NrZXRJbnB1dFdpdGhNb2RlbHM8VFR5cGVzPixcbiAgY29uZmlnOiBXZWJTb2NrZXRSZXF1ZXN0TG9nZ2VyQ29uZmlnLFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCB7IGV2ZW50IH0gPSBpbnB1dDtcbiAgY29uc3Qge1xuICAgIGxvZ01lc3NhZ2VCb2R5ID0gZmFsc2UsXG4gICAgZXhjbHVkZUV2ZW50RmllbGRzID0gW10sXG4gICAgbWF4RGVwdGggPSAzLFxuICB9ID0gY29uZmlnO1xuXG4gIGNvbnN0IGJhc2ljSW5mbyA9IGV4dHJhY3RFdmVudEluZm8oZXZlbnQpO1xuXG4gIGlmIChcbiAgICBsb2dNZXNzYWdlQm9keSAmJlxuICAgIGV2ZW50LnJlcXVlc3RDb250ZXh0LmV2ZW50VHlwZSA9PT0gJ01FU1NBR0UnICYmXG4gICAgZXZlbnQuYm9keVxuICApIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkQm9keSA9IEpTT04ucGFyc2UoZXZlbnQuYm9keSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNpY0luZm8sXG4gICAgICAgIGJvZHk6IHNhbml0aXplT2JqZWN0KHBhcnNlZEJvZHksIHtcbiAgICAgICAgICBleGNsdWRlRmllbGRzOiBleGNsdWRlRXZlbnRGaWVsZHMsXG4gICAgICAgICAgbWF4RGVwdGgsXG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmJhc2ljSW5mbyxcbiAgICAgICAgYm9keTogJ1tJbnZhbGlkIEpTT05dJyxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhc2ljSW5mbztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYlNvY2tldFJlcXVlc3RMb2dnZXI8XG4gIFRUeXBlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIEFtcGxpZnlNb2RlbFR5cGU+ID0gUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBBbXBsaWZ5TW9kZWxUeXBlXG4gID4sXG4gIFRPdXRwdXQgPSBXZWJTb2NrZXRSZXNwb25zZSxcbj4oXG4gIGNvbmZpZzogV2ViU29ja2V0UmVxdWVzdExvZ2dlckNvbmZpZyA9IHt9LFxuKTogTWlkZGxld2FyZTxXZWJTb2NrZXRJbnB1dFdpdGhNb2RlbHM8VFR5cGVzPiwgVE91dHB1dD4ge1xuICBjb25zdCB7XG4gICAgbG9nRXZlbnQgPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyxcbiAgICBsb2dSZXNwb25zZSA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnLFxuICAgIGxvZ1RpbWluZyA9IHRydWUsXG4gICAgZGVmYXVsdENvbnRleHQgPSB7fSxcbiAgICBsb2dMZXZlbCA9ICdpbmZvJyxcbiAgICBmb3JjZVN0cnVjdHVyZWRMb2dnaW5nID0gdHJ1ZSxcbiAgfSA9IGNvbmZpZztcblxuICByZXR1cm4gYXN5bmMgKFxuICAgIGlucHV0OiBXZWJTb2NrZXRJbnB1dFdpdGhNb2RlbHM8VFR5cGVzPixcbiAgICBuZXh0OiAoaW5wdXQ/OiBXZWJTb2NrZXRJbnB1dFdpdGhNb2RlbHM8VFR5cGVzPikgPT4gUHJvbWlzZTxUT3V0cHV0PixcbiAgKTogUHJvbWlzZTxUT3V0cHV0PiA9PiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB7IGNvbnRleHQgfSA9IGlucHV0O1xuXG4gICAgc2V0dXBTdHJ1Y3R1cmVkTG9nZ2luZyhpbnB1dCwgZm9yY2VTdHJ1Y3R1cmVkTG9nZ2luZywgZGVmYXVsdENvbnRleHQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChsb2dFdmVudCkge1xuICAgICAgICBjb25zdCBldmVudEluZm8gPSBleHRyYWN0RGV0YWlsZWRFdmVudEluZm8oaW5wdXQsIGNvbmZpZyk7XG4gICAgICAgIGxvZ2dlcltsb2dMZXZlbF0oJ1dlYlNvY2tldCByZXF1ZXN0IHJlY2VpdmVkJywge1xuICAgICAgICAgIC4uLmV2ZW50SW5mbyxcbiAgICAgICAgICByZXF1ZXN0SWQ6IGNvbnRleHQuYXdzUmVxdWVzdElkLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogY29udGV4dC5mdW5jdGlvbk5hbWUsXG4gICAgICAgICAgZnVuY3Rpb25WZXJzaW9uOiBjb250ZXh0LmZ1bmN0aW9uVmVyc2lvbixcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG5leHQoaW5wdXQpO1xuXG4gICAgICBpZiAobG9nUmVzcG9uc2UgJiYgcmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VJbmZvID0gZXh0cmFjdFJlc3BvbnNlSW5mbyhyZXN1bHQsIGNvbmZpZyk7XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcblxuICAgICAgICBsb2dnZXJbbG9nTGV2ZWxdKCdXZWJTb2NrZXQgcmVzcG9uc2Ugc2VudCcsIHtcbiAgICAgICAgICAuLi5yZXNwb25zZUluZm8sXG4gICAgICAgICAgZHVyYXRpb246IGAke2R1cmF0aW9ufW1zYCxcbiAgICAgICAgICByZXF1ZXN0SWQ6IGNvbnRleHQuYXdzUmVxdWVzdElkLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxvZ1RpbWluZykge1xuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnV2ViU29ja2V0IHJlcXVlc3QgY29tcGxldGVkJywge1xuICAgICAgICAgIGR1cmF0aW9uOiBgJHtkdXJhdGlvbn1tc2AsXG4gICAgICAgICAgcmVxdWVzdElkOiBjb250ZXh0LmF3c1JlcXVlc3RJZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGxvZ2dlci5jbGVhckNvbnRleHQoKTtcbiAgICB9XG4gIH07XG59XG4iXX0=