import { Injectable } from '@nestjs/common'; @Injectable() export class WhatsappDebounceService { private pendingMessages: Map< string, { timer: NodeJS.Timeout; texts: string[]; } > = new Map(); private readonly DEBOUNCE_MS = 3000; /** * Agrega un mensaje al buffer del usuario. * @param userId Identificador único del usuario (ej. JID) * @param messageText Texto del mensaje * @param callback Función a ejecutar cuando se complete el debounce (recibe el texto combinado) */ async add( userId: string, messageText: string, callback: (combinedMessage: string) => Promise, ): Promise { if (this.pendingMessages.has(userId)) { const pending = this.pendingMessages.get(userId)!; clearTimeout(pending.timer); pending.texts.push(messageText); pending.timer = setTimeout(async () => { await this.flush(userId, callback); }, this.DEBOUNCE_MS); } else { this.pendingMessages.set(userId, { timer: setTimeout(async () => { await this.flush(userId, callback); }, this.DEBOUNCE_MS), texts: [messageText], }); } } private async flush( userId: string, callback: (combinedMessage: string) => Promise, ): Promise { const pending = this.pendingMessages.get(userId); if (!pending) return; this.pendingMessages.delete(userId); const combinedMessage = pending.texts.join(' '); await callback(combinedMessage); } }