diff --git a/src/dev/user.clj b/src/dev/user.clj index 1c0e887..302a3a3 100644 --- a/src/dev/user.clj +++ b/src/dev/user.clj @@ -1,19 +1,15 @@ (ns user (:require - [clj-reload.core :as reload])) - + [clj-reload.core :as reload])) (alter-var-root #'*warn-on-reflection* (constantly true)) - (reload/init - {:no-reload ['user]}) - + {:no-reload ['user]}) (defn reload! [] (reload/reload)) - (comment (reload!) *e) diff --git a/src/main/example/core.clj b/src/main/example/core.clj index f01e95a..4571e68 100644 --- a/src/main/example/core.clj +++ b/src/main/example/core.clj @@ -1,8 +1,8 @@ (ns example.core (:require - [example.utils :refer [html->str defpage defaction defaction-async] :as u] - [reitit.ring :as rr] - [ring.util.response :as ruresp])) + [example.utils :refer [html->str defpage defaction defaction-async] :as u] + [reitit.ring :as rr] + [ring.util.response :as ruresp])) (declare home-page page-2 hello-world) @@ -11,7 +11,7 @@ {:url "/" :view (fn home-view [_] - (html->str + (html->str [:main [:div [:input {:data-bind "msg"}] @@ -24,7 +24,7 @@ {:url "/page2" :view (fn page2-view [_] - (html->str + (html->str [:main [:p "this is page2"] [:button {:data-on-click (u/at-get home-page)} @@ -38,17 +38,17 @@ (def hello-world {:url "/hello-world" :fn (fn hello-world [sse] - (dotimes [i msg-count] + (dotimes [i msg-count] (u/patch-signals-edn! sse {:msg (subs message 0 (inc i))}) (Thread/sleep 500)))}) ;; http stuff (def routes (concat - (defpage home-page) - (defpage page-2) - (defaction hello-world) - (defaction-async "/connect" u/connect-sse! u/disconnect-sse!))) + (defpage home-page) + (defpage page-2) + (defaction hello-world) + (defaction-async "/connect" u/connect-sse! u/disconnect-sse!))) (def router (rr/router routes)) @@ -56,6 +56,8 @@ ;; repl it up ;P (comment + routes + (u/broadcast-signals! {:msg "hi franz"}) (u/broadcast-signals! {:msg "hi ty"}) (u/broadcast! d*/console-log! "hi franz") @@ -64,7 +66,6 @@ (u/kill-broadcast!) - (clojure.repl/dir d*) (clojure.repl/doc d*/patch-signals!)) diff --git a/src/main/example/main.clj b/src/main/example/main.clj index 66a9687..e774176 100644 --- a/src/main/example/main.clj +++ b/src/main/example/main.clj @@ -1,12 +1,11 @@ (ns example.main (:require - [example.core :as c] - [example.server :as server])) - + [example.core :as c] + [example.server :as server])) (defn -main [& _] (let [server (server/start! c/handler)] (.addShutdownHook (Runtime/getRuntime) (Thread. (fn [] - (server/stop! server) - (shutdown-agents)))))) + (server/stop! server) + (shutdown-agents)))))) diff --git a/src/main/example/server.clj b/src/main/example/server.clj index a91e755..4ad931d 100644 --- a/src/main/example/server.clj +++ b/src/main/example/server.clj @@ -1,27 +1,23 @@ (ns example.server (:require - [example.core :as c] - [ring.adapter.jetty :as jetty]) + [example.core :as c] + [ring.adapter.jetty :as jetty]) (:import - org.eclipse.jetty.server.Server)) - + org.eclipse.jetty.server.Server)) (defonce !jetty-server (atom nil)) - (defn start! [handler & {:as opts}] (let [opts (merge {:port 80 :join? false} opts)] (println "Starting server on port:" (:port opts)) (jetty/run-jetty handler opts))) - (defn stop! [server] (println "Stopping server") (println server) (.stop ^Server server)) - (defn reboot-jetty-server! [handler & {:as opts}] (swap! !jetty-server (fn [server] diff --git a/src/main/example/utils.clj b/src/main/example/utils.clj index 0402f57..4a9184a 100644 --- a/src/main/example/utils.clj +++ b/src/main/example/utils.clj @@ -1,15 +1,15 @@ (ns example.utils (:require - [clojure.java.io :as io] - [clojure.string :as string] - [dev.onionpancakes.chassis.compiler :as hc] - [dev.onionpancakes.chassis.core :as h] - [reitit.ring.middleware.parameters :as rmparams] - [reitit.ring :as rr] - [ring.util.response :as ruresp] - [starfederation.datastar.clojure.api :as d*] - [starfederation.datastar.clojure.adapter.ring :refer [->sse-response on-open on-close] :as dr] - [clojure.data.json :as json])) + [clojure.java.io :as io] + [clojure.string :as string] + [dev.onionpancakes.chassis.compiler :as hc] + [dev.onionpancakes.chassis.core :as h] + [reitit.ring.middleware.parameters :as rmparams] + [reitit.ring :as rr] + [ring.util.response :as ruresp] + [starfederation.datastar.clojure.api :as d*] + [starfederation.datastar.clojure.adapter.ring :refer [->sse-response on-open on-close] :as dr] + [clojure.data.json :as json])) (declare conns add-elements! sse-navigate!) @@ -21,8 +21,8 @@ ;; html utils (defn html->str [hiccup-forms] (h/html - (hc/compile - hiccup-forms))) + (hc/compile + hiccup-forms))) (defn html-template [content] (-> (io/resource "public/index.html") @@ -43,18 +43,18 @@ (defn sse-page [request respond view url] (respond - (->sse-response request - {on-open - (fn [sse] - (d*/with-open-sse sse - (sse-navigate! sse (view {})) - (add-elements! sse (update-url-frag url))))}))) + (->sse-response request + {on-open + (fn [sse] + (d*/with-open-sse sse + (sse-navigate! sse (view {})) + (add-elements! sse (update-url-frag url))))}))) (defn text-html-page [request respond view] (-> (html-template (view {})) - ruresp/response - (ruresp/content-type "text/html") - respond)) + ruresp/response + (ruresp/content-type "text/html") + respond)) (defn page [request respond url view] (if (-> request @@ -64,7 +64,6 @@ (sse-page request respond view url) (text-html-page request respond view))) - ;; d* api utils (defn patch-signals-edn! [sse edn] (d*/patch-signals! sse (json/write-str edn))) @@ -76,25 +75,24 @@ (d*/patch-elements! sse elems #:d*.elements{:patch-mode "replace" :selector "main"})) - ;; broadcast utils (defn try! [d*-f! sse & args] - (try (apply d*-f! sse args) + (try (when (not (apply d*-f! sse args)) + (disconnect-sse! sse)) (catch Exception e (println "exception occured. dropping connection. error:" e) - (d*/close-sse! sse) - (swap! conns disj sse)))) + (disconnect-sse! sse)))) (defonce conns (atom #{})) (defn broadcast! ([f] - (doseq [conn @conns] - (try! f conn))) + (doseq [conn @conns] + (try! f conn))) ([f arg & args] (doseq [conn @conns] - (apply try! f conn arg args)))) + (apply try! f conn arg args)))) (defn connect-sse! [sse] (swap! conns conj sse) @@ -123,34 +121,34 @@ ([page] (defpage (:url page) (:view page))) ([endpoint view] - [[endpoint - {:handler (fn [request respond _] + [[endpoint + {:handler (fn [request respond _] (page request respond endpoint view))}] - [(str "/sse" endpoint) - {:handler (fn [request respond _] + [(str "/sse" endpoint) + {:handler (fn [request respond _] (page request respond endpoint view))}]])) (defn defaction ([action] (defaction (:url action) (:fn action))) ([url f] - (let [sse-handler - (fn [request respond raise_] - (respond - (->sse-response - request - {on-open #(d*/with-open-sse % (f %))})))] - [[url sse-handler] - [(str "/sse" url) sse-handler]]))) + (let [sse-handler + (fn [request respond raise_] + (respond + (->sse-response + request + {on-open #(d*/with-open-sse % (f %))})))] + [[url sse-handler] + [(str "/sse" url) sse-handler]]))) (defn defaction-async [url on-open-f on-close-f] (let [sse-handler (fn [request respond raise_] (respond - (->sse-response - request - {on-open on-open-f - on-close on-close-f})))] - [[url sse-handler] - [(str "/sse" url) sse-handler]])) + (->sse-response + request + {on-open on-open-f + on-close on-close-f})))] + [[url sse-handler] + [(str "/sse" url) sse-handler]]))