@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.
46 lines (38 loc) • 1.52 kB
JavaScript
;
const cds = require("@sap/cds");
const client = require("./client");
const config = require("../../config");
const COMPONENT_NAME = "/eventQueue/redis";
const REDIS_OFFBOARD_TENANT_CHANNEL = "REDIS_OFFBOARD_TENANT_CHANNEL";
const attachRedisUnsubscribeHandler = () => {
cds.log(COMPONENT_NAME).info("attached redis handle for unsubscribe events");
client
.subscribeRedisChannel(REDIS_OFFBOARD_TENANT_CHANNEL, (messageData) => {
try {
const { tenantId } = JSON.parse(messageData);
cds.log(COMPONENT_NAME).info("received unsubscribe broadcast event", { tenantId });
config.executeUnsubscribeHandlers(tenantId);
} catch (err) {
cds.log(COMPONENT_NAME).error("could not parse unsubscribe broadcast event", err, {
messageData,
});
}
})
.catch((err) => _errorHandlerSubscribeChannel(REDIS_OFFBOARD_TENANT_CHANNEL, err));
};
const handleUnsubscribe = (tenantId) => {
if (config.redisEnabled) {
client.publishMessage(REDIS_OFFBOARD_TENANT_CHANNEL, JSON.stringify({ tenantId })).catch((error) => {
cds.log(COMPONENT_NAME).error(`publishing tenant unsubscribe failed. tenantId: ${tenantId}`, error);
});
} else {
config.executeUnsubscribeHandlers(tenantId);
}
};
const _errorHandlerSubscribeChannel = (channelName, err) =>
cds.log(COMPONENT_NAME).error("error subscribing to channel", err, { channelName });
module.exports = {
...client,
attachRedisUnsubscribeHandler,
handleUnsubscribe,
};