UNPKG

@daiso-tech/core

Version:

The library offers flexible, framework-agnostic solutions for modern web applications, built on adaptable components that integrate seamlessly with popular frameworks like Next Js.

62 lines 2.56 kB
/** * @module EventBus */ import {} from "../../../../serde/contracts/_module-exports.js"; import { RedisSerde, // eslint-disable-next-line @typescript-eslint/no-unused-vars SuperJsonSerdeAdapter, } from "../../../../serde/implementations/adapters/_module-exports.js"; import { EventEmitter } from "node:events"; /** * To utilize the `RedisPubSubEventBusAdapter`, you must install the `"ioredis"` package and supply a {@link ISerde | `ISerde<string>`}, with a {@link SuperJsonSerdeAdapter | `SuperJsonSerdeAdapter `}. * * IMPORT_PATH: `"@daiso-tech/core/event-bus/adapters"` * @group Adapters */ export class RedisPubSubEventBusAdapter { serde; dispatcherClient; listenerClient; eventEmitter = new EventEmitter(); /** * @example * ```ts * import { RedisPubSubEventBusAdapter } from "@daiso-tech/core/event-bus/adapters"; * import { Serde } from "@daiso-tech/core/serde"; * import { SuperJsonSerdeAdapter } from "@daiso-tech/core/serde/adapters" * import Redis from "ioredis"; * * const dispatcherClient = new Redis("YOUR_REDIS_CONNECTION_STRING"); * const listenerClient = new Redis("YOUR_REDIS_CONNECTION_STRING"); * const serde = new Serde(new SuperJsonSerdeAdapter()); * const eventBusAdapter = new RedisPubSubEventBusAdapter({ * dispatcherClient, * listenerClient, * serde, * }); * ``` */ constructor({ dispatcherClient, listenerClient, serde, }) { this.dispatcherClient = dispatcherClient; this.listenerClient = listenerClient; this.serde = new RedisSerde(serde); } redisListener = (channel, message) => { this.eventEmitter.emit(channel, this.serde.deserialize(message)); }; async addListener(eventName, listener) { // eslint-disable-next-line @typescript-eslint/no-misused-promises this.eventEmitter.on(eventName, listener); await this.listenerClient.subscribe(eventName); // eslint-disable-next-line @typescript-eslint/no-misused-promises this.listenerClient.on("message", this.redisListener); } async removeListener(eventName, listener) { // eslint-disable-next-line @typescript-eslint/no-misused-promises this.eventEmitter.off(eventName, listener); await this.listenerClient.unsubscribe(eventName); } async dispatch(eventName, eventData) { await this.dispatcherClient.publish(eventName, this.serde.serialize(eventData)); } } //# sourceMappingURL=redis-pub-sub-event-bus-adapter.js.map