views.reagent/reagent-data-views-sente/src/reagent_data_views/sente/client.cljs

50 lines
1.3 KiB
Plaintext
Raw Normal View History

(ns reagent-data-views.sente.client
(:require
[reagent-data-views.client.core :as client]
[taoensso.sente :as sente]))
(defonce send-buffer (atom []))
(defn- sente-connected?
[sente-chsk-map]
(:open? @(:state sente-chsk-map)))
(defn send-fn
[sente-chsk-map data]
(if-not (sente-connected? sente-chsk-map)
(swap! send-buffer conj data)
((:send-fn sente-chsk-map) data)))
(defn- flush-send-buffer!
[sente-chsk-map]
(doseq [data @send-buffer]
(send-fn sente-chsk-map data))
(reset! send-buffer []))
(defn on-open!
[sente-chsk-map {:keys [event id client-id] :as ev}]
(flush-send-buffer! sente-chsk-map)
(client/on-open!))
(defn on-receive!
[sente-chsk-map {:keys [event id client-id] :as ev}]
(let [[event-id event-data] event]
(client/on-receive! event-data)))
(defn event-msg-handler
[sente-chsk-map {:keys [event id client-id] :as ev}]
(let [[ev-id ev-data] event]
(cond
(and (= :chsk/state ev-id)
(:open? ev-data))
(on-open! sente-chsk-map ev)
(= :chsk/recv id)
(on-receive! sente-chsk-map ev))))
(defn init!
[sente-chsk-map & [options]]
(reset! client/send-fn #(send-fn sente-chsk-map %))
(if (:use-default-sente-router? options)
(sente/start-chsk-router! (:ch-recv sente-chsk-map) #(event-msg-handler sente-chsk-map %))))