Skip to content

Commit

Permalink
Buffer messages while ws disconnected, replay later
Browse files Browse the repository at this point in the history
  • Loading branch information
zampino committed Aug 3, 2023
1 parent f923970 commit c567874
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 3 deletions.
2 changes: 1 addition & 1 deletion src/nextjournal/clerk/render/editor.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@
{:key "Escape"
:run #(reset! !show-docstring? false)}]))]))
@!container-el))]
(goog.events/listenOnce js/window "clerk.wsopen" #(on-eval view) false)
(on-eval view)
#(.destroy view))))
(code/use-dark-mode !view)
[:<>
Expand Down
19 changes: 17 additions & 2 deletions src/nextjournal/clerk/sci_env.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -201,15 +201,26 @@
(defn reconnect-timeout [failed-connection-attempts]
(get [0 0 100 500 5000] failed-connection-attempts 10000))

(def !ws-connection
(atom {:outbox (.-EMPTY cljs.core.PersistentQueue) :connected? false}))

(defn ws-connected? [] (:connected? @!ws-connection))
(defn flush-ws-outbox []
(let [out (:outbox @!ws-connection)]
(swap! !ws-connection assoc :outbox (.-EMPTY cljs.core.PersistentQueue))
out))

(defn ^:export connect [ws-url]
(when (::failed-attempts @render/!doc)
(swap! render/!doc assoc ::connection-status "Reconnecting…"))
(let [ws (js/WebSocket. ws-url)]
(set! (.-onmessage ws) onmessage)
(set! (.-onopen ws) (fn [e]
(swap! !ws-connection assoc :connected? true)
(swap! render/!doc dissoc ::connection-status ::failed-attempts)
(.dispatchEvent js/window (new js/Event "clerk.wsopen"))))
(doseq [msg (flush-ws-outbox)] (.send ws msg))))
(set! (.-onclose ws) (fn [e]
(swap! !ws-connection assoc :connected? false)
(let [timeout (reconnect-timeout (::failed-attempts @render/!doc 0))]
(swap! render/!doc
(fn [doc]
Expand All @@ -220,7 +231,11 @@
(update ::failed-attempts (fnil inc 0)))))
(js/setTimeout #(connect ws-url) timeout))))
(set! (.-clerk_ws ^js goog/global) ws)
(set! (.-ws_send ^js goog/global) (fn [msg] (.send ws msg)))))
(set! (.-ws_send ^js goog/global)
(fn [msg]
(if (ws-connected?)
(.send ws msg)
(swap! !ws-connection update :outbox conj msg))))))

(sci.ctx-store/reset-ctx! (sci/init initial-sci-opts))

Expand Down

0 comments on commit c567874

Please sign in to comment.