@serverless-seoul/dynamorm-stream
Version:
DynamoDB Stream Framework
94 lines • 3.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.TableHandler = void 0;
const handler_1 = require("./handler");
class TableHandler {
constructor(tableClass, strategy = "Series", handlers, catchError) {
this.tableClass = tableClass;
this.strategy = strategy;
this.handlers = handlers;
this.catchError = catchError;
}
get handler() {
return async (event) => {
const records = handler_1.parseEvent(this.tableClass, event);
switch (this.strategy) {
case "Series":
for (const handler of this.handlers) {
try {
await executeHandler(handler, records);
}
catch (error) {
this.catchError(handler, records, error);
}
}
break;
case "Map":
await Promise.all(this.handlers.map(async (handler) => {
try {
await executeHandler(handler, records);
}
catch (error) {
this.catchError(handler, records, error);
}
}));
break;
}
};
}
}
exports.TableHandler = TableHandler;
async function executeHandler(handlerDefinition, records) {
const { handler, filteredRecords } = (() => {
switch (handlerDefinition.eventType) {
case "INSERT":
return {
handler: handlerDefinition.handler,
filteredRecords: valueFilter(records.map((record) => record.type === "INSERT" ? record : null)),
};
case "MODIFY":
return {
handler: handlerDefinition.handler,
filteredRecords: valueFilter(records.map((record) => record.type === "MODIFY" ? record : null)),
};
case "REMOVE":
return {
handler: handlerDefinition.handler,
filteredRecords: valueFilter(records.map((record) => record.type === "REMOVE" ? record : null)),
};
case "INSERT, MODIFY":
return {
handler: handlerDefinition.handler,
filteredRecords: valueFilter(records.map((record) => record.type === "INSERT" || record.type === "MODIFY" ? record : null)),
};
case "MODIFY, REMOVE":
return {
handler: handlerDefinition.handler,
filteredRecords: valueFilter(records.map((record) => record.type === "MODIFY" || record.type === "REMOVE" ? record : null)),
};
case "INSERT, REMOVE":
return {
handler: handlerDefinition.handler,
filteredRecords: valueFilter(records.map((record) => record.type === "INSERT" || record.type === "REMOVE" ? record : null)),
};
case "ALL":
return {
handler: handlerDefinition.handler,
filteredRecords: valueFilter(records),
};
}
})();
if (filteredRecords.length > 0) {
await handler(filteredRecords);
}
}
function valueFilter(array) {
const res = [];
array.forEach((item) => {
if (item !== undefined && item !== null) {
res.push(item);
}
});
return res;
}
//# sourceMappingURL=table_handler.js.map