UNPKG

@serverless-seoul/dynamorm-stream

Version:
69 lines 2.64 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseDynamoDBStreamARN = exports.StreamHandler = void 0; const debug = require("debug"); const logger = debug("@serverless-seoul/dynamorm-stream:StreamHandler"); class StreamHandler { constructor(tableHandlers) { this.tableHandlerMap = new Map(); tableHandlers.forEach((handler) => { const tableName = handler.tableClass.metadata.name; if (this.tableHandlerMap.has(tableName)) { throw new Error(`You can't put more than one handler for given table: ${tableName}`); } this.tableHandlerMap.set(tableName, handler); }); } get handler() { return async (event) => { if (event.Records.length > 0) { // Even though each records has own eventSourceARN, // one event only has one eventSoruceARN. // Thus, select "one" event source arn. const sourceARN = event.Records[0].eventSourceARN; logger("handler: sourceARN - %s", sourceARN); const streamMetadata = parseDynamoDBStreamARN(sourceARN); if (!streamMetadata) { throw new Error(`Invalid Source Arn : ${sourceARN}`); } const handler = this.tableHandlerMap.get(streamMetadata.tableName); if (handler) { logger("handler: start table handler: %s", streamMetadata.tableName); await handler.handler(event); } else { logger("handler: sourceARN - %s, There is no table handler for arn", sourceARN); } } }; } get lambdaHandler() { return async (event, context) => { context.callbackWaitsForEmptyEventLoop = false; return await this.handler(event); }; } } exports.StreamHandler = StreamHandler; /** * * @param arn * @returns - null means invalid arn */ // arn:aws:dynamodb:us-east-1:921281748045:table/qna_production_questions/stream/2017-12-22T02:02:25.496 function parseDynamoDBStreamARN(arn) { const arnRegex = /arn:aws:dynamodb:(\w+-\w+-\d):(\d+):table\/(\w+)\/stream\/(\S+)/; const match = arn.match(arnRegex); if (match && match.length === 5) { return { region: match[1], awsAccountId: match[2], tableName: match[3], }; } else { return null; } } exports.parseDynamoDBStreamARN = parseDynamoDBStreamARN; //# sourceMappingURL=stream_handler.js.map