@serverless-seoul/dynamorm-stream
Version:
DynamoDB Stream Framework
69 lines • 2.64 kB
JavaScript
;
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