SSE transport for Gerbil
- Scheme 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .gitignore | ||
| build.ss | ||
| gerbil.pkg | ||
| LICENSE | ||
| README.md | ||
| sse-test.ss | ||
| sse.ss | ||
SSE Gerbil
A minimal Server-Sent Events transport for Gerbil v19's :std/net/http/server.
(import :gerbil-sse/sse)
The module exports four procedures:
call-with-ssebegins an SSE response and manages its lifetime.call-with-sse-framecalls a procedure with the response'sBufferedWriter, then flushes: whatever it writes is one frame.sse-send!writes and flushes one preframed SSE string.sse?recognizes SSE sessions.
(def (events-handler request response)
(call-with-sse
response
(lambda (session)
(sse-send! session "event: ping\ndata: hello\n\n"))))
call-with-sse-frame writes a frame in pieces, for example bytes kept from earlier:
(call-with-sse-frame
session
(lambda (writer)
(BufferedWriter-write writer event-header) ; u8vectors
(BufferedWriter-write writer cached-data)
(BufferedWriter-write-string-utf8 writer "\n\n")))
The writer is valid only inside that procedure, which must not send on the same session. If it raises, the session fails as it does after a failed write: part of a frame may have been written, so nothing more is sent.
call-with-sse closes the response when its callback returns normally. Frames are serialized so concurrent sends cannot interleave. Event construction and application-level framing remain the caller's responsibility.
Development
gerbil build
gerbil test -v 0 ./sse-test.ss
License
MIT