@aws-lambda-powertools/parser
Version:
The parser package for the Powertools for AWS Lambda (TypeScript) library.
117 lines (116 loc) • 4.43 kB
JavaScript
"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;