|
| 1 | +(ns hello-httpkit |
| 2 | + (:require |
| 3 | + [charred.api] |
| 4 | + [clojure.java.io :as io] |
| 5 | + [dev.onionpancakes.chassis.compiler :as hc] |
| 6 | + [dev.onionpancakes.chassis.core :as h] |
| 7 | + [org.httpkit.server] |
| 8 | + [reitit.ring.middleware.parameters] |
| 9 | + [reitit.ring] |
| 10 | + [ring.util.response] |
| 11 | + [starfederation.datastar.clojure.adapter.http-kit :refer [->sse-response on-open]] |
| 12 | + [starfederation.datastar.clojure.api :as d*])) |
| 13 | + |
| 14 | +(def read-json (charred.api/parse-json-fn {:async? false :bufsize 1024})) |
| 15 | + |
| 16 | +(defn get-signals [req] |
| 17 | + (-> req d*/get-signals read-json)) |
| 18 | + |
| 19 | +(def home-page |
| 20 | + (slurp (io/resource "hello-world.html"))) |
| 21 | + |
| 22 | +(defn home [_] |
| 23 | + (-> home-page |
| 24 | + (ring.util.response/response) |
| 25 | + (ring.util.response/content-type "text/html"))) |
| 26 | + |
| 27 | +(def message "Hello, world!") |
| 28 | + |
| 29 | +(defn ->frag [i] |
| 30 | + (h/html |
| 31 | + (hc/compile |
| 32 | + [:div {:id "message"} |
| 33 | + (subs message 0 (inc i))]))) |
| 34 | + |
| 35 | +(defn hello-world [request] |
| 36 | + (let [d (-> request get-signals (get "delay") int)] |
| 37 | + (->sse-response request |
| 38 | + {on-open |
| 39 | + (fn [sse] |
| 40 | + (d*/with-open-sse sse |
| 41 | + (dotimes [i (count message)] |
| 42 | + (d*/patch-elements! sse (->frag i)) |
| 43 | + (Thread/sleep d))))}))) |
| 44 | + |
| 45 | +(def routes |
| 46 | + [["/" {:handler home}] |
| 47 | + ["/hello-world" {:handler hello-world |
| 48 | + :middleware [reitit.ring.middleware.parameters/parameters-middleware]}]]) |
| 49 | + |
| 50 | +(def router (reitit.ring/router routes)) |
| 51 | + |
| 52 | +(def handler (reitit.ring/ring-handler router)) |
| 53 | + |
| 54 | +;; ------------------------------------------------------------ |
| 55 | +;; Server |
| 56 | +;; ------------------------------------------------------------ |
| 57 | +(defonce !server (atom nil)) |
| 58 | + |
| 59 | +(defn stop! [] |
| 60 | + (if-let [s @!server] |
| 61 | + (do (org.httpkit.server/server-stop! s) |
| 62 | + (reset! !server nil)) |
| 63 | + (throw (ex-info "Server not running" {})))) |
| 64 | + |
| 65 | +(defn start! [handler opts] |
| 66 | + (when-not (nil? @!server) |
| 67 | + (stop!)) |
| 68 | + (reset! !server |
| 69 | + (org.httpkit.server/run-server |
| 70 | + handler |
| 71 | + (merge {:port 8080} |
| 72 | + opts |
| 73 | + {:legacy-return-value? false})))) |
| 74 | + |
| 75 | +(comment |
| 76 | + (stop!) |
| 77 | + (start! #'handler {}) |
| 78 | + ) |
| 79 | + |
| 80 | +;; ------------------------------------------------------------ |
| 81 | +;; Main |
| 82 | +;; ------------------------------------------------------------ |
| 83 | +(defn -main [& _] |
| 84 | + (start! #'handler {:port 8080}) |
| 85 | + (.addShutdownHook (Runtime/getRuntime) |
| 86 | + (Thread. #(do (stop!) (shutdown-agents))))) |
0 commit comments