/** * 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(() => {}) })