Guide: streams reach the page over one shared connection

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Waters Church
2026-09-15 11:04:18 -04:00
co-authored by Claude Fable 5.1
parent 680a34ac7a
commit ec178e9ccd
+14 -8
View File
@@ -381,14 +381,20 @@ const stream = moduleApi.sse('/stream', {
// later: stream.close() // later: stream.close()
``` ```
Browsers' `EventSource` retries transient drops itself but gives up for good Your route serves a plain SSE stream; how it reaches the page is the
when a retry gets a completed non-SSE response — which is what a proxy's 502 shell's business. A dashboard holds **one** connection for every stream on
looks like while the upstream is down. The shell's `sse()` recreates closed it (`GET /api/stream`, which the server feeds from your route over
streams on a 3-second timer until they work again, so **reconnect logic is loopback) — browsers allow about six connections to a host and a tile per
free**: handle `open` (refresh/backfill your state; you may have missed stream ran out of them — so `open` also fires whenever that shared
events) and `error` (report degraded status), and you're resilient. Streams connection is remade (a tile was added or removed) and whenever your route
you forget to close are force-closed when the tile unmounts — but close your comes back after a drop. Browsers' `EventSource` retries transient drops
own in `stop()` anyway. itself but gives up for good when a retry gets a completed non-SSE
response — which is what a proxy's 502 looks like while the upstream is
down; the shell recreates a closed connection on a 3-second timer until it
works again, so **reconnect logic is free**: handle `open` (refresh/backfill
your state; you may have missed events) and `error` (report degraded
status), and you're resilient. Streams you forget to close are force-closed
when the tile unmounts — but close your own in `stop()` anyway.
### Lifecycle you must expect ### Lifecycle you must expect