diff --git a/reagent-data-views-sente/project.clj b/reagent-data-views-sente/project.clj new file mode 100644 index 0000000..5282ba5 --- /dev/null +++ b/reagent-data-views-sente/project.clj @@ -0,0 +1,16 @@ +(defproject reagent-data-views-sente "0.1.0-SNAPSHOT" + :description "Sente client/server support for reagent-data-views." + :url "https://github.com/gered/reagent-data-views" + :license {:name "MIT License" + :url "http://opensource.org/licenses/MIT"} + + :dependencies [[org.clojure/clojure "1.8.0"]] + + :profiles {:provided + {:dependencies + [[org.clojure/clojure "1.8.0"] + [org.clojure/clojurescript "1.8.51"] + [reagent "0.6.0-alpha"] + [gered/views "1.5-SNAPSHOT"] + [reagent-data-views "0.2.0-SNAPSHOT"] + [com.taoensso/sente "1.8.1"]]}}) \ No newline at end of file diff --git a/reagent-data-views-sente/src/reagent_data_views/sente/client.cljs b/reagent-data-views-sente/src/reagent_data_views/sente/client.cljs new file mode 100644 index 0000000..9743d9a --- /dev/null +++ b/reagent-data-views-sente/src/reagent_data_views/sente/client.cljs @@ -0,0 +1,49 @@ +(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 %)))) diff --git a/reagent-data-views-sente/src/reagent_data_views/sente/server.clj b/reagent-data-views-sente/src/reagent_data_views/sente/server.clj new file mode 100644 index 0000000..35afd66 --- /dev/null +++ b/reagent-data-views-sente/src/reagent_data_views/sente/server.clj @@ -0,0 +1,38 @@ +(ns reagent-data-views.sente.server + (:import + (clojure.lang Atom)) + (:require + [clojure.tools.logging :as log] + [views.core :as views] + [reagent-data-views.server.core :as server] + [taoensso.sente :as sente])) + +(defn- views-send-fn + [sente-chsk-map uid [view-sig view-data]] + (log/trace uid "refresh view" view-sig) + ((:send-fn sente-chsk-map) uid [:views/refresh [view-sig view-data]])) + +(defn on-close! + [^Atom view-system {:keys [event id uid client-id ring-req ?reply-fn] :as ev}] + (server/on-close! view-system uid ring-req)) + +(defn on-receive! + [^Atom view-system {:keys [event id uid client-id ring-req ?reply-fn] :as ev}] + (server/on-receive! view-system uid event ring-req)) + +(defn event-msg-handler + [^Atom view-system {:keys [event id uid client-id] :as ev}] + (if (= id :chsk/uidport-close) + (on-close! view-system ev) + (on-receive! view-system ev))) + +(defn init-views! + ([^Atom view-system sente-chsk-map options] + (let [options (-> options + (assoc :send-fn #(views-send-fn sente-chsk-map %1 %2)))] + (if (:use-default-sente-router? options) + (sente/start-chsk-router! (:ch-recv sente-chsk-map) #(event-msg-handler view-system %))) + (views/init! view-system options) + (server/set-context-fn! view-system (:context-fn options)))) + ([sente-chsk-map options] + (init-views! (atom {}) sente-chsk-map options)))