# 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`