Files
whatsappNucleo/server/api/events/stream.get.ts
josedario87 32f66c8fe0
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 1m9s
Fix: fetchMessageHistory con evento SSE y logs de debug
- Agregar logs detallados en /api/debug/history/fetch para diagnosticar
- Emitir evento SSE 'history.synced' cuando llegan mensajes del historial
- Frontend ahora escucha el evento SSE en vez de timeout fijo de 3 segundos
- Agregar script y documentación para referencia de Baileys message history
2025-12-04 12:33:22 -06:00

76 lines
2.3 KiB
TypeScript

/**
* GET /api/events/stream
* Server-Sent Events endpoint for real-time updates
*/
import { baileysManager } from '../../services/baileys/manager'
export default defineEventHandler(async (event) => {
const username = getHeader(event, 'x-authentik-username')
if (!username) {
throw createError({ statusCode: 401, message: 'Unauthorized' })
}
// Set SSE headers
setHeader(event, 'Content-Type', 'text/event-stream')
setHeader(event, 'Cache-Control', 'no-cache')
setHeader(event, 'Connection', 'keep-alive')
// Get the raw response
const res = event.node.res
// Send initial connection message
res.write(`data: ${JSON.stringify({ type: 'connected', timestamp: Date.now() })}\n\n`)
// Event handlers
const handlers = {
'instance.status': (data: any) => {
res.write(`event: instance.status\ndata: ${JSON.stringify(data)}\n\n`)
},
'instance.qr': (data: any) => {
res.write(`event: instance.qr\ndata: ${JSON.stringify(data)}\n\n`)
},
'instance.pairing': (data: any) => {
res.write(`event: instance.pairing\ndata: ${JSON.stringify(data)}\n\n`)
},
'message.received': (data: any) => {
res.write(`event: message.received\ndata: ${JSON.stringify(data)}\n\n`)
},
'message.sent': (data: any) => {
res.write(`event: message.sent\ndata: ${JSON.stringify(data)}\n\n`)
},
'message.status': (data: any) => {
res.write(`event: message.status\ndata: ${JSON.stringify(data)}\n\n`)
},
'message.reaction': (data: any) => {
res.write(`event: message.reaction\ndata: ${JSON.stringify(data)}\n\n`)
},
'presence.update': (data: any) => {
res.write(`event: presence.update\ndata: ${JSON.stringify(data)}\n\n`)
},
'history.synced': (data: any) => {
res.write(`event: history.synced\ndata: ${JSON.stringify(data)}\n\n`)
}
}
// Register listeners
for (const [eventName, handler] of Object.entries(handlers)) {
baileysManager.on(eventName, handler)
}
// Keep-alive ping
const pingInterval = setInterval(() => {
res.write(`: ping\n\n`)
}, 30000)
// Cleanup on close
event.node.req.on('close', () => {
clearInterval(pingInterval)
for (const [eventName, handler] of Object.entries(handlers)) {
baileysManager.off(eventName, handler)
}
})
// Don't close the connection
return new Promise(() => {})
})