UNPKG

@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
"use strict"; 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;