Last active
April 8, 2025 11:43
-
-
Save HassanYA/58bc5b9a71bcd9dea323c054600b9f20 to your computer and use it in GitHub Desktop.
short-sse middleware for clojure datastar sdk httpkit
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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)})))) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; 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