Skip to content

Commit 1cc0e8f

Browse files
committed
First side-effecting version of render-eval, factor out browse!
1 parent 6a31d20 commit 1cc0e8f

File tree

5 files changed

+51
-21
lines changed

5 files changed

+51
-21
lines changed

src/nextjournal/clerk.clj

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
"Clerk's Public API."
33
(:refer-clojure :exclude [comment])
44
(:require [babashka.fs :as fs]
5-
[clojure.java.browse :as browse]
65
[clojure.java.io :as io]
76
[clojure.set :as set]
87
[clojure.string :as str]
@@ -476,8 +475,7 @@
476475
(reset! !watcher {:paths watch-paths
477476
:watcher (apply beholder/watch #(file-event %) watch-paths)}))
478477
(when browse?
479-
(let [{:keys [host port]} @webserver/!server]
480-
(browse/browse-url (format "http://%s:%s" host port))))))
478+
(webserver/browse!))))
481479
config)
482480

483481
#_(serve! (with-meta {:help true} {:org.babashka/cli {}}))

src/nextjournal/clerk/builder.clj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,8 @@
117117
(when (= stage :init)
118118
(builder-ui/reset-build-state!)
119119
((resolve 'nextjournal.clerk/show!) (find-ns 'nextjournal.clerk.builder-ui))
120-
(when-let [{:keys [port]} (and (get-in build-event [:build-opts :browse]) @webserver/!server)]
121-
(browse/browse-url (str "http://localhost:" port))))
120+
(when (get-in build-event [:build-opts :browse])
121+
(webserver/browse!)))
122122
(stdout-reporter build-event)
123123
(builder-ui/add-build-event! build-event)
124124
(binding [*out* (java.io.StringWriter.)]
@@ -208,8 +208,8 @@
208208
(cond-> ssr? ssr!)
209209
cleanup))))))
210210
(when browse?
211-
(browse/browse-url (if-let [{:keys [port]} (and (= out-path "public/build") @webserver/!server)]
212-
(str "http://localhost:" port "/build/")
211+
(browse/browse-url (if-let [server-url (and (= out-path "public/build") (webserver/server-url))]
212+
(str server-url "/build/")
213213
(-> index-html fs/absolutize .toString path-to-url-canonicalize))))
214214
{:docs docs
215215
:index-html index-html

src/nextjournal/clerk/render.cljs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -689,16 +689,6 @@
689689
(if error (reject error) (resolve reply)))
690690
(js/console.warn :process-eval-reply!/not-found :eval-id eval-id :keys (keys @!pending-clerk-eval-replies))))
691691

692-
(defn ^:export dispatch [{:as msg :keys [type]}]
693-
(let [dispatch-fn (get {:patch-state! patch-state!
694-
:set-state! set-state!
695-
:eval-reply process-eval-reply!}
696-
type
697-
(fn [_]
698-
(js/console.warn (str "no on-message dispatch for type `" type "`"))))]
699-
#_(js/console.log :<= type := msg)
700-
(dispatch-fn msg)))
701-
702692
(defonce container-el
703693
(and (exists? js/document) (js/document.getElementById "clerk")))
704694

src/nextjournal/clerk/sci_env.cljs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@
173173
'system-time (sci/copy-var system-time core-ns)}}
174174
(sci-copy-nss
175175
'cljs.math
176+
'cljs.repl
176177
'nextjournal.clerk.parser
177178
'nextjournal.clerk.render
178179
'nextjournal.clerk.render.code
@@ -187,12 +188,27 @@
187188
sci.configs.js-interop/namespaces
188189
sci.configs.reagent/namespaces)})
189190

190-
(defn ^:export onmessage [ws-msg]
191-
(render/dispatch (read-string (.-data ws-msg))))
192-
193191
(defn ^:export eval-form [f]
194192
(sci/eval-form (sci.ctx-store/get-ctx) f))
195193

194+
(defn render-eval [{:keys [form]}]
195+
(eval-form form))
196+
197+
(def message-type->fn
198+
{:patch-state! render/patch-state!
199+
:set-state! render/set-state!
200+
:eval-reply render/process-eval-reply!
201+
:render-eval render-eval})
202+
203+
(defn ^:export onmessage [ws-msg]
204+
(let [{:as msg :keys [type]} (read-string (.-data ws-msg))
205+
dispatch-fn (get message-type->fn
206+
type
207+
(fn [_]
208+
(js/console.warn (str "no on-message dispatch for type `" type "`"))))]
209+
#_(js/console.log :<= type := msg)
210+
(dispatch-fn msg)))
211+
196212
(def ^:export init render/init)
197213

198214
(defn ^:export ssr [state-str]

src/nextjournal/clerk/webserver.clj

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
(ns nextjournal.clerk.webserver
22
(:require [babashka.fs :as fs]
33
[clojure.edn :as edn]
4+
[clojure.java.browse :as browse]
45
[clojure.java.io :as io]
56
[clojure.pprint :as pprint]
67
[clojure.set :as set]
@@ -25,6 +26,20 @@
2526

2627
(def ^:dynamic *sender-ch* nil)
2728

29+
(defn server-url []
30+
(when-let [{:keys [host port]} @!server]
31+
(format "http://%s:%s" host port)))
32+
33+
(defn ex-server-not-running []
34+
(Exception. "no server running, please run `(nextjournal.clerk/serve! {})` and try again."))
35+
36+
(defn browse! []
37+
(if-let [server-url (server-url)]
38+
(browse/browse-url server-url)
39+
(throw (ex-server-not-running))))
40+
41+
#_(browse!)
42+
2843
(defn send! [ch msg]
2944
(httpkit/send! ch (v/->edn msg)))
3045

@@ -36,7 +51,18 @@
3651
(httpkit/send! ch (v/->edn msg)))
3752
(reset! !last-sender-ch *sender-ch*))
3853

39-
#_(broadcast! [{:random (rand-int 10000) :range (range 100)}])
54+
#_(broadcast! [])
55+
56+
(defn render-eval
57+
"Evaluates the given `form` in Clerk's render environment in the browser."
58+
[form]
59+
(if-let [client (first @!clients)]
60+
(send! client {:type :render-eval :form form})
61+
(if (server-url)
62+
(throw (ex-info (format "no client connected, please open %s in a browser and try again." (server-url)) {:clients @!clients}))
63+
(throw (ex-server-not-running)))))
64+
65+
#_(render-eval '(js/console.log :foo))
4066

4167
(defn ^:private percent-decode [s]
4268
(java.net.URLDecoder/decode s java.nio.charset.StandardCharsets/UTF_8))

0 commit comments

Comments
 (0)