# http/sse
Open a Server-Sent Events stream on a `%Response{}` from an HTTP route
handler. The `text/event-stream` headers and chunked transfer encoding are
written and flushed immediately; the connection stays open until
`http/sse-close` or the client disconnects.
## Syntax
[http/sse $res ?opts]
## Parameters
- `$res` — the route handler's not-yet-written `%Response{}`
- `$opts` — optional map:
- `:retry` / `:keep-alive` — initial `retry:` field (ms) / idle
`: ping` comment interval (ms)
- `:status` / `:headers` — status override / extra headers (`http/header` wins)
- `:on-close` — `{|stream| ...}` fired on explicit close, client
disconnect, or handler failure (not on GC teardown)
## Examples
def events {|req res| set stream [http/sse $res %{ :retry 3000 :keep-alive 15000 }] [http/sse-send $stream "hello"] [http/sse-send $stream "payload" %{ :event "tick" :id "42" }] [http/sse-comment $stream "still here"] [http/sse-close $stream] nil }
## Returns
A `%SseStream{}` resource, or `%Err{:message}` when `$res` is not a fresh
response, is already streaming, or the client disconnects on the first
flush. Handlers may keep sending across `[sleep]`/`[await ...]` suspensions.
## See Also
`http/sse-send`, `http/sse-comment`, `http/sse-close`, `http/serve`