add client-side middleware support

This commit is contained in:
Gered 2016-05-17 16:10:50 -04:00
parent 028157cfa7
commit 0afa0d17a9

View file

@ -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)
(:on-close events)
due-to-error?
(decode-queued-map-array pending) (decode-queued-map-array pending)
(decode-queued-map-array undelivered))) (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))