Peter Amiri
06/23/2026, 8:35 PMrenderSSE(data=..., event=..., retry=...) — one event per request, browser auto-reconnects. Spec-covered, engine-safe, holds no thread. The one to reach for.
• The streaming trio — initSSEStream() returns the raw writer, then sendSSEEvent / sendSSEComment (keep-alive heartbeat) / closeSSEStream for long-lived pushes.
• isSSERequest() — serve SSE to EventSource clients and HTML to everyone else from one action.
• The bounded streaming loop — timeout cap, writer.checkError() disconnect detection, heartbeats, sleep, try/finally close. CFML holds a worker thread for the whole connection, so this part is mandatory.
• The one real sharp edge: initSSEStream() is engine-fragile on BoxLang and not spec-covered end-to-end. Hand-test streaming per engine; renderSSE has no such caveat.
About 4 lines of controller code for server-to-client updates, no second protocol.