Skip to content

Commit f7f3f6c

Browse files
feature: added kinesis data stream eventsource (#531)
* Added Kinesis DataStream EventSource * test: added for kinesis dataStream events * docs: added documentation for kinesis data stream events Co-authored-by: brett-vendia <[email protected]>
1 parent 36db4b1 commit f7f3f6c

File tree

7 files changed

+76
-2
lines changed

7 files changed

+76
-2
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@ serverlessExpress({
251251
'AWS_DYNAMODB': '/dynamodb',
252252
'AWS_SQS': '/sqs'
253253
'AWS_EVENTBRIDGE': '/eventbridge',
254+
'AWS_KINESIS_DATA_STREAM': '/kinesis',
254255
}
255256
})
256257
```
@@ -276,6 +277,7 @@ ensure the `Host` header matches:
276277
- DynamoDB: `dynamodb.amazonaws.com`
277278
- SQS: `sqs.amazonaws.com`
278279
- EventBridge: `events.amazonaws.com`
280+
- KinesisDataStream: `kinesis.amazonaws.com`
279281

280282
### logSettings
281283

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
const eventSources = require('../src/event-sources')
2+
const testUtils = require('./utils')
3+
4+
const kinesisDataStreamEventSource = eventSources.getEventSource({
5+
eventSourceName: 'AWS_KINESIS_DATA_STREAM'
6+
})
7+
8+
test('request is correct', () => {
9+
const req = getReq()
10+
expect(typeof req).toEqual('object')
11+
expect(req.headers).toEqual({ host: 'kinesis.amazonaws.com' })
12+
expect(req.body).toEqual(testUtils.kinesisDataStreamEvent)
13+
expect(req.method).toEqual('POST')
14+
})
15+
16+
function getReq () {
17+
const event = testUtils.kinesisDataStreamEvent
18+
const request = kinesisDataStreamEventSource.getRequest({ event })
19+
return request
20+
}

__tests__/utils.js

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,28 @@ const eventbridgeScheduledEvent = {
194194
resources: ['arn:aws:events:us-east-2:123456789012:rule/my-schedule']
195195
}
196196

197+
// Sample event from https://docs.aws.amazon.com/lambda/latest/dg/with-kinesis-example.html
198+
const kinesisDataStreamEvent = {
199+
Records: [
200+
{
201+
kinesis: {
202+
kinesisSchemaVersion: '1.0',
203+
partitionKey: '1',
204+
sequenceNumber: '49590338271490256608559692538361571095921575989136588898',
205+
data: 'SGVsbG8sIHRoaXMgaXMgYSB0ZXN0Lg==',
206+
approximateArrivalTimestamp: 1545084650.987
207+
},
208+
eventSource: 'aws:kinesis',
209+
eventVersion: '1.0',
210+
eventID: 'shardId-000000000006:49590338271490256608559692538361571095921575989136588898',
211+
eventName: 'aws:kinesis:record',
212+
invokeIdentityArn: 'arn:aws:iam::123456789012:role/lambda-kinesis-role',
213+
awsRegion: 'us-east-2',
214+
eventSourceARN: 'arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream'
215+
}
216+
]
217+
}
218+
197219
describe('getEventSourceNameBasedOnEvent', () => {
198220
test('throws error on empty event', () => {
199221
expect(() => getEventSourceNameBasedOnEvent({ event: {} })).toThrow(
@@ -221,6 +243,11 @@ describe('getEventSourceNameBasedOnEvent', () => {
221243
expect(result).toEqual('AWS_SQS')
222244
})
223245

246+
test('recognizes kinesis data stream event', () => {
247+
const result = getEventSourceNameBasedOnEvent({ event: kinesisDataStreamEvent })
248+
expect(result).toEqual('AWS_KINESIS_DATA_STREAM')
249+
})
250+
224251
test('recognizes eventbridge event', () => {
225252
const result = getEventSourceNameBasedOnEvent({ event: eventbridgeEvent })
226253
expect(result).toEqual('AWS_EVENTBRIDGE')
@@ -238,5 +265,6 @@ module.exports = {
238265
snsEvent,
239266
sqsEvent,
240267
eventbridgeEvent,
241-
eventbridgeScheduledEvent
268+
eventbridgeScheduledEvent,
269+
kinesisDataStreamEvent
242270
}

src/configure.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { Handler } from "aws-lambda";
33
import Logger from "./logger";
44
import Framework from "./frameworks";
55

6-
type EventSources = "AWS_SNS" | "AWS_DYNAMODB" | "AWS_EVENTBRIDGE" | "AWS_SQS";
6+
type EventSources = "AWS_SNS" | "AWS_DYNAMODB" | "AWS_EVENTBRIDGE" | "AWS_SQS" | "AWS_KINESIS_DATA_STREAM";
77

88
interface EventSource {
99
getRequest?: any; // TODO:

src/event-sources/aws/kinesis.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
const { emptyResponseMapper } = require('../utils')
2+
3+
const getRequestValuesFromKinesis = ({ event }) => {
4+
const method = 'POST'
5+
const headers = { host: 'kinesis.amazonaws.com' }
6+
const body = event
7+
8+
return {
9+
method,
10+
headers,
11+
body
12+
}
13+
}
14+
15+
module.exports = {
16+
getRequest: getRequestValuesFromKinesis,
17+
getResponse: emptyResponseMapper
18+
}

src/event-sources/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const awsSqsEventSource = require('./aws/sqs')
77
const awsDynamoDbEventSource = require('./aws/dynamodb')
88
const azureHttpFunctionV3EventSource = require('./azure/http-function-runtime-v3')
99
const awsEventBridgeEventSource = require('./aws/eventbridge')
10+
const awsKinesisEventSource = require('./aws/kinesis')
1011

1112
function getEventSource ({ eventSourceName }) {
1213
switch (eventSourceName) {
@@ -28,6 +29,8 @@ function getEventSource ({ eventSourceName }) {
2829
return awsSqsEventSource
2930
case 'AWS_EVENTBRIDGE':
3031
return awsEventBridgeEventSource
32+
case 'AWS_KINESIS_DATA_STREAM':
33+
return awsKinesisEventSource
3134
default:
3235
throw new Error('Couldn\'t detect valid event source.')
3336
}

src/event-sources/utils.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ function getEventSourceNameBasedOnEvent ({
8282
if (eventSource === 'aws:sqs') {
8383
return 'AWS_SQS'
8484
}
85+
if (eventSource === 'aws:kinesis') {
86+
return 'AWS_KINESIS_DATA_STREAM'
87+
}
8588
return 'AWS_LAMBDA_EDGE'
8689
}
8790
if (event.requestContext) {

0 commit comments

Comments
 (0)