Skip to content

Instantly share code, notes, and snippets.

@HassanYA
Last active April 8, 2025 11:43
Show Gist options
  • Save HassanYA/58bc5b9a71bcd9dea323c054600b9f20 to your computer and use it in GitHub Desktop.
Save HassanYA/58bc5b9a71bcd9dea323c054600b9f20 to your computer and use it in GitHub Desktop.
short-sse middleware for clojure datastar sdk httpkit
(require '[starfederation.datastar.clojure.adapter.http-kit :as hk-gen])
(defn short-sse
[handler]
(fn [request]
(let [hooks (handler request)
on-init (:init hooks)
on-open (:open hooks)
on-close (:close hooks)
init-results (when on-init (on-init))]
(hk-gen/->sse-response request
{hk-gen/on-open (when on-open
(fn [sse]
(on-open sse init-results)))
hk-gen/on-close (when on-close
(fn [sse status]
(on-close sse status init-results)))
:headers (:headers init-results)
:status (:status init-results)}))))
;; sample usage
;; with middleware
(defn login [{:keys [db body-params scookie] :as req}]
{:init #(if-let [errors (tl/errors db body-params)]
{:status 422 :errors errors}
(let [user (tl/login db body-params)]
(if-not (:db/id user)
{:status 401}
{:status 200
:headers (:headers (session-response {:session {:user user}} req scookie))
:user user})))
:open (fn [sse init]
(condp = (:status init)
422 (d*/merge-fragment! sse
(-> (wuc/login-form {:errors (:errors init)
:show-errors? true})
h/html str))
401 (d*/merge-fragment! sse
(-> (wuc/login-form {:error "Credentials entered are invalid"})
h/html str))
200 (do
(d*/merge-fragments! sse (mapv #(-> % h/html str)
[(wuc/login-form {:show-errors? true})
(wuc/nav {:user (:user init)})]))
(d*/execute-script! sse "toggleModalById('login-dialog')")))
(close-sse! sse))})
;; wihout middleware
(defn login [{:keys [db body-params scookie] :as req}]
(if-let [errors (tl/errors db body-params)]
(->sse-response req
{on-open (fn [sse]
(d*/merge-fragment! sse
(-> (wuc/login-form {:errors errors
:show-errors? true})
h/html str))
(close-sse! sse))
:status 422})
(let [user (tl/login db body-params)]
(if-not (:db/id user)
(->sse-response req
{on-open (fn [sse]
(d*/merge-fragment! sse
(-> (wuc/login-form {:error "Credentials entered are invalid"})
h/html str))
(close-sse! sse))
:status 401})
(let [headers (:headers (session-response {:session {:user user}} req scookie))]
(->sse-response req
{on-open (fn [sse]
(d*/merge-fragments! sse (mapv #(-> % h/html str)
[(wuc/login-form {:show-errors? true})
(wuc/nav {:user user})]))
(d*/execute-script! sse "toggleModalById('login-dialog')")
(close-sse! sse))
:headers headers}))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment