import { Schedule } from "~/shared/types/schedule" function sendMessage( stream: WritableStream, message: string, ) { const writer = stream.getWriter(); writer.ready .then(() => writer.write(message)) .catch(console.error) .finally(() => writer.releaseLock()) ; } const streams = new Set>(); let keepaliveInterval: ReturnType | null = null export function addStream(stream: WritableStream) { if (streams.size === 0) { console.log("Starting keepalive") keepaliveInterval = setInterval(sendKeepalive, 4000) } streams.add(stream); } export function deleteStream(stream: WritableStream) { streams.delete(stream); if (streams.size === 0) { console.log("Ending keepalive") clearInterval(keepaliveInterval!); } } export function broadcastUpdate(schedule: Schedule) { const id = Date.now(); const data = JSON.stringify(schedule); const message = `id: ${id}\nevent: update\ndata: ${data}\n\n` console.log(`broadcasting update from ${process.pid} to ${streams.size} clients`); for (const stream of streams) { sendMessage(stream, message); } } function sendKeepalive() { for (const stream of streams) { sendMessage(stream, "data: keepalive\n\n"); } }