UNPKG

nodejs-event-driven

Version:

NodeJS agnostic event driven with EventEmitter support

87 lines 3.37 kB
import { BaseEventBusService } from '../../../base-event-bus.service.js'; export default class RedisEventBusService extends BaseEventBusService { static DEFAULT_KEY_PREFIX = 'events'; #logger; #redisPublisher = null; #redisSubscriber = null; #keyPrefix; #redisConfig; constructor(config) { super(); this.#logger = config.logger; this.#keyPrefix = config.keyPrefix ?? RedisEventBusService.DEFAULT_KEY_PREFIX; this.#redisConfig = { ...config, keyPrefix: this.#keyPrefix }; } #createRedisListener(eventName, listener, once = false) { return (message) => { if (once) { this.off(eventName); } const data = JSON.parse(message); listener(data); }; } on(eventName, listener) { const redisSubscriber = this.#redisSubscriber; if (!redisSubscriber) { return; } const channel = `${this.#keyPrefix}:${eventName}`; this.#logger?.debug(`register listener for channel: ${channel}`); const redisListener = this.#createRedisListener(eventName, listener); void redisSubscriber.subscribe(channel, redisListener); } once(eventName, listener) { const redisSubscriber = this.#redisSubscriber; if (!redisSubscriber) { return; } const channel = `${this.#keyPrefix}:${eventName}`; this.#logger?.debug(`register once listener for channel: ${channel}`); const redisListener = this.#createRedisListener(eventName, listener, true); void redisSubscriber.subscribe(channel, redisListener); } off(eventName) { const redisSubscriber = this.#redisSubscriber; if (!redisSubscriber) { return; } const channel = `${this.#keyPrefix}:${eventName}`; this.#logger?.debug(`unregister listener for channel: ${channel}`); void redisSubscriber.unsubscribe(channel); } send(eventName, data) { const redisPublisher = this.#redisPublisher; if (!redisPublisher) { return; } const channel = `${this.#keyPrefix}:${eventName}`; this.#logger?.debug(`sending ${String(data)} to channel ${channel}`); void redisPublisher.publish(channel, JSON.stringify(data)); } sendAndWait(sendEventName, successEventName, errorEventName, data) { this.#logger?.debug(`sending event ${sendEventName} and waiting for event ${successEventName}…`); return super.sendAndWait(sendEventName, successEventName, errorEventName, data); } async start() { const { createClient } = await import('redis'); this.#redisPublisher = createClient(this.#redisConfig); this.#redisSubscriber = createClient(this.#redisConfig); await this.#redisPublisher.connect(); await this.#redisSubscriber.connect(); } async stop() { const redisPublisher = this.#redisPublisher; if (redisPublisher) { await redisPublisher.quit(); this.#redisPublisher = null; } const redisSubscriber = this.#redisSubscriber; if (redisSubscriber) { await redisSubscriber.quit(); this.#redisSubscriber = null; } } } //# sourceMappingURL=redis-event-bus.service.js.map