UNPKG

@aws-lambda-powertools/parser

Version:
90 lines (89 loc) 3.44 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CloudWatchEnvelope = void 0; const zod_1 = require("zod"); const errors_js_1 = require("../errors.js"); const index_js_1 = require("../schemas/index.js"); const envelope_js_1 = require("./envelope.js"); /** * CloudWatch Envelope to extract messages from the `awslogs.data.logEvents` key. */ exports.CloudWatchEnvelope = { /** * This is a discriminator to differentiate whether an envelope returns an array or an object * @hidden */ [envelope_js_1.envelopeDiscriminator]: 'array', parse(data, schema) { const parsedEnvelope = index_js_1.CloudWatchLogsSchema.parse(data); return parsedEnvelope.awslogs.data.logEvents.map((record, index) => { try { return schema.parse(record.message); } catch (error) { throw new errors_js_1.ParseError(`Failed to parse CloudWatch log event at index ${index}`, { cause: new zod_1.ZodError(error.issues.map((issue) => ({ ...issue, path: [ 'awslogs', 'data', 'logEvents', index, 'message', ...issue.path, ], }))), }); } }); }, safeParse(data, schema) { const parsedEnvelope = index_js_1.CloudWatchLogsSchema.safeParse(data); if (!parsedEnvelope.success) { return { success: false, error: new errors_js_1.ParseError('Failed to parse CloudWatch Log envelope', { cause: parsedEnvelope.error, }), originalEvent: data, }; } const result = parsedEnvelope.data.awslogs.data.logEvents.reduce((acc, record, index) => { const result = schema.safeParse(record.message); if (!result.success) { const issues = result.error.issues.map((issue) => ({ ...issue, path: [ 'awslogs', 'data', 'logEvents', index, 'message', ...issue.path, ], })); acc.success = false; acc.errors[index] = { issues }; return acc; } acc.messages.push(result.data); return acc; }, { success: true, messages: [], errors: {}, }); if (result.success) { return { success: true, data: result.messages }; } const errorMessage = Object.keys(result.errors).length > 1 ? `Failed to parse CloudWatch Log messages at indexes ${Object.keys(result.errors).join(', ')}` : `Failed to parse CloudWatch Log message at index ${Object.keys(result.errors)[0]}`; const errorCause = new zod_1.ZodError(Object.values(result.errors).flatMap((error) => error.issues)); return { success: false, error: new errors_js_1.ParseError(errorMessage, { cause: errorCause }), originalEvent: data, }; }, };