### As I was trying to build the SSE endpoint, I learnt some stuff about Reitit middlewares: With the channel transformed to the output-stream, how to send that output-stream as a response? How to We also cannot return this in the async handler, because how? We need to return the `:status` and `:headers` immediately, so wrapping the map in respond won't help. However, this won't work. To understand why, we need to understand how `go` return value works. Here's Rich Hickey's [on the topic](): > The go block itself immediately returns a channel, on which it will eventually put the value of the last expression of the body (if non-nil), and then close. > — [Rationale for core.async](https://clojure.org/news/2013/06/28/clojure-clore-async-channels) The handler would return a `:body` of type core.async channel, which wouldn't work. `` --- > All official Ring middleware supports both types of handler, but for most purposes synchronous handlers are sufficient. > — [Ring - Concepts](https://github.com/ring-clojure/ring/wiki/Concepts#handlers) However, I wonder if we can use the async handler at all. Also, based on the [Boolean Knot's post](https://www.booleanknot.com/blog/2016/07/15/asynchronous-ring.html), it seems to me that an async Ring handler requires all custom attached middlewares to support the async version as well. In my case, that would mean rewriting middlewares from the sync version to the async version. (Interestingly, interceptors seems to be superior to middlewares in this regard, as they [support both the sync and async processing.](https://quanttype.net/posts/2018-08-03-why-interceptors.html) ) The async `respond` callback requires the whole response to be returned. Confused, I looked into [async Reitit interceptors](https://cljdoc.org/d/metosin/reitit/0.8.0-alpha1/doc/http/sieppari), see [example](https://github.com/metosin/reitit/blob/0.15.6/examples/http/src/example/server.clj#L44-L47), but