UNPKG

whatsapp-crm-common

Version:

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

260 lines 9 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.EventPublisher = void 0; const event_types_1 = require("../types/event-types"); const logger_1 = __importDefault(require("../../utils/logger")); /** * Publisher principal para eventos de WhatsApp */ class EventPublisher { constructor(messageQueue) { this.messageQueue = messageQueue; } /** * Publica un evento en la cola correspondiente */ async publishEvent(event, queueName) { try { await this.messageQueue.publishEvent(event, queueName); logger_1.default.debug({ eventType: event.eventType, tenantId: event.tenantId, agentId: event.agentId, queue: queueName || "auto", msg: "Event published successfully", }); } catch (error) { logger_1.default.error({ eventType: event.eventType, tenantId: event.tenantId, agentId: event.agentId, error: error instanceof Error ? error.message : String(error), msg: "Failed to publish event", }); throw error; } } /** * Publica múltiples eventos en batch */ async publishBatch(events, queueName) { try { await this.messageQueue.publishBatch(events, queueName); logger_1.default.info({ eventCount: events.length, queue: queueName || "auto", msg: "Events batch published successfully", }); } catch (error) { logger_1.default.error({ eventCount: events.length, error: error instanceof Error ? error.message : String(error), msg: "Failed to publish events batch", }); throw error; } } /** * Publica evento de mensajes nuevos recibidos */ async publishMessageReceived(tenantId, agentId, messages) { const event = { tenantId, agentId, eventType: event_types_1.WhatsAppEventType.MESSAGE_NEW, data: { messages }, sessionKey: this.getSessionKey(tenantId, agentId), timestamp: Date.now(), priority: event_types_1.EventPriority.HIGH, }; await this.publishEvent(event, event_types_1.QueueName.REALTIME); logger_1.default.info({ tenantId, agentId, messageCount: messages.length, msg: "New messages published to queue", }); } /** * Publica evento de actualización de mensajes */ async publishMessageUpdates(tenantId, agentId, updates) { const event = { tenantId, agentId, eventType: event_types_1.WhatsAppEventType.MESSAGE_UPDATE, data: { updates }, sessionKey: this.getSessionKey(tenantId, agentId), timestamp: Date.now(), priority: event_types_1.EventPriority.MEDIUM, }; await this.publishEvent(event, event_types_1.QueueName.REALTIME); logger_1.default.debug({ tenantId, agentId, updateCount: updates.length, msg: "Message updates published to queue", }); } /** * Publica evento de sincronización de historial */ async publishHistorySync(tenantId, agentId, historyData, isPartial = false) { const event = { tenantId, agentId, eventType: isPartial ? event_types_1.WhatsAppEventType.HISTORY_PARTIAL : event_types_1.WhatsAppEventType.HISTORY_SYNC, data: historyData, sessionKey: this.getSessionKey(tenantId, agentId), timestamp: Date.now(), priority: event_types_1.EventPriority.BULK, }; await this.publishEvent(event, event_types_1.QueueName.BULK); logger_1.default.info({ tenantId, agentId, isPartial, chatCount: historyData.chats?.length || 0, messageCount: historyData.messages?.length || 0, contactCount: historyData.contacts?.length || 0, msg: "History sync published to queue", }); } /** * Publica evento de estado de conexión */ async publishConnectionStatus(tenantId, agentId, connected, reason, qrCode) { const event = { tenantId, agentId, eventType: event_types_1.WhatsAppEventType.CONNECTION_STATUS, data: { connected, reason, qrCode, }, sessionKey: this.getSessionKey(tenantId, agentId), timestamp: Date.now(), priority: event_types_1.EventPriority.CRITICAL, }; await this.publishEvent(event, event_types_1.QueueName.REALTIME); logger_1.default.info({ tenantId, agentId, connected, reason, hasQrCode: !!qrCode, msg: "Connection status published to queue", }); } /** * Publica evento de código QR generado */ async publishQRCodeGenerated(tenantId, agentId, qrCode) { const event = { tenantId, agentId, eventType: event_types_1.WhatsAppEventType.QR_CODE_GENERATED, data: { qrCode, timestamp: Date.now(), }, sessionKey: this.getSessionKey(tenantId, agentId), timestamp: Date.now(), priority: event_types_1.EventPriority.CRITICAL, }; await this.publishEvent(event, event_types_1.QueueName.REALTIME); logger_1.default.info({ tenantId, agentId, msg: "QR code generation published to queue", }); } /** * Publica evento de notificación webhook */ async publishWebhookNotification(tenantId, agentId, webhookUrl, payload, retryCount = 0) { const event = { tenantId, agentId, eventType: event_types_1.WhatsAppEventType.WEBHOOK_NOTIFICATION, data: { webhookUrl, payload, retryCount, }, sessionKey: this.getSessionKey(tenantId, agentId), timestamp: Date.now(), priority: event_types_1.EventPriority.MEDIUM, }; await this.publishEvent(event, event_types_1.QueueName.WEBHOOK); logger_1.default.debug({ tenantId, agentId, webhookUrl: webhookUrl.substring(0, 50) + "...", retryCount, msg: "Webhook notification published to queue", }); } /** * Publica evento de actualización de contactos */ async publishContactUpdate(tenantId, agentId, contacts, action = "update") { const event = { tenantId, agentId, eventType: event_types_1.WhatsAppEventType.CONTACT_UPDATE, data: { contacts, action, }, sessionKey: this.getSessionKey(tenantId, agentId), timestamp: Date.now(), priority: event_types_1.EventPriority.LOW, }; await this.publishEvent(event, event_types_1.QueueName.NOTIFICATIONS); logger_1.default.debug({ tenantId, agentId, contactCount: contacts.length, action, msg: "Contact update published to queue", }); } /** * Publica múltiples eventos de mensajes nuevos en batch */ async publishMessageBatch(events) { const whatsappEvents = events.map((eventData) => ({ tenantId: eventData.tenantId, agentId: eventData.agentId, eventType: event_types_1.WhatsAppEventType.MESSAGE_NEW, data: { messages: eventData.messages }, sessionKey: this.getSessionKey(eventData.tenantId, eventData.agentId), timestamp: Date.now(), priority: event_types_1.EventPriority.HIGH, })); await this.publishBatch(whatsappEvents, event_types_1.QueueName.REALTIME); const totalMessages = events.reduce((sum, event) => sum + event.messages.length, 0); logger_1.default.info({ batchSize: events.length, totalMessages, msg: "Message batch published to queue", }); } /** * Genera clave de sesión única */ getSessionKey(tenantId, agentId) { return `${tenantId}_${agentId}`; } } exports.EventPublisher = EventPublisher; //# sourceMappingURL=event-publisher.js.map