whatsapp-crm-common
Version:
Componentes compartidos para servicios de WhatsApp CRM - Common utilities and types for WhatsApp CRM system
260 lines • 9 kB
JavaScript
;
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