Files
whatsappNucleo/server/api/events/stream.get.ts
josedario87 8f44826e64
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 1m4s
Fix: Usar URL interna para debug webhook receiver (bypass authentik)
2025-12-02 21:27:45 -06:00

73 lines
2.2 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`)
}
}
// 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(() => {})
})