add client-side middleware support
This commit is contained in:
parent
028157cfa7
commit
0afa0d17a9
|
@ -5,7 +5,8 @@
|
||||||
goog.net.BrowserChannel
|
goog.net.BrowserChannel
|
||||||
goog.net.BrowserChannel.Handler
|
goog.net.BrowserChannel.Handler
|
||||||
[goog.events :as events]
|
[goog.events :as events]
|
||||||
[goog.debug.Logger.Level :as log-level]))
|
[goog.debug.Logger.Level :as log-level]
|
||||||
|
[net.thegeez.browserchannel.utils :refer [get-middleware-handler-map run-middleware]]))
|
||||||
|
|
||||||
(def ^:private bch-state-enum-to-keyword
|
(def ^:private bch-state-enum-to-keyword
|
||||||
{
|
{
|
||||||
|
@ -176,8 +177,8 @@
|
||||||
(.disconnect (get-channel))))
|
(.disconnect (get-channel))))
|
||||||
|
|
||||||
(defn- connect-channel!
|
(defn- connect-channel!
|
||||||
[{:keys [on-opening] :as events}
|
[events
|
||||||
{:keys [base] :as options}
|
{:keys [base middleware] :as options}
|
||||||
{:keys [old-session-id last-array-id] :as connect-args}]
|
{:keys [old-session-id last-array-id] :as connect-args}]
|
||||||
(let [state (channel-state)]
|
(let [state (channel-state)]
|
||||||
(when (or (= state :closed)
|
(when (or (= state :closed)
|
||||||
|
@ -191,7 +192,7 @@
|
||||||
; not really sure that passing in -1 is a good idea though
|
; not really sure that passing in -1 is a good idea though
|
||||||
; (that is, i don't think -1 ever gets passed in the AID param)
|
; (that is, i don't think -1 ever gets passed in the AID param)
|
||||||
(if-not (= -1 last-array-id) last-array-id))
|
(if-not (= -1 last-array-id) last-array-id))
|
||||||
(if on-opening (on-opening)))))
|
(run-middleware (:on-opening middleware) (:on-opening events)))))
|
||||||
|
|
||||||
(defn- reconnect!
|
(defn- reconnect!
|
||||||
[events handler options connect-args]
|
[events handler options connect-args]
|
||||||
|
@ -209,13 +210,13 @@
|
||||||
(if callback (callback)))))
|
(if callback (callback)))))
|
||||||
|
|
||||||
(defn- ->browserchannel-handler
|
(defn- ->browserchannel-handler
|
||||||
[{:keys [on-open on-close on-receive on-sent on-error] :as events} options]
|
[events {:keys [middleware] :as options}]
|
||||||
(let [handler (goog.net.BrowserChannel.Handler.)]
|
(let [handler (goog.net.BrowserChannel.Handler.)]
|
||||||
(set! (.-channelOpened handler)
|
(set! (.-channelOpened handler)
|
||||||
(fn [_]
|
(fn [_]
|
||||||
(clear-last-error!)
|
(clear-last-error!)
|
||||||
(reset-reconnect-attempts-counter!)
|
(reset-reconnect-attempts-counter!)
|
||||||
(if on-open (on-open))))
|
(run-middleware (:on-open middleware) (:on-open events))))
|
||||||
(set! (.-channelClosed handler)
|
(set! (.-channelClosed handler)
|
||||||
(fn [_ pending undelivered]
|
(fn [_ pending undelivered]
|
||||||
(let [last-error (:last-error @state)
|
(let [last-error (:last-error @state)
|
||||||
|
@ -236,26 +237,27 @@
|
||||||
(when due-to-error?
|
(when due-to-error?
|
||||||
(raise-context-callbacks! pending :on-error)
|
(raise-context-callbacks! pending :on-error)
|
||||||
(raise-context-callbacks! undelivered :on-error))
|
(raise-context-callbacks! undelivered :on-error))
|
||||||
(if on-close
|
(run-middleware
|
||||||
(on-close due-to-error?
|
(:on-close middleware)
|
||||||
(decode-queued-map-array pending)
|
(:on-close events)
|
||||||
(decode-queued-map-array undelivered)))
|
due-to-error?
|
||||||
|
(decode-queued-map-array pending)
|
||||||
|
(decode-queued-map-array undelivered))
|
||||||
(clear-last-error!))))
|
(clear-last-error!))))
|
||||||
(set! (.-channelHandleArray handler)
|
(set! (.-channelHandleArray handler)
|
||||||
(fn [_ m]
|
(fn [_ m]
|
||||||
(if on-receive
|
(run-middleware (:on-receive middleware) (:on-receive events) (decode-map m))))
|
||||||
(on-receive (decode-map m)))))
|
|
||||||
(set! (.-channelSuccess handler)
|
(set! (.-channelSuccess handler)
|
||||||
(fn [_ delivered]
|
(fn [_ delivered]
|
||||||
(if on-sent
|
(raise-context-callbacks! delivered :on-success)
|
||||||
(let [decoded (decode-queued-map-array delivered)]
|
(let [decoded (decode-queued-map-array delivered)]
|
||||||
(if (seq decoded) (on-sent decoded))))
|
(if (seq decoded)
|
||||||
(raise-context-callbacks! delivered :on-success)))
|
(run-middleware (:on-sent middleware) (:on-sent events) decoded)))))
|
||||||
(set! (.-channelError handler)
|
(set! (.-channelError handler)
|
||||||
(fn [_ error-code]
|
(fn [_ error-code]
|
||||||
(let [error-code (get bch-error-enum-to-keyword error-code :unknown)]
|
(let [error-code (get bch-error-enum-to-keyword error-code :unknown)]
|
||||||
(set-last-error! error-code)
|
(set-last-error! error-code)
|
||||||
(if on-error (on-error error-code)))))
|
(run-middleware (:on-error middleware) (:on-error events) error-code))))
|
||||||
handler))
|
handler))
|
||||||
|
|
||||||
(def default-options
|
(def default-options
|
||||||
|
@ -331,7 +333,12 @@
|
||||||
for the supported options, see
|
for the supported options, see
|
||||||
net.thegeez.browserchannel.client/default-options"
|
net.thegeez.browserchannel.client/default-options"
|
||||||
[events & [options]]
|
[events & [options]]
|
||||||
(let [options (merge default-options options)]
|
(let [middleware (get-middleware-handler-map
|
||||||
|
(:middleware options)
|
||||||
|
[:on-opening :on-open :on-close :on-receive :on-sent :on-error])
|
||||||
|
options (-> default-options
|
||||||
|
(merge options)
|
||||||
|
(assoc :middleware middleware))]
|
||||||
(events/listen js/window "unload" disconnect!)
|
(events/listen js/window "unload" disconnect!)
|
||||||
(set-new-channel!)
|
(set-new-channel!)
|
||||||
(.setHandler (get-channel) (->browserchannel-handler events options))
|
(.setHandler (get-channel) (->browserchannel-handler events options))
|
||||||
|
|
Reference in a new issue