add server-side browserchannel session event "middleware" support
same basic idea as ring middleware, except applied to the events that occur during a browserchannel session's events
This commit is contained in:
parent
f48818b137
commit
96b39a83d4
|
@ -7,7 +7,8 @@
|
||||||
[clojure.edn :as edn]
|
[clojure.edn :as edn]
|
||||||
[cheshire.core :as json]
|
[cheshire.core :as json]
|
||||||
[ring.middleware.params :as params]
|
[ring.middleware.params :as params]
|
||||||
[net.thegeez.browserchannel.async-adapter :as async-adapter]))
|
[net.thegeez.browserchannel.async-adapter :as async-adapter]
|
||||||
|
[net.thegeez.browserchannel.utils :refer [get-middleware-handler-map run-middleware]]))
|
||||||
|
|
||||||
;; @todo: out of order acks and maps - AKH the maps at least is taken care of.
|
;; @todo: out of order acks and maps - AKH the maps at least is taken care of.
|
||||||
;; @todo use a more specific Exception for failing writes, which
|
;; @todo use a more specific Exception for failing writes, which
|
||||||
|
@ -596,10 +597,30 @@
|
||||||
;; when the client never connects with a backchannel
|
;; when the client never connects with a backchannel
|
||||||
(send-off session-agent refresh-session-timeout)
|
(send-off session-agent refresh-session-timeout)
|
||||||
;; register application-level browserchannel session events
|
;; register application-level browserchannel session events
|
||||||
(let [{:keys [on-open on-close on-receive]} events]
|
(let [{:keys [on-open on-close on-receive]} events
|
||||||
(if on-close (add-listener! id :close on-close))
|
middleware (get-middleware-handler-map (:middleware options) [:on-open :on-close :on-receive])]
|
||||||
(if on-receive (add-listener! id :map on-receive))
|
(add-listener!
|
||||||
(if on-open (on-open id req)))
|
id :close
|
||||||
|
(fn [session-id request reason]
|
||||||
|
(run-middleware
|
||||||
|
(:on-close middleware)
|
||||||
|
(fn [session-id request reason]
|
||||||
|
(if on-close (on-close session-id request reason)))
|
||||||
|
session-id request reason)))
|
||||||
|
(add-listener!
|
||||||
|
id :map
|
||||||
|
(fn [session-id request data]
|
||||||
|
(run-middleware
|
||||||
|
(:on-receive middleware)
|
||||||
|
(fn [session-id request data]
|
||||||
|
(if on-receive (on-receive session-id request data)))
|
||||||
|
session-id request data)))
|
||||||
|
; on-open is just triggered right now, no listener necessary
|
||||||
|
(run-middleware
|
||||||
|
(:on-open middleware)
|
||||||
|
(fn [session-id request]
|
||||||
|
(if on-open (on-open session-id request)))
|
||||||
|
id req))
|
||||||
session-agent)))
|
session-agent)))
|
||||||
|
|
||||||
(defn- session-status
|
(defn- session-status
|
||||||
|
|
25
clj-browserchannel/src/net/thegeez/browserchannel/utils.cljc
Normal file
25
clj-browserchannel/src/net/thegeez/browserchannel/utils.cljc
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
(ns net.thegeez.browserchannel.utils)
|
||||||
|
|
||||||
|
(defn run-middleware
|
||||||
|
[middleware final-handler & args]
|
||||||
|
(let [wrap (fn [handler [f & more]]
|
||||||
|
(if f
|
||||||
|
(recur (f handler) more)
|
||||||
|
handler))
|
||||||
|
handler (wrap final-handler middleware)]
|
||||||
|
(apply handler args)))
|
||||||
|
|
||||||
|
(defn get-handlers
|
||||||
|
[middleware k]
|
||||||
|
(->> middleware
|
||||||
|
(map k)
|
||||||
|
(remove nil?)
|
||||||
|
(doall)))
|
||||||
|
|
||||||
|
(defn get-middleware-handler-map
|
||||||
|
[middleware handler-ks]
|
||||||
|
(reduce
|
||||||
|
(fn [m k]
|
||||||
|
(assoc m k (get-handlers middleware k)))
|
||||||
|
{}
|
||||||
|
handler-ks))
|
Reference in a new issue