From 145d913dbd190528046a87c03f41b6528b594fef Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Tue, 21 Jan 2025 16:03:22 +0100 Subject: [PATCH 1/2] fix(parser): CloudWatch Log Envelope handles non-JSON --- packages/parser/src/envelopes/cloudwatch.ts | 115 ++++-- packages/parser/src/errors.ts | 12 +- packages/parser/src/schemas/cloudwatch.ts | 11 +- .../parser/tests/events/activeMQEvent.json | 54 --- .../awsConfigRuleConfigurationChanged.json | 13 - .../awsConfigRuleOversizedConfiguration.json | 12 - .../tests/events/awsConfigRuleScheduled.json | 13 - .../tests/events/bedrockAgentEvent.json | 16 - .../tests/events/bedrockAgentPostEvent.json | 35 -- .../events/cloudWatchDashboardEvent.json | 38 -- .../tests/events/cloudWatchLogEvent.json | 5 - .../parser/tests/events/cloudwatch/base.json | 5 + .../tests/events/codePipelineEvent.json | 34 -- .../tests/events/codePipelineEventData.json | 46 --- .../codePipelineEventEmptyUserParameters.json | 32 -- .../codePipelineEventWithEncryptionKey.json | 38 -- .../cognitoCreateAuthChallengeEvent.json | 29 -- .../events/cognitoCustomMessageEvent.json | 20 -- .../cognitoDefineAuthChallengeEvent.json | 32 -- .../cognitoPostAuthenticationEvent.json | 18 - .../events/cognitoPostConfirmationEvent.json | 18 - .../events/cognitoPreAuthenticationEvent.json | 20 -- .../tests/events/cognitoPreSignUpEvent.json | 18 - .../cognitoPreTokenGenerationEvent.json | 25 -- .../events/cognitoUserMigrationEvent.json | 15 - ...gnitoVerifyAuthChallengeResponseEvent.json | 28 -- .../events/connectContactFlowEventAll.json | 41 --- .../events/connectContactFlowEventMin.json | 27 -- .../parser/tests/events/rabbitMQEvent.json | 37 -- .../tests/events/secretsManagerEvent.json | 5 - .../tests/unit/envelopes/cloudwatch.test.ts | 327 +++++++++++++----- .../tests/unit/schema/cloudwatch.test.ts | 80 ++++- packages/parser/tests/unit/schema/utils.ts | 26 -- 33 files changed, 407 insertions(+), 838 deletions(-) delete mode 100644 packages/parser/tests/events/activeMQEvent.json delete mode 100644 packages/parser/tests/events/awsConfigRuleConfigurationChanged.json delete mode 100644 packages/parser/tests/events/awsConfigRuleOversizedConfiguration.json delete mode 100644 packages/parser/tests/events/awsConfigRuleScheduled.json delete mode 100644 packages/parser/tests/events/bedrockAgentEvent.json delete mode 100644 packages/parser/tests/events/bedrockAgentPostEvent.json delete mode 100644 packages/parser/tests/events/cloudWatchDashboardEvent.json delete mode 100644 packages/parser/tests/events/cloudWatchLogEvent.json create mode 100644 packages/parser/tests/events/cloudwatch/base.json delete mode 100644 packages/parser/tests/events/codePipelineEvent.json delete mode 100644 packages/parser/tests/events/codePipelineEventData.json delete mode 100644 packages/parser/tests/events/codePipelineEventEmptyUserParameters.json delete mode 100644 packages/parser/tests/events/codePipelineEventWithEncryptionKey.json delete mode 100644 packages/parser/tests/events/cognitoCreateAuthChallengeEvent.json delete mode 100644 packages/parser/tests/events/cognitoCustomMessageEvent.json delete mode 100644 packages/parser/tests/events/cognitoDefineAuthChallengeEvent.json delete mode 100644 packages/parser/tests/events/cognitoPostAuthenticationEvent.json delete mode 100644 packages/parser/tests/events/cognitoPostConfirmationEvent.json delete mode 100644 packages/parser/tests/events/cognitoPreAuthenticationEvent.json delete mode 100644 packages/parser/tests/events/cognitoPreSignUpEvent.json delete mode 100644 packages/parser/tests/events/cognitoPreTokenGenerationEvent.json delete mode 100644 packages/parser/tests/events/cognitoUserMigrationEvent.json delete mode 100644 packages/parser/tests/events/cognitoVerifyAuthChallengeResponseEvent.json delete mode 100644 packages/parser/tests/events/connectContactFlowEventAll.json delete mode 100644 packages/parser/tests/events/connectContactFlowEventMin.json delete mode 100644 packages/parser/tests/events/rabbitMQEvent.json delete mode 100644 packages/parser/tests/events/secretsManagerEvent.json diff --git a/packages/parser/src/envelopes/cloudwatch.ts b/packages/parser/src/envelopes/cloudwatch.ts index 4bdde3c9a4..36a57ffaf3 100644 --- a/packages/parser/src/envelopes/cloudwatch.ts +++ b/packages/parser/src/envelopes/cloudwatch.ts @@ -1,17 +1,11 @@ -import type { ZodSchema, z } from 'zod'; +import { ZodError, type ZodIssue, type ZodSchema, type z } from 'zod'; import { ParseError } from '../errors.js'; import { CloudWatchLogsSchema } from '../schemas/index.js'; import type { ParsedResult } from '../types/index.js'; -import { Envelope, envelopeDiscriminator } from './envelope.js'; +import { envelopeDiscriminator } from './envelope.js'; /** - * CloudWatch Envelope to extract a List of log records. - * - * The record's body parameter is a string (after being base64 decoded and gzipped), - * though it can also be a JSON encoded string. - * Regardless of its type it'll be parsed into a BaseModel object. - * - * Note: The record will be parsed the same way so if model is str + * CloudWatch Envelope to extract messages from the `awslogs.data.logEvents` key. */ export const CloudWatchEnvelope = { /** @@ -22,8 +16,29 @@ export const CloudWatchEnvelope = { parse(data: unknown, schema: T): z.infer[] { const parsedEnvelope = CloudWatchLogsSchema.parse(data); - return parsedEnvelope.awslogs.data.logEvents.map((record) => { - return Envelope.parse(record.message, schema); + return parsedEnvelope.awslogs.data.logEvents.map((record, index) => { + try { + return schema.parse(record.message); + } catch (error) { + throw new ParseError( + `Failed to parse CloudWatch log event at index ${index}`, + { + cause: new ZodError( + (error as ZodError).issues.map((issue) => ({ + ...issue, + path: [ + 'awslogs', + 'data', + 'logEvents', + index, + 'message', + ...issue.path, + ], + })) + ), + } + ); + } }); }, @@ -31,36 +46,82 @@ export const CloudWatchEnvelope = { data: unknown, schema: T ): ParsedResult[]> { - const parsedEnvelope = CloudWatchLogsSchema.safeParse(data); + let parsedEnvelope: ParsedResult>; + try { + parsedEnvelope = CloudWatchLogsSchema.safeParse(data); + } catch (error) { + parsedEnvelope = { + success: false, + error: error as Error, + }; + } if (!parsedEnvelope.success) { return { success: false, - error: new ParseError('Failed to parse CloudWatch envelope', { + error: new ParseError('Failed to parse CloudWatch Log envelope', { cause: parsedEnvelope.error, }), originalEvent: data, }; } - const parsedLogEvents: z.infer[] = []; - for (const record of parsedEnvelope.data.awslogs.data.logEvents) { - const parsedMessage = Envelope.safeParse(record.message, schema); - if (!parsedMessage.success) { - return { - success: false, - error: new ParseError('Failed to parse CloudWatch log event', { - cause: parsedMessage.error, - }), - originalEvent: data, - }; + const result = parsedEnvelope.data.awslogs.data.logEvents.reduce( + ( + acc: { + success: boolean; + messages: z.infer; + errors: { [key: number]: { issues: ZodIssue[] } }; + }, + record: { message: string }, + index: number + ) => { + 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: {}, } - parsedLogEvents.push(parsedMessage.data); + ); + + 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 ZodError( + // @ts-expect-error - issues are assigned because success is false + Object.values(result.errors).flatMap((error) => error.issues) + ); + return { - success: true, - data: parsedLogEvents, + success: false, + error: new ParseError(errorMessage, { cause: errorCause }), + originalEvent: data, }; }, }; diff --git a/packages/parser/src/errors.ts b/packages/parser/src/errors.ts index c3068a731d..d4aac4d7ad 100644 --- a/packages/parser/src/errors.ts +++ b/packages/parser/src/errors.ts @@ -12,4 +12,14 @@ class ParseError extends Error { } } -export { ParseError }; +/** + * Custom error thrown when decompression fails. + */ +class DecompressError extends ParseError { + constructor(message: string, options?: { cause?: Error }) { + super(message, options); + this.name = 'DecompressError'; + } +} + +export { ParseError, DecompressError }; diff --git a/packages/parser/src/schemas/cloudwatch.ts b/packages/parser/src/schemas/cloudwatch.ts index d6bfd77078..68edce1ef7 100644 --- a/packages/parser/src/schemas/cloudwatch.ts +++ b/packages/parser/src/schemas/cloudwatch.ts @@ -1,5 +1,6 @@ import { gunzipSync } from 'node:zlib'; import { z } from 'zod'; +import { DecompressError } from '../errors.js'; const CloudWatchLogEventSchema = z.object({ id: z.string(), @@ -19,9 +20,15 @@ const CloudWatchLogsDecodeSchema = z.object({ const decompressRecordToJSON = ( data: string ): z.infer => { - const uncompressed = gunzipSync(Buffer.from(data, 'base64')).toString('utf8'); + try { + const uncompressed = gunzipSync(Buffer.from(data, 'base64')).toString( + 'utf8' + ); - return CloudWatchLogsDecodeSchema.parse(JSON.parse(uncompressed)); + return CloudWatchLogsDecodeSchema.parse(JSON.parse(uncompressed)); + } catch (error) { + throw new DecompressError('Failed to decompress CloudWatch log data'); + } }; /** diff --git a/packages/parser/tests/events/activeMQEvent.json b/packages/parser/tests/events/activeMQEvent.json deleted file mode 100644 index 555ed78e1f..0000000000 --- a/packages/parser/tests/events/activeMQEvent.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "eventSource": "aws:amq", - "eventSourceArn": "arn:aws:mq:us-west-2:112556298976:broker:test:b-9bcfa592-423a-4942-879d-eb284b418fc8", - "messages": [ - { - "messageID": "ID:b-9bcfa592-423a-4942-879d-eb284b418fc8-1.mq.us-west-2.amazonaws.com-37557-1234520418293-4:1:1:1:1", - "messageType": "jms/text-message", - "data": "QUJDOkFBQUE=", - "connectionId": "myJMSCoID", - "redelivered": false, - "destination": { - "physicalname": "testQueue" - }, - "timestamp": 1598827811958, - "brokerInTime": 1598827811958, - "brokerOutTime": 1598827811959, - "properties": { - "testKey": "testValue" - } - }, - { - "messageID": "ID:b-9bcfa592-423a-4942-879d-eb284b418fc8-1.mq.us-west-2.amazonaws.com-37557-1234520418293-4:1:1:1:1", - "messageType": "jms/text-message", - "data": "eyJ0aW1lb3V0IjowLCJkYXRhIjoiQ1pybWYwR3c4T3Y0YnFMUXhENEUifQ==", - "connectionId": "myJMSCoID2", - "redelivered": false, - "destination": { - "physicalname": "testQueue" - }, - "timestamp": 1598827811958, - "brokerInTime": 1598827811958, - "brokerOutTime": 1598827811959, - "properties": { - "testKey": "testValue" - } - }, - { - "messageID": "ID:b-9bcfa592-423a-4942-879d-eb284b418fc8-1.mq.us-west-2.amazonaws.com-37557-1234520418293-4:1:1:1:1", - "messageType": "jms/bytes-message", - "data": "3DTOOW7crj51prgVLQaGQ82S48k=", - "connectionId": "myJMSCoID1", - "persistent": false, - "destination": { - "physicalname": "testQueue" - }, - "timestamp": 1598827811958, - "brokerInTime": 1598827811958, - "brokerOutTime": 1598827811959, - "properties": { - "testKey": "testValue" - } - } - ] -} diff --git a/packages/parser/tests/events/awsConfigRuleConfigurationChanged.json b/packages/parser/tests/events/awsConfigRuleConfigurationChanged.json deleted file mode 100644 index e0f8929ddd..0000000000 --- a/packages/parser/tests/events/awsConfigRuleConfigurationChanged.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "version": "1.0", - "invokingEvent": "{\"configurationItemDiff\":{\"changedProperties\":{\"Configuration.InstanceType\":{\"previousValue\":\"t2.micro\",\"updatedValue\":\"t2.medium\",\"changeType\":\"UPDATE\"},\"Configuration.State.Name\":{\"previousValue\":\"running\",\"updatedValue\":\"stopped\",\"changeType\":\"UPDATE\"},\"Configuration.StateTransitionReason\":{\"previousValue\":\"\",\"updatedValue\":\"User initiated (2023-04-27 15:01:07 GMT)\",\"changeType\":\"UPDATE\"},\"Configuration.StateReason\":{\"previousValue\":null,\"updatedValue\":{\"code\":\"Client.UserInitiatedShutdown\",\"message\":\"Client.UserInitiatedShutdown: User initiated shutdown\"},\"changeType\":\"CREATE\"},\"Configuration.CpuOptions.CoreCount\":{\"previousValue\":1,\"updatedValue\":2,\"changeType\":\"UPDATE\"}},\"changeType\":\"UPDATE\"},\"configurationItem\":{\"relatedEvents\":[],\"relationships\":[{\"resourceId\":\"eipalloc-0ebb4367662263cc1\",\"resourceName\":null,\"resourceType\":\"AWS::EC2::EIP\",\"name\":\"Is attached to ElasticIp\"},{\"resourceId\":\"eni-034dd31c4b17ada8c\",\"resourceName\":null,\"resourceType\":\"AWS::EC2::NetworkInterface\",\"name\":\"Contains NetworkInterface\"},{\"resourceId\":\"eni-09a604c0ec356b06f\",\"resourceName\":null,\"resourceType\":\"AWS::EC2::NetworkInterface\",\"name\":\"Contains NetworkInterface\"},{\"resourceId\":\"sg-0fb295a327d9b4835\",\"resourceName\":null,\"resourceType\":\"AWS::EC2::SecurityGroup\",\"name\":\"Is associated with SecurityGroup\"},{\"resourceId\":\"subnet-cad1f2f4\",\"resourceName\":null,\"resourceType\":\"AWS::EC2::Subnet\",\"name\":\"Is contained in Subnet\"},{\"resourceId\":\"vol-0a288b5eb9fea4b30\",\"resourceName\":null,\"resourceType\":\"AWS::EC2::Volume\",\"name\":\"Is attached to Volume\"},{\"resourceId\":\"vpc-2d96be57\",\"resourceName\":null,\"resourceType\":\"AWS::EC2::VPC\",\"name\":\"Is contained in Vpc\"}],\"configuration\":{\"amiLaunchIndex\":0,\"imageId\":\"ami-09d95fab7fff3776c\",\"instanceId\":\"i-042dd005362091826\",\"instanceType\":\"t2.medium\",\"kernelId\":null,\"keyName\":\"mihaec2\",\"launchTime\":\"2023-04-27T14:57:16.000Z\",\"monitoring\":{\"state\":\"disabled\"},\"placement\":{\"availabilityZone\":\"us-east-1e\",\"affinity\":null,\"groupName\":\"\",\"partitionNumber\":null,\"hostId\":null,\"tenancy\":\"default\",\"spreadDomain\":null,\"hostResourceGroupArn\":null},\"platform\":null,\"privateDnsName\":\"ip-172-31-78-41.ec2.internal\",\"privateIpAddress\":\"172.31.78.41\",\"productCodes\":[],\"publicDnsName\":\"ec2-3-232-229-57.compute-1.amazonaws.com\",\"publicIpAddress\":\"3.232.229.57\",\"ramdiskId\":null,\"state\":{\"code\":80,\"name\":\"stopped\"},\"stateTransitionReason\":\"User initiated (2023-04-27 15:01:07 GMT)\",\"subnetId\":\"subnet-cad1f2f4\",\"vpcId\":\"vpc-2d96be57\",\"architecture\":\"x86_64\",\"blockDeviceMappings\":[{\"deviceName\":\"/dev/xvda\",\"ebs\":{\"attachTime\":\"2020-05-30T15:21:58.000Z\",\"deleteOnTermination\":true,\"status\":\"attached\",\"volumeId\":\"vol-0a288b5eb9fea4b30\"}}],\"clientToken\":\"\",\"ebsOptimized\":false,\"enaSupport\":true,\"hypervisor\":\"xen\",\"iamInstanceProfile\":{\"arn\":\"arn:aws:iam::0123456789012:instance-profile/AmazonSSMRoleForInstancesQuickSetup\",\"id\":\"AIPAS5S4WFUBL72S3QXW5\"},\"instanceLifecycle\":null,\"elasticGpuAssociations\":[],\"elasticInferenceAcceleratorAssociations\":[],\"networkInterfaces\":[{\"association\":{\"carrierIp\":null,\"ipOwnerId\":\"0123456789012\",\"publicDnsName\":\"ec2-3-232-229-57.compute-1.amazonaws.com\",\"publicIp\":\"3.232.229.57\"},\"attachment\":{\"attachTime\":\"2020-05-30T15:21:57.000Z\",\"attachmentId\":\"eni-attach-0a7e75dc9c1c291a0\",\"deleteOnTermination\":true,\"deviceIndex\":0,\"status\":\"attached\",\"networkCardIndex\":0},\"description\":\"\",\"groups\":[{\"groupName\":\"minhaec2\",\"groupId\":\"sg-0fb295a327d9b4835\"}],\"ipv6Addresses\":[],\"macAddress\":\"06:cf:00:c2:17:db\",\"networkInterfaceId\":\"eni-034dd31c4b17ada8c\",\"ownerId\":\"0123456789012\",\"privateDnsName\":\"ip-172-31-78-41.ec2.internal\",\"privateIpAddress\":\"172.31.78.41\",\"privateIpAddresses\":[{\"association\":{\"carrierIp\":null,\"ipOwnerId\":\"0123456789012\",\"publicDnsName\":\"ec2-3-232-229-57.compute-1.amazonaws.com\",\"publicIp\":\"3.232.229.57\"},\"primary\":true,\"privateDnsName\":\"ip-172-31-78-41.ec2.internal\",\"privateIpAddress\":\"172.31.78.41\"}],\"sourceDestCheck\":true,\"status\":\"in-use\",\"subnetId\":\"subnet-cad1f2f4\",\"vpcId\":\"vpc-2d96be57\",\"interfaceType\":\"interface\"},{\"association\":null,\"attachment\":{\"attachTime\":\"2020-11-26T23:46:04.000Z\",\"attachmentId\":\"eni-attach-0e6d150ebbd19966e\",\"deleteOnTermination\":false,\"deviceIndex\":1,\"status\":\"attached\",\"networkCardIndex\":0},\"description\":\"MINHAEC2AAAAAA\",\"groups\":[{\"groupName\":\"minhaec2\",\"groupId\":\"sg-0fb295a327d9b4835\"},{\"groupName\":\"default\",\"groupId\":\"sg-88105fa0\"}],\"ipv6Addresses\":[],\"macAddress\":\"06:0a:62:00:64:5f\",\"networkInterfaceId\":\"eni-09a604c0ec356b06f\",\"ownerId\":\"0123456789012\",\"privateDnsName\":\"ip-172-31-70-9.ec2.internal\",\"privateIpAddress\":\"172.31.70.9\",\"privateIpAddresses\":[{\"association\":null,\"primary\":true,\"privateDnsName\":\"ip-172-31-70-9.ec2.internal\",\"privateIpAddress\":\"172.31.70.9\"}],\"sourceDestCheck\":true,\"status\":\"in-use\",\"subnetId\":\"subnet-cad1f2f4\",\"vpcId\":\"vpc-2d96be57\",\"interfaceType\":\"interface\"}],\"outpostArn\":null,\"rootDeviceName\":\"/dev/xvda\",\"rootDeviceType\":\"ebs\",\"securityGroups\":[{\"groupName\":\"minhaec2\",\"groupId\":\"sg-0fb295a327d9b4835\"}],\"sourceDestCheck\":true,\"spotInstanceRequestId\":null,\"sriovNetSupport\":null,\"stateReason\":{\"code\":\"Client.UserInitiatedShutdown\",\"message\":\"Client.UserInitiatedShutdown: User initiated shutdown\"},\"tags\":[{\"key\":\"projeto\",\"value\":\"meetup\"},{\"key\":\"Name\",\"value\":\"Minha\"},{\"key\":\"CentroCusto\",\"value\":\"TI\"},{\"key\":\"Setor\",\"value\":\"Desenvolvimento\"}],\"virtualizationType\":\"hvm\",\"cpuOptions\":{\"coreCount\":2,\"threadsPerCore\":1},\"capacityReservationId\":null,\"capacityReservationSpecification\":{\"capacityReservationPreference\":\"open\",\"capacityReservationTarget\":null},\"hibernationOptions\":{\"configured\":false},\"licenses\":[],\"metadataOptions\":{\"state\":\"applied\",\"httpTokens\":\"optional\",\"httpPutResponseHopLimit\":1,\"httpEndpoint\":\"enabled\"},\"enclaveOptions\":{\"enabled\":false},\"bootMode\":null},\"supplementaryConfiguration\":{},\"tags\":{\"projeto\":\"meetup\",\"Setor\":\"Desenvolvimento\",\"CentroCusto\":\"TI\",\"Name\":\"Minha\"},\"configurationItemVersion\":\"1.3\",\"configurationItemCaptureTime\":\"2023-04-27T15:03:11.636Z\",\"configurationStateId\":1682607791636,\"awsAccountId\":\"0123456789012\",\"configurationItemStatus\":\"OK\",\"resourceType\":\"AWS::EC2::Instance\",\"resourceId\":\"i-042dd005362091826\",\"resourceName\":null,\"ARN\":\"arn:aws:ec2:us-east-1:0123456789012:instance/i-042dd005362091826\",\"awsRegion\":\"us-east-1\",\"availabilityZone\":\"us-east-1e\",\"configurationStateMd5Hash\":\"\",\"resourceCreationTime\":\"2023-04-27T14:57:16.000Z\"},\"notificationCreationTime\":\"2023-04-27T15:03:13.332Z\",\"messageType\":\"ConfigurationItemChangeNotification\",\"recordVersion\":\"1.3\"}", - "ruleParameters": "{\"desiredInstanceType\": \"t2.micro\"}", - "resultToken": "eyJlbmNyeXB0ZWREYXRhIjpbLTQxLDEsLTU3LC0zMCwtMTIxLDUzLDUyLDQ1LC01NywtOCw3MywtODEsLTExNiwtMTAyLC01MiwxMTIsLTQ3LDU4LDY1LC0xMjcsMTAyLDUsLTY5LDQ0LC0xNSwxMTQsNDEsLTksMTExLC0zMCw2NSwtNzUsLTM1LDU0LDEwNSwtODksODYsNDAsLTEwNSw5OCw2NSwtMTE5LC02OSwyNCw2NiwtMjAsODAsLTExMiwtNzgsLTgwLDQzLC01NywzMCwtMjUsODIsLTEwLDMsLTQsLTg1LC01MywtMzcsLTkwLC04OCwtOTgsLTk4LC00MSwxOSwxMTYsNjIsLTIzLC0xMjEsLTEwOCw1NywtNTgsLTUyLDI5LDEwMSwxMjIsLTU2LC03MSwtODEsLTQ3LDc3LC0yMiwtMTI0LC0zLC04NiwtMTIyLC00MCwtODksLTEwMSw1NywtMTI3LC0zNywtMzcsLTMxLC05OCwtMzEsMTEsLTEyNSwwLDEwOCwtMzIsNjQsNjIsLTIyLDAsNDcsLTEwNiwtMTAwLDEwNCwxNCw1OCwxMjIsLTEwLC01MCwtOTAsLTgwLC01MCwtNSw2NSwwLC0yNSw4NSw4Miw3LDkzLDEyMiwtODIsLTExNiwtNzksLTQ0LDcyLC03MywtNjksMTQsLTU2LDk0LDkwLDExNCwtMjksLTExOSwtNzEsODgsMTA3LDEwNywxMTAsLTcsMTI3LC0xMjUsLTU3LC0xMjYsLTEyMCw2OSwtMTI3LC03NiwtMTE5LDcxLDEsLTY4LDEwNywxMTMsLTU2LDg3LC0xMDIsLTE2LDEwOCwtMTA3LC00MywtOTQsLTEwNiwzLDkwLDE0LDcyLC0xMiwtMTE2LC03Myw4MCwtMTIyLDQ0LC0xMDQsMTIsNzQsNTcsLTEwLC0xMDUsLTExMiwtMzYsMjgsLTQ1LDk3LDExLC00OSwtMTEsNjEsMzYsLTE3LC03NCw1MCw0LC0yNiwxMDQsLTI4LC0xMjUsMjQsNzAsLTg1LC00Niw5MiwtMTAzLC00MSwtMTA2LDY5LDEyMiwyMSwtMjUsODAsOTksLTkzLC01NiwtMjUsLTQ3LC0xMjMsLTU5LC0xMjQsLTUyLC0xNiwxMjcsLTM4LC0xNiwxMDEsMTE5LDEwNywyNywxMCwtNDYsLTg3LC0xMiwtMzksMTQsNDUsMiw3MCwxMDcsMTA0LC00LC02OSwtMTIsNTksLTEyNiwtOTEsMTI3LDU0LDEwNiwtMTI2LC0xMTYsLTEwMiw3Miw4MSw1MCw3NSwtNTEsMTA4LDQxLC0zLC02LC00NSwxMDMsLTg2LDM3LC00NiwtMzIsLTExMSwxMjQsMTExLDg3LDU0LC03NiwxMjIsLTUsLTM2LC04OCw5LC0xMTMsMTE2LC01OSw4Myw3NywyOCwxMiwtNjUsLTExMywtNzksLTEyOCw4MiwtMTE4LC04MywtMTI0LDMxLDk5LC05MCwtOTksMTYsLTEyMywyMSwtMTE0LC05OCwtMTE2LC0xMTksMiwtNzMsNDYsODIsLTEzLDU0LDcxLC00MiwyNSw3NCw3MywtODYsOTQsNDYsOTksOTMsLTgyLDU1LDY1LC05OCw0OSwtNjAsMTEyLDEwMSwyMiw2OSwtMTYsNzcsLTk0LC01OSwtNDYsMTE1LDMwLC00Myw5Myw4OCwtMjgsMzgsNiw4NCwzMSwtMTAxLDMyLC0yMiwtNjMsLTk1LDExNCwtNzUsMTE0LDM2LC04NCw0MCwtNDQsLTEzLDU5LDcyLC0xLC0xMDMsMzEsMTA1LDY5LDY5LDc3LC02NCwtNTYsMTE4LDEzLC0xMTQsODAsOTksLTUzLDI1LDQyLDk0LDczLC04MCwyNSwzOCwyNCwtMTcsNjYsLTExOCwtMjMsMTE5LDkwLDEyMSwxMTgsLTUxLDUxLC0xMiwtNzYsLTUxLDksLTIxLDExNCwtMzcsLTY0LC0yLC0xMjYsLTk1LDYzLDczLC00MSwtMzQsLTkwLC0yMiw1OSwtNzksMzAsLTQsLTEsLTUsMTIsMzksLTk5LC0xMDUsLTEwNCwtNjEsNjUsLTc0LDE5LC0xMywtNjAsLTI4LC04LDQsLTgsMTIxLC0xMTgsMTIyLC02NSwtMjEsMjMsMTcsLTg0LDQwLC05MiwxNCwtMTI2LC02MCwtNzksLTUzLDM3LC04Myw2NSwxMDQsLTM2LC02MCwtMTEwLC0zMywtMTE3LDYsMTA3LDEsLTMsOTMsNzgsLTk1LC0xMjIsNTMsMTA4LC00OSwtNDksMjQsLTY1LDgzLDEyNSwtNzcsLTE5LC04MSwzNCwtNjcsLTQzLC03MCwtMjYsMTgsMTA0LDY1LDQsLTEyNiw0NCwtMTE5LDUyLC00NiwyMiw2NywxMTMsMTE4LC0zMywzNCwtOTYsMTIxLDE5LC0yLC0zNSwwLC04MiwxNyw2NiwtMjcsNjksLTM2LC0xNCw1NiwtOTcsLTE2LDEyMywyOCwtOTUsLTMyLC02MywtNjksNzAsNjQsLTMzLC0xMDAsNDMsLTExMywxMDUsMTAwLDEwOCwtNjAsNDAsLTIsLTk2LC0xMjQsMzcsLTQ1LC0xMjQsLTY4LC02OSwtMTIzLDE3LC02LDg2LC01OSwtOTQsMTEwLDczLDU3LC0xMTYsMTA3LC00MSwtOTQsLTExOCwtMTI2LDEwLC04MCwtNzAsMTAyLDg4LC0xMjYsODcsLTI3LC0xMDEsLTk0LC0zNSwtMTA2LC02LC03MiwtODYsNTAsMTE2LC0yOCw5MCwxMywtMTIwLDYsMjcsOTIsNTYsLTkwLDM5LDQ5LC0xMywtODYsLTI1LC04NiwxMTMsLTEzLDQxLC0xMTksOTQsLTk0LC0xMDMsLTgzLC02MCwxMjcsLTE1LC0zOSwxMTksLTk1LDI3LDQ0LDExNiwxMDksNywtMTAyLC0xNyw0OCwtODIsLTMxLC04LC02OSwzNSw5NCw1NCwtNTUsMSwtMTE5LDU3LC0xMDgsLTMsLTkxLC0xMjIsLTUzLC04OCw0LC05NywtMzUsMTI2LDExOSw1OSwtMSw4NSw3MywtNTgsLTEyMCwtNjQsMTE5LC0xMTIsOTIsMTksOSwtNjYsLTkyLDEwOCwtMTEsLTQyLDExMSwtMTA0LC0xMjAsMjcsLTEwMywtNjksMTksMTExLDEyLDIzLDEwNyw1NCw0MSwtMjYsNjAsLTMxLC01XSwibWF0ZXJpYWxTZXRTZXJpYWxOdW1iZXIiOjEsIml2UGFyYW1ldGVyU3BlYyI6eyJpdiI6Wy05NSwzMiwxMDgsOTEsMzUsLTgyLC0zNywyNCwtNDQsLTExNSwtODIsLTEyOCwtMTIyLDMsNTMsLTI0XX19", - "eventLeftScope": false, - "executionRoleArn": "arn:aws:iam::0123456789012:role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfig", - "configRuleArn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-i9y8j9", - "configRuleName": "MyRule", - "configRuleId": "config-rule-i9y8j9", - "accountId": "0123456789012", - "evaluationMode": "DETECTIVE" -} diff --git a/packages/parser/tests/events/awsConfigRuleOversizedConfiguration.json b/packages/parser/tests/events/awsConfigRuleOversizedConfiguration.json deleted file mode 100644 index c731919c6a..0000000000 --- a/packages/parser/tests/events/awsConfigRuleOversizedConfiguration.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "invokingEvent": "{\"configurationItemSummary\": {\"changeType\": \"UPDATE\",\"configurationItemVersion\": \"1.2\",\"configurationItemCaptureTime\":\"2016-10-06T16:46:16.261Z\",\"configurationStateId\": 0,\"awsAccountId\":\"123456789012\",\"configurationItemStatus\": \"OK\",\"resourceType\": \"AWS::EC2::Instance\",\"resourceId\":\"i-00000000\",\"resourceName\":null,\"ARN\":\"arn:aws:ec2:us-west-2:123456789012:instance/i-00000000\",\"awsRegion\": \"us-west-2\",\"availabilityZone\":\"us-west-2a\",\"configurationStateMd5Hash\":\"8f1ee69b287895a0f8bc5753eca68e96\",\"resourceCreationTime\":\"2016-10-06T16:46:10.489Z\"},\"messageType\":\"OversizedConfigurationItemChangeNotification\", \"notificationCreationTime\": \"2016-10-06T16:46:16.261Z\", \"recordVersion\": \"1.0\"}", - "ruleParameters": "{\"myParameterKey\":\"myParameterValue\"}", - "resultToken": "myResultToken", - "eventLeftScope": false, - "executionRoleArn": "arn:aws:iam::123456789012:role/config-role", - "configRuleArn": "arn:aws:config:us-east-2:123456789012:config-rule/config-rule-ec2-managed-instance-inventory", - "configRuleName": "change-triggered-config-rule", - "configRuleId": "config-rule-0123456", - "accountId": "123456789012", - "version": "1.0" -} diff --git a/packages/parser/tests/events/awsConfigRuleScheduled.json b/packages/parser/tests/events/awsConfigRuleScheduled.json deleted file mode 100644 index 491855621a..0000000000 --- a/packages/parser/tests/events/awsConfigRuleScheduled.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "version": "1.0", - "invokingEvent": "{\"awsAccountId\":\"0123456789012\",\"notificationCreationTime\":\"2023-04-27T13:26:17.741Z\",\"messageType\":\"ScheduledNotification\",\"recordVersion\":\"1.0\"}", - "ruleParameters": "{\"test\":\"x\"}", - "resultToken": "eyJlbmNyeXB0ZWREYXRhIjpbLTQyLDEyNiw1MiwtMzcsLTI5LDExNCwxMjYsLTk3LDcxLDIyLC0xMTAsMTEyLC0zMSwtOTMsLTQ5LC0xMDEsODIsMyw1NCw0OSwzLC02OSwtNzEsLTcyLDYyLDgxLC03MiwtODEsNTAsMzUsLTUwLC03NSwtMTE4LC0xMTgsNzcsMTIsLTEsMTQsMTIwLC03MCwxMTAsLTMsNTAsLTYwLDEwNSwtNTcsNDUsMTAyLC0xMDksLTYxLC0xMDEsLTYxLDQsNDcsLTg0LC0yNSwxMTIsNTQsLTcxLC0xMDksNDUsMTksMTIzLC0yNiwxMiwtOTYsLTczLDU0LC0xMDksOTIsNDgsLTU5LC04MywtMzIsODIsLTM2LC05MCwxOSw5OCw3Nyw3OCw0MCw4MCw3OCwtMTA1LDg3LC0xMTMsLTExNiwtNzIsMzAsLTY4LC00MCwtODksMTA5LC0xMDgsLTEyOCwyMiw3Miw3NywtMjEsNzYsODksOTQsLTU5LDgxLC0xMjEsLTEwNywtNjcsNjMsLTcsODIsLTg5LC00NiwtMzQsLTkyLDEyMiwtOTAsMTcsLTEyMywyMCwtODUsLTU5LC03MCw4MSwyNyw2Miw3NCwtODAsODAsMzcsNDAsMTE2LDkxLC0yNCw1MSwtNDEsLTc5LDI4LDEyMCw1MywtMTIyLC04MywxMjYsLTc4LDI1LC05OCwtMzYsMTMsMzIsODYsLTI1LDQ4LDMsLTEwMiwtMTYsMjQsLTMsODUsNDQsLTI4LDE0LDIyLDI3LC0xMjIsMTE4LDEwMSw3Myw1LDE4LDU4LC02NCwyMywtODYsLTExNCwyNCwwLDEwMCwyLDExNywtNjIsLTExOSwtMTI4LDE4LDY1LDkwLDE0LC0xMDIsMjEsODUsMTAwLDExNyw1NSwyOSwxMjcsNTQsNzcsNzIsNzQsMzIsNzgsMywtMTExLDExOCwtNzAsLTg2LDEyNywtNzQsNjAsMjIsNDgsMzcsODcsMTMsMCwtMTA1LDUsLTEyMiwtNzEsLTEwMCwxMDQsLTEyNiwtMTYsNzksLTMwLDEyMCw3NywtNzYsLTQxLC0xMDksMiw5NywtMTAxLC0xLDE1LDEyMywxMTksMTA4LDkxLC0yMCwtMTI1LC05NiwyLC05MiwtMTUsLTY3LC03NiwxMjEsMTA0LDEwNSw2NCwtNjIsMTAyLDgsNCwxMjEsLTQ1LC04MCwtODEsLTgsMTE4LDQ0LC04MiwtNDEsLTg0LDczLC0zNiwxMTcsODAsLTY5LC03MywxNCwtMTgsNzIsMzEsLTUsLTExMSwtMTI3LC00MywzNCwtOCw1NywxMDMsLTQyLDE4LC0zMywxMTcsLTI2LC0xMjQsLTEyNCwxNSw4OCwyMywxNiwtNTcsNTQsLTYsLTEwMiwxMTYsLTk5LC00NSwxMDAsLTM1LDg3LDM3LDYsOTgsMiwxMTIsNjAsLTMzLDE3LDI2LDk5LC0xMDUsNDgsLTEwNCwtMTE5LDc4LDYsLTU4LDk1LDksNDEsLTE2LDk2LDQxLC0yMiw5Niw3MiwxMTYsLTk1LC0xMDUsLTM2LC0xMjMsLTU1LDkxLC00NiwtNywtOTIsMzksNDUsODQsMTYsLTEyNCwtMTIyLC02OCwxLC0yOCwxMjIsLTYwLDgyLDEwMywtNTQsLTkyLDI3LC05OSwtMTI4LDY1LDcsLTcyLC0xMjcsNjIsLTIyLDIsLTExLDE4LC04OSwtMTA2LC03NCw3MSw4NiwtMTE2LC0yNSwtMTE1LC05Niw1NywtMzQsMjIsLTEyNCwtMTI1LC00LC00MSw0MiwtNTcsLTEwMyw0NSw3OCwxNCwtMTA2LDExMSw5OCwtOTQsLTcxLDUsNzUsMTksLTEyNCwtMzAsMzQsLTUwLDc1LC04NCwtNTAsLTU2LDUxLC0xNSwtMzYsNjEsLTk0LC03OSwtNDUsMTI2LC03NywtMTA1LC0yLC05MywtNiw4LC0zLDYsLTQyLDQ2LDEyNSw1LC05OCwxMyw2NywtMTAsLTEzLC05NCwtNzgsLTEyNywxMjEsLTI2LC04LC0xMDEsLTkxLDEyMSwtNDAsLTEyNCwtNjQsODQsLTcyLDYzLDE5LC04NF0sIm1hdGVyaWFsU2V0U2VyaWFsTnVtYmVyIjoxLCJpdlBhcmFtZXRlclNwZWMiOnsiaXYiOlszLC0xMCwtODUsMTE0LC05MCwxMTUsNzcsNTUsNTQsMTUsMzgsODQsLTExNiwxNCwtNDAsMjhdfX0=", - "eventLeftScope": false, - "executionRoleArn": "arn:aws:iam::0123456789012:role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfig", - "configRuleArn": "arn:aws:config:us-east-1:0123456789012:config-rule/config-rule-pdmyw1", - "configRuleName": "rule-ec2-test", - "configRuleId": "config-rule-pdmyw1", - "accountId": "0123456789012", - "evaluationMode": "DETECTIVE" -} diff --git a/packages/parser/tests/events/bedrockAgentEvent.json b/packages/parser/tests/events/bedrockAgentEvent.json deleted file mode 100644 index b7ad75b3c4..0000000000 --- a/packages/parser/tests/events/bedrockAgentEvent.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "actionGroup": "ClaimManagementActionGroup", - "messageVersion": "1.0", - "sessionId": "12345678912345", - "sessionAttributes": {}, - "promptSessionAttributes": {}, - "inputText": "I want to claim my insurance", - "agent": { - "alias": "TSTALIASID", - "name": "test", - "version": "DRAFT", - "id": "8ZXY0W8P1H" - }, - "httpMethod": "GET", - "apiPath": "/claims" -} diff --git a/packages/parser/tests/events/bedrockAgentPostEvent.json b/packages/parser/tests/events/bedrockAgentPostEvent.json deleted file mode 100644 index f223bfcd51..0000000000 --- a/packages/parser/tests/events/bedrockAgentPostEvent.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "actionGroup": "ClaimManagementActionGroup", - "messageVersion": "1.0", - "sessionId": "12345678912345", - "sessionAttributes": {}, - "promptSessionAttributes": {}, - "inputText": "Send reminders to all pending documents", - "agent": { - "alias": "TSTALIASID", - "name": "test", - "version": "DRAFT", - "id": "8ZXY0W8P1H" - }, - "httpMethod": "POST", - "apiPath": "/send-reminders", - "requestBody": { - "content": { - "application/json": { - "properties": [ - { - "name": "claimId", - "type": "string", - "value": "20" - }, - { - "name": "pendingDocuments", - "type": "string", - "value": "social number and vat" - } - ] - } - } - }, - "parameters": [] -} diff --git a/packages/parser/tests/events/cloudWatchDashboardEvent.json b/packages/parser/tests/events/cloudWatchDashboardEvent.json deleted file mode 100644 index fd2d3be62d..0000000000 --- a/packages/parser/tests/events/cloudWatchDashboardEvent.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "original": "param-to-widget", - "widgetContext": { - "dashboardName": "Name-of-current-dashboard", - "widgetId": "widget-16", - "domain": "https://us-east-1.console.aws.amazon.com", - "accountId": "123456789123", - "locale": "en", - "timezone": { - "label": "UTC", - "offsetISO": "+00:00", - "offsetInMinutes": 0 - }, - "period": 300, - "isAutoPeriod": true, - "timeRange": { - "mode": "relative", - "start": 1627236199729, - "end": 1627322599729, - "relativeStart": 86400012, - "zoom": { - "start": 1627276030434, - "end": 1627282956521 - } - }, - "theme": "light", - "linkCharts": true, - "title": "Tweets for Amazon website problem", - "forms": { - "all": {} - }, - "params": { - "original": "param-to-widget" - }, - "width": 588, - "height": 369 - } -} diff --git a/packages/parser/tests/events/cloudWatchLogEvent.json b/packages/parser/tests/events/cloudWatchLogEvent.json deleted file mode 100644 index aa184c1d01..0000000000 --- a/packages/parser/tests/events/cloudWatchLogEvent.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "awslogs": { - "data": "H4sIAAAAAAAAAHWPwQqCQBCGX0Xm7EFtK+smZBEUgXoLCdMhFtKV3akI8d0bLYmibvPPN3wz00CJxmQnTO41whwWQRIctmEcB6sQbFC3CjW3XW8kxpOpP+OC22d1Wml1qZkQGtoMsScxaczKN3plG8zlaHIta5KqWsozoTYw3/djzwhpLwivWFGHGpAFe7DL68JlBUk+l7KSN7tCOEJ4M3/qOI49vMHj+zCKdlFqLaU2ZHV2a4Ct/an0/ivdX8oYc1UVX860fQDQiMdxRQEAAA==" - } -} diff --git a/packages/parser/tests/events/cloudwatch/base.json b/packages/parser/tests/events/cloudwatch/base.json new file mode 100644 index 0000000000..e0eed9de38 --- /dev/null +++ b/packages/parser/tests/events/cloudwatch/base.json @@ -0,0 +1,5 @@ +{ + "awslogs": { + "data": "H4sIAAAAAAAAE6WRTU/bQBCG/0q06jEmO7uzX76lNAGqtkjY6qEYRWt7Eqz6I7U3oQjx3ysbqDgUCam31ewzo2feeWANDYPfUXq/JxazT8t0ufm6SpLl2YrNWXfXUs9ipqQWCgVHEJrNWd3tzvrusGcxW/i7YVH7Ji/9YugairpwS33U+oaewCT05BsWM8EFLoAvBCwuR2bdXn/4skxXSXoDugCjvNpaJ1B770tVWGM95Z7IF4bN2XDIh6Kv9qHq2nVVB+oHFl+z07vQV7sd9Unwxc/o633yijt1egXrjyoqYHl+mwo82s+37GbSWh2pDeOIB1aVLGbSKu00R+MsKglKGo0ASmjLDUotUVsEB+gUGOBSobQguBvTCFVDQ/DNnsVghFOCW6dA2flLts/LR8AjASlgLGwM6gSU/ZEF8mXhoLCRFUZG6EUZ5WB4lHNvrJW5BkdZuPi2vszCOdV1N9v2XTObYj4JQ9ayx/n/7WDeuUOSLq/S2RX9OtAQLsp49h712Xfqh6pr49nzsd8SNgoVKu4kSOOsdkZxxTmCNCgEaIVacXTGCQX4trB7LfyQsZqOVGcsztiUIJtnL/9T8V+Bjszgm31dtbtN78NI8rFG/bEqnvqe35tDW9K2aqmcuv46TcybJx/R372/34TeF7SpygmHSBvQGrfbSLucU2G0QBSSOCrEggu5zdjjmN7N4x+T93ZttgMAAA==" + } +} \ No newline at end of file diff --git a/packages/parser/tests/events/codePipelineEvent.json b/packages/parser/tests/events/codePipelineEvent.json deleted file mode 100644 index 4c46b0172b..0000000000 --- a/packages/parser/tests/events/codePipelineEvent.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "CodePipeline.job": { - "id": "11111111-abcd-1111-abcd-111111abcdef", - "accountId": "111111111111", - "data": { - "actionConfiguration": { - "configuration": { - "FunctionName": "MyLambdaFunctionForAWSCodePipeline", - "UserParameters": "some-input-such-as-a-URL" - } - }, - "inputArtifacts": [ - { - "name": "ArtifactName", - "revision": null, - "location": { - "type": "S3", - "s3Location": { - "bucketName": "the name of the bucket configured as the pipeline artifact store in Amazon S3, for example codepipeline-us-east-2-1234567890", - "objectKey": "the name of the application, for example CodePipelineDemoApplication.zip" - } - } - } - ], - "outputArtifacts": [], - "artifactCredentials": { - "accessKeyId": "AKIAIOSFODNN7EXAMPLE", - "secretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", - "sessionToken": "MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcNMTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9TrDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpEIbb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0FkbFFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTbNYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE=" - }, - "continuationToken": "A continuation token if continuing job" - } - } -} diff --git a/packages/parser/tests/events/codePipelineEventData.json b/packages/parser/tests/events/codePipelineEventData.json deleted file mode 100644 index dbbc18ea7b..0000000000 --- a/packages/parser/tests/events/codePipelineEventData.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "CodePipeline.job": { - "id": "c0d76431-b0e7-xmpl-97e3-e8ee786eb6f6", - "accountId": "123456789012", - "data": { - "actionConfiguration": { - "configuration": { - "FunctionName": "my-function", - "UserParameters": "{\"KEY\": \"VALUE\"}" - } - }, - "inputArtifacts": [ - { - "name": "my-pipeline-SourceArtifact", - "revision": "e0c7xmpl2308ca3071aa7bab414de234ab52eea", - "location": { - "type": "S3", - "s3Location": { - "bucketName": "us-west-2-123456789012-my-pipeline", - "objectKey": "my-pipeline/test-api-2/TdOSFRV" - } - } - } - ], - "outputArtifacts": [ - { - "name": "invokeOutput", - "revision": null, - "location": { - "type": "S3", - "s3Location": { - "bucketName": "us-west-2-123456789012-my-pipeline", - "objectKey": "my-pipeline/invokeOutp/D0YHsJn" - } - } - } - ], - "artifactCredentials": { - "accessKeyId": "AKIAIOSFODNN7EXAMPLE", - "secretAccessKey": "6CGtmAa3lzWtV7a...", - "sessionToken": "IQoJb3JpZ2luX2VjEA...", - "expirationTime": 1575493418000 - } - } - } -} diff --git a/packages/parser/tests/events/codePipelineEventEmptyUserParameters.json b/packages/parser/tests/events/codePipelineEventEmptyUserParameters.json deleted file mode 100644 index cf395efc19..0000000000 --- a/packages/parser/tests/events/codePipelineEventEmptyUserParameters.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "CodePipeline.job": { - "id": "11111111-abcd-1111-abcd-111111abcdef", - "accountId": "111111111111", - "data": { - "actionConfiguration": { - "configuration": { - "FunctionName": "MyLambdaFunctionForAWSCodePipeline" - } - }, - "inputArtifacts": [ - { - "name": "ArtifactName", - "revision": null, - "location": { - "type": "S3", - "s3Location": { - "bucketName": "the name of the bucket configured as the pipeline artifact store in Amazon S3, for example codepipeline-us-east-2-1234567890", - "objectKey": "the name of the application, for example CodePipelineDemoApplication.zip" - } - } - } - ], - "outputArtifacts": [], - "artifactCredentials": { - "accessKeyId": "AKIAIOSFODNN7EXAMPLE", - "secretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", - "sessionToken": "MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcNMTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9TrDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpEIbb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0FkbFFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTbNYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE=" - } - } - } -} diff --git a/packages/parser/tests/events/codePipelineEventWithEncryptionKey.json b/packages/parser/tests/events/codePipelineEventWithEncryptionKey.json deleted file mode 100644 index 1e81b70b71..0000000000 --- a/packages/parser/tests/events/codePipelineEventWithEncryptionKey.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "CodePipeline.job": { - "id": "11111111-abcd-1111-abcd-111111abcdef", - "accountId": "111111111111", - "data": { - "actionConfiguration": { - "configuration": { - "FunctionName": "MyLambdaFunctionForAWSCodePipeline", - "UserParameters": "some-input-such-as-a-URL" - } - }, - "inputArtifacts": [ - { - "name": "ArtifactName", - "revision": null, - "location": { - "type": "S3", - "s3Location": { - "bucketName": "the name of the bucket configured as the pipeline artifact store in Amazon S3, for example codepipeline-us-east-2-1234567890", - "objectKey": "the name of the application, for example CodePipelineDemoApplication.zip" - } - } - } - ], - "outputArtifacts": [], - "artifactCredentials": { - "accessKeyId": "AKIAIOSFODNN7EXAMPLE", - "secretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", - "sessionToken": "MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcNMTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9TrDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpEIbb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0FkbFFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTbNYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE=" - }, - "continuationToken": "A continuation token if continuing job", - "encryptionKey": { - "id": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", - "type": "KMS" - } - } - } -} diff --git a/packages/parser/tests/events/cognitoCreateAuthChallengeEvent.json b/packages/parser/tests/events/cognitoCreateAuthChallengeEvent.json deleted file mode 100644 index ac2e593684..0000000000 --- a/packages/parser/tests/events/cognitoCreateAuthChallengeEvent.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "version": "1", - "region": "us-east-1", - "userPoolId": "us-east-1_example", - "userName": "UserName", - "callerContext": { - "awsSdkVersion": "awsSdkVersion", - "clientId": "clientId" - }, - "triggerSource": "CreateAuthChallenge_Authentication", - "request": { - "userAttributes": { - "sub": "4A709A36-7D63-4785-829D-4198EF10EBDA", - "email_verified": "true", - "name": "First Last", - "email": "create-auth@mail.com" - }, - "challengeName": "PASSWORD_VERIFIER", - "session": [ - { - "challengeName": "CUSTOM_CHALLENGE", - "challengeResult": true, - "challengeMetadata": "CAPTCHA_CHALLENGE" - } - ], - "userNotFound": false - }, - "response": {} -} diff --git a/packages/parser/tests/events/cognitoCustomMessageEvent.json b/packages/parser/tests/events/cognitoCustomMessageEvent.json deleted file mode 100644 index 8652c3bff4..0000000000 --- a/packages/parser/tests/events/cognitoCustomMessageEvent.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "version": "1", - "triggerSource": "CustomMessage_AdminCreateUser", - "region": "region", - "userPoolId": "userPoolId", - "userName": "userName", - "callerContext": { - "awsSdk": "awsSdkVersion", - "clientId": "clientId" - }, - "request": { - "userAttributes": { - "phone_number_verified": false, - "email_verified": true - }, - "codeParameter": "####", - "usernameParameter": "username" - }, - "response": {} -} diff --git a/packages/parser/tests/events/cognitoDefineAuthChallengeEvent.json b/packages/parser/tests/events/cognitoDefineAuthChallengeEvent.json deleted file mode 100644 index 5ab2b02038..0000000000 --- a/packages/parser/tests/events/cognitoDefineAuthChallengeEvent.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "version": "1", - "region": "us-east-1", - "userPoolId": "us-east-1_example", - "userName": "UserName", - "callerContext": { - "awsSdkVersion": "awsSdkVersion", - "clientId": "clientId" - }, - "triggerSource": "DefineAuthChallenge_Authentication", - "request": { - "userAttributes": { - "sub": "4A709A36-7D63-4785-829D-4198EF10EBDA", - "email_verified": "true", - "name": "First Last", - "email": "define-auth@mail.com" - }, - "session": [ - { - "challengeName": "PASSWORD_VERIFIER", - "challengeResult": true - }, - { - "challengeName": "CUSTOM_CHALLENGE", - "challengeResult": true, - "challengeMetadata": "CAPTCHA_CHALLENGE" - } - ], - "userNotFound": true - }, - "response": {} -} diff --git a/packages/parser/tests/events/cognitoPostAuthenticationEvent.json b/packages/parser/tests/events/cognitoPostAuthenticationEvent.json deleted file mode 100644 index d34b18eeba..0000000000 --- a/packages/parser/tests/events/cognitoPostAuthenticationEvent.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "version": "1", - "region": "us-east-1", - "userPoolId": "us-east-1_example", - "userName": "UserName", - "callerContext": { - "awsSdkVersion": "awsSdkVersion", - "clientId": "clientId" - }, - "triggerSource": "PostAuthentication_Authentication", - "request": { - "newDeviceUsed": true, - "userAttributes": { - "email": "post-auth@mail.com" - } - }, - "response": {} -} diff --git a/packages/parser/tests/events/cognitoPostConfirmationEvent.json b/packages/parser/tests/events/cognitoPostConfirmationEvent.json deleted file mode 100644 index e88f98150c..0000000000 --- a/packages/parser/tests/events/cognitoPostConfirmationEvent.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "version": "string", - "triggerSource": "PostConfirmation_ConfirmSignUp", - "region": "us-east-1", - "userPoolId": "string", - "userName": "userName", - "callerContext": { - "awsSdkVersion": "awsSdkVersion", - "clientId": "clientId" - }, - "request": { - "userAttributes": { - "email": "user@example.com", - "email_verified": true - } - }, - "response": {} -} diff --git a/packages/parser/tests/events/cognitoPreAuthenticationEvent.json b/packages/parser/tests/events/cognitoPreAuthenticationEvent.json deleted file mode 100644 index 661fea6372..0000000000 --- a/packages/parser/tests/events/cognitoPreAuthenticationEvent.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "version": "1", - "region": "us-east-1", - "userPoolId": "us-east-1_example", - "userName": "UserName", - "callerContext": { - "awsSdkVersion": "awsSdkVersion", - "clientId": "clientId" - }, - "triggerSource": "PreAuthentication_Authentication", - "request": { - "userAttributes": { - "sub": "4A709A36-7D63-4785-829D-4198EF10EBDA", - "email_verified": "true", - "name": "First Last", - "email": "pre-auth@mail.com" - } - }, - "response": {} -} diff --git a/packages/parser/tests/events/cognitoPreSignUpEvent.json b/packages/parser/tests/events/cognitoPreSignUpEvent.json deleted file mode 100644 index feb4eba25d..0000000000 --- a/packages/parser/tests/events/cognitoPreSignUpEvent.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "version": "string", - "triggerSource": "PreSignUp_SignUp", - "region": "us-east-1", - "userPoolId": "string", - "userName": "userName", - "callerContext": { - "awsSdkVersion": "awsSdkVersion", - "clientId": "clientId" - }, - "request": { - "userAttributes": { - "email": "user@example.com", - "phone_number": "+12065550100" - } - }, - "response": {} -} diff --git a/packages/parser/tests/events/cognitoPreTokenGenerationEvent.json b/packages/parser/tests/events/cognitoPreTokenGenerationEvent.json deleted file mode 100644 index f5ee69e0d2..0000000000 --- a/packages/parser/tests/events/cognitoPreTokenGenerationEvent.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": "1", - "triggerSource": "TokenGeneration_Authentication", - "region": "us-west-2", - "userPoolId": "us-west-2_example", - "userName": "testqq", - "callerContext": { - "awsSdkVersion": "aws-sdk-unknown-unknown", - "clientId": "71ghuul37mresr7h373b704tua" - }, - "request": { - "userAttributes": { - "sub": "0b0a57c5-f013-426a-81a1-f8ffbfba21f0", - "email_verified": "true", - "cognito:user_status": "CONFIRMED", - "email": "test@mail.com" - }, - "groupConfiguration": { - "groupsToOverride": [], - "iamRolesToOverride": [], - "preferredRole": null - } - }, - "response": {} -} diff --git a/packages/parser/tests/events/cognitoUserMigrationEvent.json b/packages/parser/tests/events/cognitoUserMigrationEvent.json deleted file mode 100644 index 2eae4e6618..0000000000 --- a/packages/parser/tests/events/cognitoUserMigrationEvent.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "version": "string", - "triggerSource": "UserMigration_Authentication", - "region": "us-east-1", - "userPoolId": "string", - "userName": "userName", - "callerContext": { - "awsSdkVersion": "awsSdkVersion", - "clientId": "clientId" - }, - "request": { - "password": "password" - }, - "response": {} -} diff --git a/packages/parser/tests/events/cognitoVerifyAuthChallengeResponseEvent.json b/packages/parser/tests/events/cognitoVerifyAuthChallengeResponseEvent.json deleted file mode 100644 index 286da2c1d7..0000000000 --- a/packages/parser/tests/events/cognitoVerifyAuthChallengeResponseEvent.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "version": "1", - "region": "us-east-1", - "userPoolId": "us-east-1_example", - "userName": "UserName", - "callerContext": { - "awsSdkVersion": "awsSdkVersion", - "clientId": "clientId" - }, - "triggerSource": "VerifyAuthChallengeResponse_Authentication", - "request": { - "userAttributes": { - "sub": "4A709A36-7D63-4785-829D-4198EF10EBDA", - "email_verified": "true", - "name": "First Last", - "email": "verify-auth@mail.com" - }, - "privateChallengeParameters": { - "answer": "challengeAnswer" - }, - "clientMetadata": { - "foo": "value" - }, - "challengeAnswer": "challengeAnswer", - "userNotFound": true - }, - "response": {} -} diff --git a/packages/parser/tests/events/connectContactFlowEventAll.json b/packages/parser/tests/events/connectContactFlowEventAll.json deleted file mode 100644 index 0685b85b8b..0000000000 --- a/packages/parser/tests/events/connectContactFlowEventAll.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "Name": "ContactFlowEvent", - "Details": { - "ContactData": { - "Attributes": { - "Language": "en-US" - }, - "Channel": "VOICE", - "ContactId": "5ca32fbd-8f92-46af-92a5-6b0f970f0efe", - "CustomerEndpoint": { - "Address": "+11234567890", - "Type": "TELEPHONE_NUMBER" - }, - "InitialContactId": "5ca32fbd-8f92-46af-92a5-6b0f970f0efe", - "InitiationMethod": "API", - "InstanceARN": "arn:aws:connect:eu-central-1:123456789012:instance/9308c2a1-9bc6-4cea-8290-6c0b4a6d38fa", - "MediaStreams": { - "Customer": { - "Audio": { - "StartFragmentNumber": "91343852333181432392682062622220590765191907586", - "StartTimestamp": "1565781909613", - "StreamARN": "arn:aws:kinesisvideo:eu-central-1:123456789012:stream/connect-contact-a3d73b84-ce0e-479a-a9dc-5637c9d30ac9/1565272947806" - } - } - }, - "PreviousContactId": "5ca32fbd-8f92-46af-92a5-6b0f970f0efe", - "Queue": { - "ARN": "arn:aws:connect:eu-central-1:123456789012:instance/9308c2a1-9bc6-4cea-8290-6c0b4a6d38fa/queue/5cba7cbf-1ecb-4b6d-b8bd-fe91079b3fc8", - "Name": "QueueOne" - }, - "SystemEndpoint": { - "Address": "+11234567890", - "Type": "TELEPHONE_NUMBER" - } - }, - "Parameters": { - "ParameterOne": "One", - "ParameterTwo": "Two" - } - } -} diff --git a/packages/parser/tests/events/connectContactFlowEventMin.json b/packages/parser/tests/events/connectContactFlowEventMin.json deleted file mode 100644 index 5c69558ae8..0000000000 --- a/packages/parser/tests/events/connectContactFlowEventMin.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "Name": "ContactFlowEvent", - "Details": { - "ContactData": { - "Attributes": {}, - "Channel": "VOICE", - "ContactId": "5ca32fbd-8f92-46af-92a5-6b0f970f0efe", - "CustomerEndpoint": null, - "InitialContactId": "5ca32fbd-8f92-46af-92a5-6b0f970f0efe", - "InitiationMethod": "API", - "InstanceARN": "arn:aws:connect:eu-central-1:123456789012:instance/9308c2a1-9bc6-4cea-8290-6c0b4a6d38fa", - "MediaStreams": { - "Customer": { - "Audio": { - "StartFragmentNumber": null, - "StartTimestamp": null, - "StreamARN": null - } - } - }, - "PreviousContactId": "5ca32fbd-8f92-46af-92a5-6b0f970f0efe", - "Queue": null, - "SystemEndpoint": null - }, - "Parameters": {} - } -} diff --git a/packages/parser/tests/events/rabbitMQEvent.json b/packages/parser/tests/events/rabbitMQEvent.json deleted file mode 100644 index 5196b45327..0000000000 --- a/packages/parser/tests/events/rabbitMQEvent.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "eventSource": "aws:rmq", - "eventSourceArn": "arn:aws:mq:us-west-2:112556298976:broker:pizzaBroker:b-9bcfa592-423a-4942-879d-eb284b418fc8", - "rmqMessagesByQueue": { - "pizzaQueue::/": [ - { - "basicProperties": { - "contentType": "text/plain", - "contentEncoding": null, - "headers": { - "header1": { - "bytes": [118, 97, 108, 117, 101, 49] - }, - "header2": { - "bytes": [118, 97, 108, 117, 101, 50] - }, - "numberInHeader": 10 - }, - "deliveryMode": 1, - "priority": 34, - "correlationId": null, - "replyTo": null, - "expiration": "60000", - "messageId": null, - "timestamp": "Jan 1, 1970, 12:33:41 AM", - "type": null, - "userId": "AIDACKCEVSQ6C2EXAMPLE", - "appId": null, - "clusterId": null, - "bodySize": 80 - }, - "redelivered": false, - "data": "eyJ0aW1lb3V0IjowLCJkYXRhIjoiQ1pybWYwR3c4T3Y0YnFMUXhENEUifQ==" - } - ] - } -} diff --git a/packages/parser/tests/events/secretsManagerEvent.json b/packages/parser/tests/events/secretsManagerEvent.json deleted file mode 100644 index d0cd2c1291..0000000000 --- a/packages/parser/tests/events/secretsManagerEvent.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "SecretId": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3", - "ClientRequestToken": "550e8400-e29b-41d4-a716-446655440000", - "Step": "createSecret" -} diff --git a/packages/parser/tests/unit/envelopes/cloudwatch.test.ts b/packages/parser/tests/unit/envelopes/cloudwatch.test.ts index 40f13ac6b7..505e95d34a 100644 --- a/packages/parser/tests/unit/envelopes/cloudwatch.test.ts +++ b/packages/parser/tests/unit/envelopes/cloudwatch.test.ts @@ -1,131 +1,270 @@ -import { gzipSync } from 'node:zlib'; -import { generateMock } from '@anatine/zod-mock'; +import { gunzipSync, gzipSync } from 'node:zlib'; import { describe, expect, it } from 'vitest'; -import { ZodError } from 'zod'; +import { ZodError, z } from 'zod'; import { ParseError } from '../../../src'; import { CloudWatchEnvelope } from '../../../src/envelopes/index.js'; -import { - CloudWatchLogEventSchema, - CloudWatchLogsDecodeSchema, -} from '../../../src/schemas/'; -import { TestSchema } from '../schema/utils.js'; - -describe('CloudWatch', () => { - describe('parse', () => { - it('should parse custom schema in envelope', () => { - const testEvent = { - awslogs: { - data: '', - }, - }; +import { DecompressError } from '../../../src/errors.js'; +import { JSONStringified } from '../../../src/helpers.js'; +import { getTestEvent } from '../schema/utils.js'; - const data = generateMock(TestSchema); - const eventMock = generateMock(CloudWatchLogEventSchema, { - stringMap: { - message: () => JSON.stringify(data), - }, - }); +const decompressRecordToJSON = ( + data: string +): { + logEvents: { + message: string; + id: string; + timestamp: number; + }[]; + messageType: string; + owner: string; + logGroup: string; + logStream: string; + subscriptionFilters: string[]; +} => { + const uncompressed = gunzipSync(Buffer.from(data, 'base64')).toString('utf8'); - const logMock = generateMock(CloudWatchLogsDecodeSchema); - logMock.logEvents = [eventMock]; + return JSON.parse(uncompressed); +}; - testEvent.awslogs.data = gzipSync( - Buffer.from(JSON.stringify(logMock), 'utf8') - ).toString('base64'); +const compressJSONToRecord = (data: unknown): string => { + const jsonString = JSON.stringify(data); + return gzipSync(Buffer.from(jsonString, 'utf8')).toString('base64'); +}; - expect(CloudWatchEnvelope.parse(testEvent, TestSchema)).toEqual([data]); - }); +describe('Envelope: CloudWatch', () => { + const baseEvent = getTestEvent<{ awslogs: { data: string } }>({ + eventsPath: 'cloudwatch', + filename: 'base', + }); + const data = decompressRecordToJSON(structuredClone(baseEvent).awslogs.data); + const mockLogMessages = [ + { + level: 'DEBUG', + message: 'Hello from other.ts', + sample_rate: 1, + }, + { + level: 'INFO', + message: 'processing event', + sample_rate: 1, + }, + ]; + const JSONOnlyEvent = { + awslogs: { + data: compressJSONToRecord({ + ...data, + logEvents: [ + { + ...data.logEvents[0], + message: JSON.stringify(mockLogMessages[0]), + }, + { + ...data.logEvents[1], + message: JSON.stringify(mockLogMessages[1]), + }, + ], + }), + }, + }; - it('should throw when schema does not match', () => { - const testEvent = { - awslogs: { - data: '', - }, - }; + describe('Method: parse', () => { + it('throws if one of the payloads does not match the schema', () => { + // Prepare + const event = structuredClone(baseEvent); - const eventMock = generateMock(CloudWatchLogEventSchema, { - stringMap: { - message: () => JSON.stringify({ foo: 'bar' }), - }, - }); + // Act & Assess + expect(() => + CloudWatchEnvelope.parse( + event, + z + .object({ + message: z.string(), + }) + .strict() + ) + ).toThrow( + expect.objectContaining({ + message: expect.stringContaining( + 'Failed to parse CloudWatch log event at index 0' + ), + cause: expect.objectContaining({ + issues: [ + { + code: 'invalid_type', + expected: 'object', + received: 'string', + path: ['awslogs', 'data', 'logEvents', 0, 'message'], + message: 'Expected object, received string', + }, + ], + }), + }) + ); + }); - const logMock = generateMock(CloudWatchLogsDecodeSchema); - logMock.logEvents = [eventMock]; + it('parses a CloudWatch Logs event', () => { + // Prepare + const event = structuredClone(JSONOnlyEvent); - testEvent.awslogs.data = gzipSync( - Buffer.from(JSON.stringify(logMock), 'utf8') - ).toString('base64'); + // Act + const result = CloudWatchEnvelope.parse( + event, + JSONStringified( + z.object({ + level: z.string(), + message: z.string(), + sample_rate: z.number(), + }) + ) + ); - expect(() => CloudWatchEnvelope.parse(testEvent, TestSchema)).toThrow(); + // Assess + expect(result).toStrictEqual(mockLogMessages); }); }); - describe('safeParse', () => { - it('should parse custom schema in envelope', () => { - const testEvent = { - awslogs: { - data: '', - }, - }; - - const data = generateMock(TestSchema); - const eventMock = generateMock(CloudWatchLogEventSchema, { - stringMap: { - message: () => JSON.stringify(data), - }, - }); - - const logMock = generateMock(CloudWatchLogsDecodeSchema); - logMock.logEvents = [eventMock]; + describe('Method: safeParse', () => { + it('parses a CloudWatch Logs event', () => { + // Prepare + const event = structuredClone(JSONOnlyEvent); - testEvent.awslogs.data = gzipSync( - Buffer.from(JSON.stringify(logMock), 'utf8') - ).toString('base64'); + // Act + const result = CloudWatchEnvelope.safeParse( + event, + JSONStringified( + z.object({ + level: z.string(), + message: z.string(), + sample_rate: z.number(), + }) + ) + ); - const actual = CloudWatchEnvelope.safeParse(testEvent, TestSchema); - expect(actual).toEqual({ + // Assess + expect(result).toStrictEqual({ success: true, - data: [data], + data: mockLogMessages, }); }); - it('should return success false when schema does not match', () => { - const testEvent = { + it('returns an error if the event is not a valid CloudWatch Logs event', () => { + // Prepare + const event = { awslogs: { - data: '', + data: 'invalid', }, }; - const eventMock = generateMock(CloudWatchLogEventSchema, { - stringMap: { - message: () => JSON.stringify({ foo: 'bar' }), - }, + // Act + const result = CloudWatchEnvelope.safeParse(event, z.object({})); + + // Assess + expect(result).toStrictEqual({ + success: false, + error: new ParseError('Failed to parse CloudWatch Log envelope', { + cause: new DecompressError( + 'Failed to decompress CloudWatch log data' + ), + }), + originalEvent: event, }); + }); - const logMock = generateMock(CloudWatchLogsDecodeSchema); - logMock.logEvents = [eventMock]; + it('returns an error if any of the messages fail to parse', () => { + // Prepare + const event = { + awslogs: { + data: compressJSONToRecord({ + ...data, + logEvents: [ + { + ...data.logEvents[0], + message: 'invalid', + }, + { + ...data.logEvents[1], + message: JSON.stringify(mockLogMessages[1]), + }, + ], + }), + }, + }; - testEvent.awslogs.data = gzipSync( - Buffer.from(JSON.stringify(logMock), 'utf8') - ).toString('base64'); + // Act + const result = CloudWatchEnvelope.safeParse( + event, + JSONStringified( + z.object({ + level: z.string(), + message: z.string(), + sample_rate: z.number(), + }) + ) + ); - const parseResult = CloudWatchEnvelope.safeParse(testEvent, TestSchema); - expect(parseResult).toEqual({ + // Assess + expect(result).toStrictEqual({ success: false, - error: expect.any(ParseError), - originalEvent: testEvent, + error: new ParseError( + 'Failed to parse CloudWatch Log message at index 0', + { + cause: new ZodError([ + { + code: 'custom', + message: 'Invalid JSON', + path: ['awslogs', 'data', 'logEvents', 0, 'message'], + }, + ]), + } + ), + originalEvent: event, }); - - if (!parseResult.success && parseResult.error) { - expect(parseResult.error.cause).toBeInstanceOf(ZodError); - } }); - it('should return success false when envelope does not match', () => { - expect(CloudWatchEnvelope.safeParse({ foo: 'bar' }, TestSchema)).toEqual({ + it('returns a combined error if multiple records fail to parse', () => { + // Prepare + const event = structuredClone(baseEvent); + + // Act + const result = CloudWatchEnvelope.safeParse( + event, + z.object({ + message: z.string(), + }) + ); + + // Assess + expect(result).toStrictEqual({ success: false, - error: expect.any(ParseError), - originalEvent: { foo: 'bar' }, + error: new ParseError( + 'Failed to parse CloudWatch Log messages at indexes 0, 1, 2', + { + cause: new ZodError([ + { + code: 'invalid_type', + expected: 'object', + received: 'string', + path: ['awslogs', 'data', 'logEvents', 0, 'message'], + message: 'Expected object, received string', + }, + { + code: 'invalid_type', + expected: 'object', + received: 'string', + path: ['awslogs', 'data', 'logEvents', 1, 'message'], + message: 'Expected object, received string', + }, + { + code: 'invalid_type', + expected: 'object', + received: 'string', + path: ['awslogs', 'data', 'logEvents', 2, 'message'], + message: 'Expected object, received string', + }, + ]), + } + ), + originalEvent: event, }); }); }); diff --git a/packages/parser/tests/unit/schema/cloudwatch.test.ts b/packages/parser/tests/unit/schema/cloudwatch.test.ts index 3fd6dc115f..b3d99d3a18 100644 --- a/packages/parser/tests/unit/schema/cloudwatch.test.ts +++ b/packages/parser/tests/unit/schema/cloudwatch.test.ts @@ -1,25 +1,67 @@ import { describe, expect, it } from 'vitest'; -import { CloudWatchLogsSchema } from '../../../src/schemas/'; -import { TestEvents } from './utils.js'; +import { CloudWatchLogsSchema } from '../../../src/schemas/cloudwatch.js'; +import type { CloudWatchLogsEvent } from '../../../src/types/index.js'; +import { getTestEvent } from './utils.js'; -describe('CloudWatchLogs ', () => { - it('should parse cloudwatch logs event', () => { - const cloudWatchLogEvent = TestEvents.cloudWatchLogEvent; - const parsed = CloudWatchLogsSchema.parse(cloudWatchLogEvent); - expect(parsed.awslogs.data).toBeDefined(); - expect(parsed.awslogs.data?.logEvents[0]).toEqual({ - id: 'eventId1', - timestamp: 1440442987000, - message: '[ERROR] First test message', - }); +describe('Schema: CloudWatchLogs', () => { + const baseEvent = getTestEvent({ + eventsPath: 'cloudwatch', + filename: 'base', }); - it('should throw error if cloudwatch logs event is invalid', () => { - expect(() => - CloudWatchLogsSchema.parse({ - awslogs: { - data: 'invalid', + + it('parses a CloudWatch Logs event', () => { + // Prepare + const event = structuredClone(baseEvent); + + // Act + const result = CloudWatchLogsSchema.parse(event); + + // Assess + expect(result).toStrictEqual({ + awslogs: { + data: { + logEvents: [ + { + id: '38569604798453153764115268074363468419149517103543812096', + message: `2024-10-21T14:28:15.158Z eadc91c8-8273-4a2d-b170-b0a7883b619e INFO Hello from other.ts +`, + timestamp: 1729520895158, + }, + { + id: '38569604798453153764115268074363468419149517103543812097', + message: `START RequestId: eadc91c8-8273-4a2d-b170-b0a7883b619e Version: $LATEST +`, + timestamp: 1729520895158, + }, + { + id: '38569604798475454509313798697505004137422165465049792514', + message: `{"level":"INFO","message":"Hello from other.ts","sampling_rate":0,"service":"service_undefined","timestamp":"2024-10-21T14:28:15.158Z","xray_trace_id":"1-671664ff-69b0ec7624423e04544c023f"} +`, + timestamp: 1729520895159, + }, + ], + logGroup: '/aws/lambda/some-other-name', + logStream: + '2024/10/21/OtherFn[$LATEST]16c175a5f89246aaad5c878aebaeeac7', + messageType: 'DATA_MESSAGE', + owner: '536254204126', + subscriptionFilters: [ + 'CwtriggerStack-MySubscriptionC96E1FB5-c1AHhT24v8Jh', + ], }, - }) - ).toThrowError(); + }, + }); + }); + + it('throws if the event is not a CloudWatch Logs event', () => { + // Prepare + const event = { + awslogs: { + data: 'invalid', + }, + }; + + // Act & Assess + expect(() => CloudWatchLogsSchema.parse(event)).toThrow(); }); }); diff --git a/packages/parser/tests/unit/schema/utils.ts b/packages/parser/tests/unit/schema/utils.ts index fe2ec91565..489698bd07 100644 --- a/packages/parser/tests/unit/schema/utils.ts +++ b/packages/parser/tests/unit/schema/utils.ts @@ -8,36 +8,12 @@ export const TestSchema = z.object({ }); const filenames = [ - 'activeMQEvent', 'albEvent', 'albEventPathTrailingSlash', 'albMultiValueHeadersEvent', - 'awsConfigRuleConfigurationChanged', - 'awsConfigRuleOversizedConfiguration', - 'awsConfigRuleScheduled', - 'bedrockAgentEvent', - 'bedrockAgentPostEvent', 'cloudFormationCustomResourceCreateEvent', 'cloudFormationCustomResourceDeleteEvent', 'cloudFormationCustomResourceUpdateEvent', - 'cloudWatchDashboardEvent', - 'cloudWatchLogEvent', - 'codePipelineEvent', - 'codePipelineEventData', - 'codePipelineEventEmptyUserParameters', - 'codePipelineEventWithEncryptionKey', - 'cognitoCreateAuthChallengeEvent', - 'cognitoCustomMessageEvent', - 'cognitoDefineAuthChallengeEvent', - 'cognitoPostAuthenticationEvent', - 'cognitoPostConfirmationEvent', - 'cognitoPreAuthenticationEvent', - 'cognitoPreSignUpEvent', - 'cognitoPreTokenGenerationEvent', - 'cognitoUserMigrationEvent', - 'cognitoVerifyAuthChallengeResponseEvent', - 'connectContactFlowEventAll', - 'connectContactFlowEventMin', 'kinesisFirehoseKinesisEvent', 'kinesisFirehosePutEvent', 'kinesisFirehoseSQSEvent', @@ -47,7 +23,6 @@ const filenames = [ 'lambdaFunctionUrlEvent', 'lambdaFunctionUrlEventPathTrailingSlash', 'lambdaFunctionUrlIAMEvent', - 'rabbitMQEvent', 's3Event', 's3EventBridgeNotificationObjectCreatedEvent', 's3EventBridgeNotificationObjectDeletedEvent', @@ -60,7 +35,6 @@ const filenames = [ 's3ObjectEventIAMUser', 's3ObjectEventTempCredentials', 's3SqsEvent', - 'secretsManagerEvent', 'sesEvent', 'snsEvent', 'snsSqsEvent', From a4e8a22052385296a9b4bf0a1a9cc1bc05011d42 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Tue, 21 Jan 2025 18:43:20 +0100 Subject: [PATCH 2/2] chore: set minimum of one logEvent --- packages/parser/src/schemas/cloudwatch.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/parser/src/schemas/cloudwatch.ts b/packages/parser/src/schemas/cloudwatch.ts index 68edce1ef7..cc3963fe0a 100644 --- a/packages/parser/src/schemas/cloudwatch.ts +++ b/packages/parser/src/schemas/cloudwatch.ts @@ -14,7 +14,7 @@ const CloudWatchLogsDecodeSchema = z.object({ logGroup: z.string(), logStream: z.string(), subscriptionFilters: z.array(z.string()), - logEvents: z.array(CloudWatchLogEventSchema), + logEvents: z.array(CloudWatchLogEventSchema).min(1), }); const decompressRecordToJSON = (