@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
JavaScript
;
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;