UNPKG

@jbagatta/johnny-cache

Version:

A robust distributed dictionary for coordinating and caching expensive operations in a distributed environment

84 lines (83 loc) 3.35 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createJetstreamMessageBroker = exports.NatsConnectionOptions = exports.JetstreamMessageBroker = void 0; const nats_1 = require("nats"); const message_broker_1 = require("../../ports/message-broker"); const buildSignalPrefix = 'jc.builds'; const keyDeletePrefix = 'jc.events'; class JetstreamMessageBroker { constructor(client, stream) { this.client = client; this.stream = stream; } async waitForSignal(signalId, timeoutMs) { const jsm = await this.client.jetstreamManager(); const consumer = await jsm.consumers.add(this.stream, { filter_subject: `${buildSignalPrefix}.${signalId}`, deliver_policy: nats_1.DeliverPolicy.Last, replay_policy: nats_1.ReplayPolicy.Instant, ack_policy: nats_1.AckPolicy.Explicit, inactive_threshold: (0, nats_1.nanos)(1000 * 60) }); let msg; try { msg = await this.client.jetstream().pull(this.stream, consumer.name, timeoutMs); msg.ack(); } catch { return { signalId: signalId, result: message_broker_1.BuildResult.TIMEOUT }; } return JSON.parse((0, nats_1.StringCodec)().decode(msg.data)); } async publishSignal(signal) { const subject = `${buildSignalPrefix}.${signal.signalId}`; await this.client.jetstream().publish(subject, (0, nats_1.StringCodec)().encode(JSON.stringify(signal))); } async publishKeyDeleted(namespace, key) { const subject = `${keyDeletePrefix}.${namespace}.${key}`; this.client.publish(subject, (0, nats_1.StringCodec)().encode(key)); } async onKeyDeleted(namespace, handle) { this.client.subscribe(`${keyDeletePrefix}.${namespace}`, { callback: (err, msg) => { if (!msg) { return; } const key = (0, nats_1.StringCodec)().decode(msg.data); handle(key); }, }); } async close() { await this.client.close(); } } exports.JetstreamMessageBroker = JetstreamMessageBroker; class NatsConnectionOptions { } exports.NatsConnectionOptions = NatsConnectionOptions; async function createJetstreamMessageBroker(natsConnectionOptions) { const natsClient = await (0, nats_1.connect)({ servers: natsConnectionOptions.urls, token: natsConnectionOptions.token, user: natsConnectionOptions.userPass?.user, pass: natsConnectionOptions.userPass?.pass }); const jsm = await natsClient.jetstreamManager(); const existingStream = (await jsm.streams.names().next()).find((s) => s === natsConnectionOptions.stream); if (!existingStream) { await jsm.streams.add({ name: natsConnectionOptions.stream, retention: nats_1.RetentionPolicy.Limits, storage: nats_1.StorageType.Memory, discard: nats_1.DiscardPolicy.Old, max_age: (0, nats_1.nanos)(30 * 1000), subjects: ["jc.builds.*", "jc.events.*"] }); } return new JetstreamMessageBroker(natsClient, natsConnectionOptions.stream); } exports.createJetstreamMessageBroker = createJetstreamMessageBroker;