const { Router } = require('express'); const { v4: uuidv4 } = require('uuid'); const registry = require('../backend-registry'); const relay = require('../relay'); const router = Router(); const sessions = new Map(); router.get('/:serviceId/sse', (req, res) => { const { serviceId } = req.params; if (!registry.get(serviceId)) { return res.status(502).json({ error: 'backend not connected' }); } res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); res.flushHeaders(); const clientSessionId = uuidv4(); sessions.set(clientSessionId, { res, serviceId }); res.write('event: endpoint\ndata: /' + serviceId + '/message?sessionId=' + clientSessionId + '\n\n'); req.on('close', () => { sessions.delete(clientSessionId); console.log('[sse] client disconnected: ' + clientSessionId + ' (' + serviceId + ')'); }); }); router.post('/:serviceId/message', (req, res) => { const { serviceId } = req.params; const { sessionId } = req.query; const session = sessions.get(sessionId); if (!session) { return res.status(404).json({ error: 'session not found' }); } if (!registry.get(serviceId)) { return res.status(502).json({ error: 'backend not connected' }); } relay.sendToBackend(serviceId, req.body, sessionId, sessions); return res.status(202).json({ status: 'accepted' }); }); module.exports = router; module.exports.sessions = sessions;