@cap-js-community/event-queue
Version:
An event queue that enables secure transactional processing of asynchronous and periodic events, featuring instant event processing with Redis Pub/Sub and load distribution across all application instances.
61 lines (52 loc) • 1.87 kB
JavaScript
;
const cds = require("@sap/cds");
const redisPub = require("./redis/redisPub");
const config = require("./config");
const COMPONENT_NAME = "/eventQueue/dbHandler";
const registeredHandlers = {
eventQueueDbHandler: false,
beforeDbHandler: false,
};
const registerEventQueueDbHandler = (dbService) => {
if (registeredHandlers.eventQueueDbHandler) {
return;
}
registeredHandlers.eventQueueDbHandler = true;
const def = dbService.model.definitions[config.tableNameEventQueue];
dbService.after("CREATE", def, (_, req) => {
if (req.tx._skipEventQueueBroadcase) {
return;
}
req.tx._ = req.tx._ ?? {};
req.tx._.eventQueuePublishEvents = req.tx._.eventQueuePublishEvents ?? {};
const eventQueuePublishEvents = req.tx._.eventQueuePublishEvents;
const data = Array.isArray(req.query.INSERT.entries) ? req.query.INSERT.entries : [req.query.INSERT.entries];
const eventCombinations = Object.keys(
data.reduce((result, event) => {
const key = [event.type, event.subType].join("##");
if (!config.hasEventAfterCommitFlag(event.type, event.subType) || eventQueuePublishEvents[key]) {
return result;
}
eventQueuePublishEvents[key] = true;
result[key] = true;
return result;
}, {})
);
eventCombinations.length &&
req.on("succeeded", () => {
const events = eventCombinations.map((eventCombination) => {
const [type, subType] = eventCombination.split("##");
return { type, subType };
});
redisPub.broadcastEvent(req.tenant, events).catch((err) => {
cds.log(COMPONENT_NAME).error("db handler failure during broadcasting event", err, {
tenant: req.tenant,
events,
});
});
});
});
};
module.exports = {
registerEventQueueDbHandler,
};