30 lines
834 B
JavaScript
30 lines
834 B
JavaScript
// 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()
|
|
}
|