UNPKG

@aws-lambda-powertools/parser

Version:
117 lines (116 loc) 4.43 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.KinesisDynamoDBStreamSchema = exports.KinesisDataStreamSchema = exports.KinesisDataStreamRecordPayload = exports.KinesisDataStreamRecord = void 0; const node_zlib_1 = require("node:zlib"); const base64_1 = require("@aws-lambda-powertools/commons/utils/base64"); const zod_1 = require("zod"); const dynamodb_js_1 = require("./dynamodb.js"); const decoder = new TextDecoder(); const KinesisDataStreamRecordPayload = zod_1.z.object({ kinesisSchemaVersion: zod_1.z.string(), partitionKey: zod_1.z.string(), sequenceNumber: zod_1.z.string(), approximateArrivalTimestamp: zod_1.z.number(), data: zod_1.z.string().transform((data) => { const decompressed = decompress(data); const decoded = decoder.decode((0, base64_1.fromBase64)(data, 'base64')); try { // If data was not compressed, try to parse it as JSON otherwise it must be string return decompressed === data ? JSON.parse(decoded) : decompressed; } catch { return decoded; } }), }); exports.KinesisDataStreamRecordPayload = KinesisDataStreamRecordPayload; const decompress = (data) => { try { return JSON.parse((0, node_zlib_1.gunzipSync)((0, base64_1.fromBase64)(data, 'base64')).toString('utf8')); } catch { return data; } }; const KinesisDataStreamRecord = zod_1.z.object({ eventSource: zod_1.z.literal('aws:kinesis'), eventVersion: zod_1.z.string(), eventID: zod_1.z.string(), eventName: zod_1.z.literal('aws:kinesis:record'), awsRegion: zod_1.z.string(), invokeIdentityArn: zod_1.z.string(), eventSourceARN: zod_1.z.string(), kinesis: KinesisDataStreamRecordPayload, }); exports.KinesisDataStreamRecord = KinesisDataStreamRecord; const KinesisDynamoDBStreamSchema = zod_1.z.object({ Records: zod_1.z.array(KinesisDataStreamRecord.extend({ kinesis: KinesisDataStreamRecordPayload.extend({ data: zod_1.z .string() .transform((data) => { const decoded = decoder.decode((0, base64_1.fromBase64)(data, 'base64')); return JSON.parse(decoded); }) .pipe(dynamodb_js_1.DynamoDBStreamToKinesisRecord), }), })), }); exports.KinesisDynamoDBStreamSchema = KinesisDynamoDBStreamSchema; /** * Zod schema for Kinesis Data Stream event * * @example * ```json * { * "Records": [ * { * "kinesis": { * "kinesisSchemaVersion": "1.0", * "partitionKey": "1", * "sequenceNumber": "49590338271490256608559692538361571095921575989136588898", * "data": "SGVsbG8sIHRoaXMgaXMgYSB0ZXN0Lg==", * "approximateArrivalTimestamp": 1607497475.000 * }, * "eventSource": "aws:kinesis", * "eventVersion": "1.0", * "eventID": "shardId-000000000006:49590338271490256608559692538361571095921575989136588898", * "eventName": "aws:kinesis:record", * "invokeIdentityArn": "arn:aws:iam::123456789012:role/lambda-kinesis-role", * "awsRegion": "us-east-1", * "eventSourceARN": "arn:aws:kinesis:us-east-1:123456789012:stream/lambda-stream" * } * ], * "window": { * "start": "2020-12-09T07:04:00Z", * "end": "2020-12-09T07:06:00Z" * }, * "state": { * "1": 282, * "2": 715 * }, * "shardId": "shardId-000000000006", * "eventSourceARN": "arn:aws:kinesis:us-east-1:123456789012:stream/lambda-stream", * "isFinalInvokeForWindow": false, * "isWindowTerminatedEarly": false * } *``` * @see {@link KinesisDataStreamEvent | `KinesisDataStreamEvent`} * @see {@link https://docs.aws.amazon.com/lambda/latest/dg/services-kinesis-windows.html#streams-tumbling-processing} * */ const KinesisDataStreamSchema = zod_1.z.object({ Records: zod_1.z.array(KinesisDataStreamRecord).min(1), window: zod_1.z .object({ start: zod_1.z.iso.datetime(), end: zod_1.z.iso.datetime(), }) .optional(), state: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()).optional(), shardId: zod_1.z.string().optional(), eventSourceARN: zod_1.z.string().optional(), isFinalInvokeForWindow: zod_1.z.boolean().optional(), isWindowTerminatedEarly: zod_1.z.boolean().optional(), }); exports.KinesisDataStreamSchema = KinesisDataStreamSchema;