@jbagatta/johnny-cache
Version:
A robust distributed dictionary for coordinating and caching expensive operations in a distributed environment
68 lines (67 loc) • 2.49 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createRedisMessageBroker = exports.RedisMessageBroker = void 0;
const ioredis_1 = require("ioredis");
const message_broker_1 = require("../../ports/message-broker");
const buildSignalPrefix = 'jc-builds';
const keyDeletePrefix = 'jc-events';
class RedisMessageBroker {
constructor(client) {
this.client = client;
}
async waitForSignal(signalId, timeoutMs) {
const subject = `${buildSignalPrefix}-${signalId}`;
const results = await this.client.duplicate()
.xread("COUNT", 1, "BLOCK", timeoutMs, "STREAMS", subject, '$');
if (!results) {
return {
signalId: signalId,
result: message_broker_1.BuildResult.TIMEOUT
};
}
const [_, messages] = results[0];
return JSON.parse(messages[0][1][1]);
}
async publishSignal(signal) {
const subject = `${buildSignalPrefix}-${signal.signalId}`;
await this.client.multi()
.xadd(subject, '*', 'signal', JSON.stringify(signal))
.expire(subject, 5)
.exec();
}
async publishKeyDeleted(namespace, key) {
const subject = `${keyDeletePrefix}-${namespace}`;
await this.client.publish(subject, key);
}
async onKeyDeleted(namespace, handle) {
await this.client.duplicate().subscribe(`${keyDeletePrefix}-${namespace}`, (err, key) => {
const keyToDelete = key;
if (keyToDelete) {
handle(keyToDelete);
}
});
}
async close() {
this.client.disconnect();
}
}
exports.RedisMessageBroker = RedisMessageBroker;
function createRedisMessageBroker(redisConnectionOptions) {
let redisClient;
if (redisConnectionOptions.sentinel) {
redisClient = new ioredis_1.Redis({
sentinels: [{ host: redisConnectionOptions.sentinel.host, port: redisConnectionOptions.sentinel.port }],
name: redisConnectionOptions.sentinel.primaryName,
password: redisConnectionOptions.password,
sentinelPassword: redisConnectionOptions.password
});
}
else {
redisClient = new ioredis_1.Redis({
path: redisConnectionOptions.url,
password: redisConnectionOptions.password
});
}
return new RedisMessageBroker(redisClient);
}
exports.createRedisMessageBroker = createRedisMessageBroker;