whatsapp-crm-common
Version:
Componentes compartidos para servicios de WhatsApp CRM - Common utilities and types for WhatsApp CRM system
226 lines • 7.68 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.defaultRedisConfig = exports.RedisClient = void 0;
exports.createRedisConfigFromGlobal = createRedisConfigFromGlobal;
const ioredis_1 = __importDefault(require("ioredis"));
const logger_1 = __importDefault(require("../utils/logger"));
const environment_1 = require("./environment");
/**
* Cliente Redis singleton
*/
class RedisClient {
constructor(config) {
// Obtener configuración mezclada (externa + env + defaults)
const globalConfig = (0, environment_1.getConfig)();
// Combinar configuración pasada como parámetro con configuración global
const finalConfig = {
url: config?.url || globalConfig.redis.url,
host: config?.host || globalConfig.redis.host,
port: config?.port || globalConfig.redis.port,
password: config?.password || globalConfig.redis.password,
db: config?.db || globalConfig.redis.db,
options: {
...config?.options,
maxRetriesPerRequest: null, // BullMQ requires this to be null
connectTimeout: config?.options?.connectTimeout || 10000,
commandTimeout: config?.options?.commandTimeout || 30000, // Aumentar timeout a 30s
keyPrefix: config?.options?.keyPrefix || "whatsapp:",
}
};
this.config = finalConfig;
// Crear Redis instance usando URL o host/port
const redisOptions = {
maxRetriesPerRequest: null, // BullMQ requires this to be null
connectTimeout: finalConfig.options?.connectTimeout || 10000,
commandTimeout: finalConfig.options?.commandTimeout || 30000, // Aumentar timeout a 30s
keyPrefix: finalConfig.options?.keyPrefix || "whatsapp:",
enableReadyCheck: false,
lazyConnect: true,
password: finalConfig.password || undefined,
db: finalConfig.db || 0,
};
if (finalConfig.url) {
this.redis = new ioredis_1.default(finalConfig.url, redisOptions);
}
else {
this.redis = new ioredis_1.default({
host: finalConfig.host,
port: finalConfig.port,
...redisOptions
});
}
this.setupEventListeners();
}
/**
* Obtiene la instancia singleton del cliente Redis
*/
static getInstance(config) {
if (!RedisClient.instance) {
RedisClient.instance = new RedisClient(config);
}
return RedisClient.instance;
}
/**
* Obtiene el cliente Redis
*/
getClient() {
return this.redis;
}
/**
* Crea una conexión Redis específica para BullMQ (sin keyPrefix)
*/
createBullMQConnection() {
const redisOptions = {
maxRetriesPerRequest: null, // BullMQ requires this to be null
connectTimeout: this.config.options?.connectTimeout || 10000,
commandTimeout: this.config.options?.commandTimeout || 30000, // Aumentar timeout a 30s
// No incluir keyPrefix para BullMQ
enableReadyCheck: false,
lazyConnect: true,
password: this.config.password || undefined,
db: this.config.db || 0,
};
if (this.config.url) {
return new ioredis_1.default(this.config.url, redisOptions);
}
else {
return new ioredis_1.default({
host: this.config.host || 'localhost',
port: this.config.port || 6379,
...redisOptions
});
}
}
/**
* Conecta al servidor Redis
*/
async connect() {
try {
await this.redis.connect();
logger_1.default.info("Redis client connected successfully");
}
catch (error) {
logger_1.default.error("Failed to connect to Redis:", error);
throw error;
}
}
/**
* Desconecta del servidor Redis
*/
async disconnect() {
try {
await this.redis.disconnect();
logger_1.default.info("Redis client disconnected");
}
catch (error) {
logger_1.default.error("Error disconnecting from Redis:", error);
throw error;
}
}
/**
* Verifica si la conexión está activa
*/
isConnected() {
return this.redis.status === "ready";
}
/**
* Obtiene información del servidor Redis
*/
async getInfo() {
try {
const info = await this.redis.info();
return this.parseRedisInfo(info);
}
catch (error) {
logger_1.default.error("Error getting Redis info:", error);
throw error;
}
}
/**
* Configura los event listeners para el cliente Redis
*/
setupEventListeners() {
this.redis.on("connect", () => {
logger_1.default.info("Redis client connecting...");
});
this.redis.on("ready", () => {
logger_1.default.info("Redis client ready");
});
this.redis.on("error", (error) => {
logger_1.default.error("Redis client error:", error);
});
this.redis.on("close", () => {
logger_1.default.warn("Redis connection closed");
});
this.redis.on("reconnecting", (delay) => {
logger_1.default.info(`Redis client reconnecting in ${delay}ms`);
});
this.redis.on("end", () => {
logger_1.default.warn("Redis connection ended");
});
}
/**
* Parsea la información del servidor Redis
*/
parseRedisInfo(info) {
const lines = info.split("\r\n");
const result = {};
let currentSection = "";
for (const line of lines) {
if (line.startsWith("#")) {
currentSection = line.substring(2).toLowerCase();
result[currentSection] = {};
}
else if (line.includes(":")) {
const [key, value] = line.split(":");
if (currentSection) {
result[currentSection][key] = value;
}
else {
result[key] = value;
}
}
}
return result;
}
}
exports.RedisClient = RedisClient;
/**
* Configuración por defecto de Redis
*/
exports.defaultRedisConfig = {
url: "redis://localhost:6379",
host: "localhost",
port: 6379,
password: "",
db: 0,
options: {
maxRetriesPerRequest: null, // BullMQ requires this to be null
connectTimeout: 10000,
commandTimeout: 30000, // Aumentar timeout a 30s
keyPrefix: "whatsapp:",
},
};
/**
* Función helper para crear configuración Redis desde configuración global
*/
function createRedisConfigFromGlobal() {
const globalConfig = (0, environment_1.getConfig)();
return {
url: globalConfig.redis.url,
host: globalConfig.redis.host,
port: globalConfig.redis.port,
password: globalConfig.redis.password,
db: globalConfig.redis.db,
options: {
maxRetriesPerRequest: null, // BullMQ requires this to be null
connectTimeout: 10000,
commandTimeout: 30000, // Aumentar timeout a 30s
keyPrefix: "whatsapp:",
},
};
}
//# sourceMappingURL=redis-config.js.map