| |
| const connections = new Map(); |
|
|
| |
| const heartbeats = new Map(); |
|
|
| export function registerConnection(jobId, res) { |
| |
| if (connections.has(jobId)) { |
| clearInterval(heartbeats.get(jobId)); |
| heartbeats.delete(jobId); |
| } |
|
|
| connections.set(jobId, res); |
| res.writeHead(200, { |
| "Content-Type": "text/event-stream", |
| "Cache-Control": "no-cache", |
| "Connection": "keep-alive", |
| }); |
| res.write(": connected\n\n"); |
|
|
| |
| const hb = setInterval(() => { |
| if (connections.has(jobId)) { |
| try { res.write(": heartbeat\n\n"); } catch (_) { clearInterval(hb); } |
| } else { |
| clearInterval(hb); |
| } |
| }, 15000); |
| heartbeats.set(jobId, hb); |
|
|
| |
| res.on("close", () => { |
| clearInterval(heartbeats.get(jobId)); |
| heartbeats.delete(jobId); |
| connections.delete(jobId); |
| }); |
| } |
|
|
| export function sendEvent(jobId, eventObj) { |
| const res = connections.get(jobId); |
| if (res) { |
| res.write("data: " + JSON.stringify(eventObj) + "\n\n"); |
| } |
| } |
|
|
| export function closeConnection(jobId) { |
| const res = connections.get(jobId); |
| if (res) { |
| res.end(); |
| connections.delete(jobId); |
| } |
| clearInterval(heartbeats.get(jobId)); |
| heartbeats.delete(jobId); |
| } |
|
|