alepha
Version:
Easy-to-use modern TypeScript framework for building many kind of applications.
84 lines (83 loc) • 2.54 kB
JavaScript
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