// Verbindet das Frontend per Server-Sent Events mit dem Push-Endpoint der API (F13: // "Frontend via PHP Push aktualisieren (Server-Sent)", Phase 4). Faellt auf Polling zurueck, // wenn EventSource nicht verfuegbar ist oder der Stream dauerhaft nicht funktioniert (z.B. // ein Proxy ohne SSE-Unterstuetzung) - reine DOM-/Browser-API-Glue, daher ungetestet wie // office-render.js (siehe [[project-monitor-visualization]]-Notizen zur Teststrategie). import { streamUrl } from "./office-api.js"; const FALLBACK_POLL_INTERVAL_MS = 8000; const SAFETY_NET_POLL_INTERVAL_MS = 30000; /** * @param {() => void} onChange - wird aufgerufen, wenn sich serverseitig etwas geaendert hat * (oder im Polling-Fallback einfach regelmaessig). * @returns {() => void} Aufraeumfunktion (Stream schliessen/Timer stoppen). */ export function startRealtimeUpdates(onChange) { if (typeof window === "undefined" || typeof window.EventSource !== "function") { return startPolling(onChange, FALLBACK_POLL_INTERVAL_MS); } let source; try { source = new window.EventSource(streamUrl()); } catch { return startPolling(onChange, FALLBACK_POLL_INTERVAL_MS); } source.addEventListener("update", () => onChange()); // EventSource verbindet nach Verbindungsabbruch automatisch neu. Als Sicherheitsnetz laeuft // zusaetzlich ein sehr seltenes Polling mit, falls der Stream (z.B. wegen eines Proxys ohne // SSE-Unterstuetzung) dauerhaft keine Events liefert. const safetyNet = window.setInterval(onChange, SAFETY_NET_POLL_INTERVAL_MS); return () => { source.close(); window.clearInterval(safetyNet); }; } function startPolling(onChange, intervalMs) { const timer = window.setInterval(onChange, intervalMs); return () => window.clearInterval(timer); }