All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 1m9s
- 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
76 lines
2.3 KiB
TypeScript
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(() => {})
|
|
})
|