taoensso / sente

Realtime web comms library for Clojure/Script
https://www.taoensso.com/sente
Eclipse Public License 1.0
1.73k stars 193 forks source link

chsk/ws-ping #391

Closed awb99 closed 2 years ago

awb99 commented 3 years ago

Cljs and clj implementation differ when it comes to received event - id handling. This effects or example :chsk/ws-ping handling. Clj implementation dispatches on chsk/ws-ping (as it should). cljs implementation dispatches on :chsk/recv (as it should not).

I believe this is a very simple bug thst occurs when the data? vector is empty.

To be clear: the keys [id data?] of ev-msg on clojurescript are different than the keys in clojure.

cljs:

(defmethod -event-msg-handler :chsk/recv
  [{:as ev-msg :keys [?data]}]
  (if (= ?data [:chsk/ws-ping])
    (info "ws-ping.")
    (if (vector? ?data)
      (do (info "dispatching rcvd ws msg to reframe:" ?data)
          (rf/dispatch ?data))
      (error "ws rcvd. cannot dispatch. data no vector: " ?data))))

(defmethod -event-msg-handler :default
  [{:as ev-msg :keys [event]}]
  (errorf "Unhandled ws event: %s" event))

; msg-handler

(defn event-msg-handler
  "Wraps `-event-msg-handler` with logging, error catching, etc."
  [{:keys [id ?data event] :as req}]
  (debugf "ws rcvd: evt: %s id: %s data: %s" event id ?data)
  (-event-msg-handler req))

clj:

(defmulti -event-msg-handler :id)

(defmethod -event-msg-handler :chsk/uidport-open
  [{:as ev-msg :keys [event id ?data ring-req ?reply-fn send-fn]}]
  (infof ":chsk/uidport-open: %s" event))

(defmethod -event-msg-handler :chsk/uidport-close
  [{:as ev-msg :keys [event id ?data ring-req ?reply-fn send-fn]}]
  (infof ":chsk/uidport-close: %s" event))

(defmethod -event-msg-handler :chsk/ws-ping
  [{:as ev-msg :keys [event id ?data ring-req ?reply-fn send-fn]}]
  (debugf ":chsk/ws-ping: %s" event))

(defmethod -event-msg-handler :default
  [{:keys [event id ?data ring-req ?reply-fn send-fn] :as req}]
  (let [session (:session ring-req)
        uid (:uid session)]
    (errorf "ws event of unknown type. Please implement (-event-handler %s) event: %s" id event)
    (ws-reply req [:ws/unknown event])))

(defn event-msg-handler [{:keys [client-id id event ?data] :as req}]
  (debugf "ws rcvd: evt: %s id: %s data: %s" event id ?data)
  (when req
    (-event-msg-handler req)))
ptaoussanis commented 2 years ago

@njerig Hi @awb99 , please see the :wrap-recv-evs? config option