initial commit for reagent-data-views-sente
This commit is contained in:
parent
a2304f978b
commit
047db2e158
16
reagent-data-views-sente/project.clj
Normal file
16
reagent-data-views-sente/project.clj
Normal file
|
@ -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"]]}})
|
|
@ -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 %))))
|
|
@ -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)))
|
Loading…
Reference in a new issue