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.

63 lines 2.59 kB
/** * @module EventBus */ import { EventEmitter } from "node:events"; import {} from "ioredis"; import {} from "../../../../event-bus/contracts/_module.js"; import {} from "../../../../serde/contracts/_module.js"; import { // eslint-disable-next-line @typescript-eslint/no-unused-vars SuperJsonSerdeAdapter, } from "../../../../serde/implementations/adapters/_module.js"; /** * To utilize the `RedisPubSubEventBusAdapter`, you must install the [`"ioredis"`](https://www.npmjs.com/package/ioredis) package and supply a {@link ISerde | `ISerde<string>`}, with a {@link SuperJsonSerdeAdapter | `SuperJsonSerdeAdapter `}. * * IMPORT_PATH: `"@daiso-tech/core/event-bus/redis-pub-sub-event-bus-adapter"` * @group Adapters */ export class RedisPubSubEventBusAdapter { serde; dispatcherClient; listenerClient; eventEmitter = new EventEmitter(); /** * @example * ```ts * import { RedisPubSubEventBusAdapter } from "@daiso-tech/core/event-bus/redis-pub-sub-event-bus-adapter"; * import { Serde } from "@daiso-tech/core/serde"; * import { SuperJsonSerdeAdapter } from "@daiso-tech/core/serde/super-json-serde-adapter" * import Redis from "ioredis"; * * const client = new Redis("YOUR_REDIS_CONNECTION_STRING"); * const serde = new Serde(new SuperJsonSerdeAdapter()); * const eventBusAdapter = new RedisPubSubEventBusAdapter({ * client, * serde, * }); * ``` */ constructor(settings) { const { client, serde } = settings; this.dispatcherClient = client; this.listenerClient = client.duplicate(); this.serde = 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