UNPKG

@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
"use strict"; 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, };