52 lines
1.4 KiB
JavaScript
52 lines
1.4 KiB
JavaScript
|
|
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);
|
||
|
|
|
||
|
|
return res.status(202).json({ status: 'accepted' });
|
||
|
|
});
|
||
|
|
|
||
|
|
module.exports = router;
|
||
|
|
module.exports.sessions = sessions;
|