UNPKG

alepha

Version:

Easy-to-use modern TypeScript framework for building many kind of applications.

84 lines (83 loc) 2.54 kB
import { $atom, $hook, $inject, $module, $state, Alepha, z } from "alepha"; import { AlephaTopic, TopicProvider } from "alepha/topic"; import { $logger } from "alepha/logger"; import { RedisProvider, RedisSubscriberProvider } from "alepha/redis"; //#region ../../src/topic/redis/providers/RedisTopicProvider.ts /** * Redis topic configuration atom. */ const redisTopicOptions = $atom({ name: "alepha.topic.redis.options", schema: z.object({ prefix: z.text({ default: "topic", description: "Prefix for all topic channels in Redis." }) }), default: { prefix: "topic" } }); var RedisTopicProvider = class extends TopicProvider { options = $state(redisTopicOptions); alepha = $inject(Alepha); redisProvider = $inject(RedisProvider); redisSubscriberProvider = $inject(RedisSubscriberProvider); log = $logger(); start = $hook({ on: "start", handler: async () => { const subscribers = this.subscribers(); if (subscribers.length) { await Promise.all(subscribers.map((fn) => fn())); for (const subscriber of subscribers) this.log.debug(`Subscribed to topic '${subscriber.name}'`); } } }); wildcardChar() { return "*"; } prefix(queue) { return `${this.options.prefix}:${queue}`; } /** * Publish a message to a topic. */ async publish(topic, message, options) { if (options?.retain) await this.redisProvider.set(`${this.prefix(topic)}:retained`, message); await this.redisProvider.publish(this.prefix(topic), message); } /** * Subscribe to a topic. */ async subscribe(name, callback, _options) { const topic = this.prefix(name); await this.redisSubscriberProvider.subscribe(topic, callback); const retained = await this.redisProvider.get(`${topic}:retained`); if (retained) await callback(retained.toString()); return () => this.unsubscribe(name, callback); } /** * Unsubscribe from a topic. */ async unsubscribe(name, callback) { const topic = this.prefix(name); await this.redisSubscriberProvider.unsubscribe(topic, callback); } }; //#endregion //#region ../../src/topic/redis/index.ts /** * Plugin for Alepha Topic that provides Redis pub/sub capabilities. * * @see {@link RedisTopicProvider} * @module alepha.topic.redis */ const AlephaTopicRedis = $module({ name: "alepha.topic.redis", services: [RedisTopicProvider], register: (alepha) => alepha.with({ optional: true, provide: TopicProvider, use: RedisTopicProvider }).with(AlephaTopic) }); //#endregion export { AlephaTopicRedis, RedisTopicProvider, redisTopicOptions }; //# sourceMappingURL=index.js.map