diff --git a/README.md b/README.md index 360649ae..cada41b0 100644 --- a/README.md +++ b/README.md @@ -251,6 +251,7 @@ serverlessExpress({ 'AWS_DYNAMODB': '/dynamodb', 'AWS_SQS': '/sqs' 'AWS_EVENTBRIDGE': '/eventbridge', + 'AWS_KINESIS_DATA_STREAM': '/kinesis', } }) ``` @@ -276,6 +277,7 @@ ensure the `Host` header matches: - DynamoDB: `dynamodb.amazonaws.com` - SQS: `sqs.amazonaws.com` - EventBridge: `events.amazonaws.com` +- KinesisDataStream: `kinesis.amazonaws.com` ### logSettings diff --git a/__tests__/unit.kinesis-data-stream.js b/__tests__/unit.kinesis-data-stream.js new file mode 100644 index 00000000..c5c23b3a --- /dev/null +++ b/__tests__/unit.kinesis-data-stream.js @@ -0,0 +1,20 @@ +const eventSources = require('../src/event-sources') +const testUtils = require('./utils') + +const kinesisDataStreamEventSource = eventSources.getEventSource({ + eventSourceName: 'AWS_KINESIS_DATA_STREAM' +}) + +test('request is correct', () => { + const req = getReq() + expect(typeof req).toEqual('object') + expect(req.headers).toEqual({ host: 'kinesis.amazonaws.com' }) + expect(req.body).toEqual(testUtils.kinesisDataStreamEvent) + expect(req.method).toEqual('POST') +}) + +function getReq () { + const event = testUtils.kinesisDataStreamEvent + const request = kinesisDataStreamEventSource.getRequest({ event }) + return request +} diff --git a/__tests__/utils.js b/__tests__/utils.js index dc577f3b..f8bebe2a 100644 --- a/__tests__/utils.js +++ b/__tests__/utils.js @@ -194,6 +194,28 @@ const eventbridgeScheduledEvent = { resources: ['arn:aws:events:us-east-2:123456789012:rule/my-schedule'] } +// Sample event from https://docs.aws.amazon.com/lambda/latest/dg/with-kinesis-example.html +const kinesisDataStreamEvent = { + Records: [ + { + kinesis: { + kinesisSchemaVersion: '1.0', + partitionKey: '1', + sequenceNumber: '49590338271490256608559692538361571095921575989136588898', + data: 'SGVsbG8sIHRoaXMgaXMgYSB0ZXN0Lg==', + approximateArrivalTimestamp: 1545084650.987 + }, + 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-2', + eventSourceARN: 'arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream' + } + ] +} + describe('getEventSourceNameBasedOnEvent', () => { test('throws error on empty event', () => { expect(() => getEventSourceNameBasedOnEvent({ event: {} })).toThrow( @@ -221,6 +243,11 @@ describe('getEventSourceNameBasedOnEvent', () => { expect(result).toEqual('AWS_SQS') }) + test('recognizes kinesis data stream event', () => { + const result = getEventSourceNameBasedOnEvent({ event: kinesisDataStreamEvent }) + expect(result).toEqual('AWS_KINESIS_DATA_STREAM') + }) + test('recognizes eventbridge event', () => { const result = getEventSourceNameBasedOnEvent({ event: eventbridgeEvent }) expect(result).toEqual('AWS_EVENTBRIDGE') @@ -238,5 +265,6 @@ module.exports = { snsEvent, sqsEvent, eventbridgeEvent, - eventbridgeScheduledEvent + eventbridgeScheduledEvent, + kinesisDataStreamEvent } diff --git a/src/configure.d.ts b/src/configure.d.ts index f0293379..3ea07640 100644 --- a/src/configure.d.ts +++ b/src/configure.d.ts @@ -3,7 +3,7 @@ import { Handler } from "aws-lambda"; import Logger from "./logger"; import Framework from "./frameworks"; -type EventSources = "AWS_SNS" | "AWS_DYNAMODB" | "AWS_EVENTBRIDGE" | "AWS_SQS"; +type EventSources = "AWS_SNS" | "AWS_DYNAMODB" | "AWS_EVENTBRIDGE" | "AWS_SQS" | "AWS_KINESIS_DATA_STREAM"; interface EventSource { getRequest?: any; // TODO: diff --git a/src/event-sources/aws/kinesis.js b/src/event-sources/aws/kinesis.js new file mode 100644 index 00000000..ecbdc0e0 --- /dev/null +++ b/src/event-sources/aws/kinesis.js @@ -0,0 +1,18 @@ +const { emptyResponseMapper } = require('../utils') + +const getRequestValuesFromKinesis = ({ event }) => { + const method = 'POST' + const headers = { host: 'kinesis.amazonaws.com' } + const body = event + + return { + method, + headers, + body + } +} + +module.exports = { + getRequest: getRequestValuesFromKinesis, + getResponse: emptyResponseMapper +} diff --git a/src/event-sources/index.js b/src/event-sources/index.js index ebe5d118..d6eb4624 100644 --- a/src/event-sources/index.js +++ b/src/event-sources/index.js @@ -7,6 +7,7 @@ const awsSqsEventSource = require('./aws/sqs') const awsDynamoDbEventSource = require('./aws/dynamodb') const azureHttpFunctionV3EventSource = require('./azure/http-function-runtime-v3') const awsEventBridgeEventSource = require('./aws/eventbridge') +const awsKinesisEventSource = require('./aws/kinesis') function getEventSource ({ eventSourceName }) { switch (eventSourceName) { @@ -28,6 +29,8 @@ function getEventSource ({ eventSourceName }) { return awsSqsEventSource case 'AWS_EVENTBRIDGE': return awsEventBridgeEventSource + case 'AWS_KINESIS_DATA_STREAM': + return awsKinesisEventSource default: throw new Error('Couldn\'t detect valid event source.') } diff --git a/src/event-sources/utils.js b/src/event-sources/utils.js index 573c3556..cdc50c39 100644 --- a/src/event-sources/utils.js +++ b/src/event-sources/utils.js @@ -82,6 +82,9 @@ function getEventSourceNameBasedOnEvent ({ if (eventSource === 'aws:sqs') { return 'AWS_SQS' } + if (eventSource === 'aws:kinesis') { + return 'AWS_KINESIS_DATA_STREAM' + } return 'AWS_LAMBDA_EDGE' } if (event.requestContext) {