// Ein Kanal für die ganze Seite. Mehrere Komponenten lauschen mit, ohne // dass jede eine eigene Verbindung aufmacht. let quelle = null const hoerer = new Set() function oeffnen() { quelle = new EventSource('/api/events') quelle.onmessage = (ereignis) => { const nachricht = JSON.parse(ereignis.data) hoerer.forEach((h) => h(nachricht)) } // Der Browser verbindet nach einem Abbruch von selbst neu } export function abonnieren(fn) { hoerer.add(fn) if (!quelle) oeffnen() return () => hoerer.delete(fn) } // Der Server merkt sich je Verbindung die Sitzung — daran hängt der // grüne Punkt. In einem frischen Browser steht die Verbindung, bevor // das Cookie da ist. Nach dem Namenswechsel darum einmal neu verbinden. export function neuVerbinden() { if (!quelle) return quelle.close() oeffnen() }