nodejs-event-driven
Version:
NodeJS agnostic event driven with EventEmitter support
87 lines • 3.37 kB
JavaScript
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