initial commit for reagent-data-views-sente

This commit is contained in:
Gered 2016-05-30 15:42:02 -04:00
parent a2304f978b
commit 047db2e158
3 changed files with 103 additions and 0 deletions

View 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"]]}})

View file

@ -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 %))))

View file

@ -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)))