40 lines
872 B
JavaScript
40 lines
872 B
JavaScript
|
|
'use strict';
|
||
|
|
|
||
|
|
const clients = new Set();
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Register an SSE response and keep the connection alive.
|
||
|
|
*/
|
||
|
|
function addClient(res) {
|
||
|
|
res.setHeader('Content-Type', 'text/event-stream');
|
||
|
|
res.setHeader('Cache-Control', 'no-cache');
|
||
|
|
res.setHeader('Connection', 'keep-alive');
|
||
|
|
res.flushHeaders();
|
||
|
|
|
||
|
|
// Send an immediate heartbeat so the browser knows the stream is live
|
||
|
|
res.write('data: {"type":"connected"}\n\n');
|
||
|
|
|
||
|
|
const heartbeat = setInterval(() => {
|
||
|
|
res.write(': heartbeat\n\n');
|
||
|
|
}, 20000);
|
||
|
|
|
||
|
|
clients.add(res);
|
||
|
|
|
||
|
|
res.on('close', () => {
|
||
|
|
clearInterval(heartbeat);
|
||
|
|
clients.delete(res);
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Push an event to all connected SSE clients.
|
||
|
|
*/
|
||
|
|
function broadcast(data) {
|
||
|
|
const payload = `data: ${JSON.stringify(data)}\n\n`;
|
||
|
|
for (const client of clients) {
|
||
|
|
client.write(payload);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
module.exports = { addClient, broadcast };
|