UNPKG

whatsapp-crm-common

Version:

Componentes compartidos para servicios de WhatsApp CRM - Common utilities and types for WhatsApp CRM system

226 lines 7.68 kB
"use strict"; 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