Skip to content

Commit

Permalink
[new] [#325] Add option for custom WebSocket constructor
Browse files Browse the repository at this point in the history
  • Loading branch information
ptaoussanis committed Mar 7, 2023
1 parent ddde20d commit f560294
Showing 1 changed file with 36 additions and 30 deletions.
66 changes: 36 additions & 30 deletions src/taoensso/sente.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -1122,8 +1122,8 @@
nil))))))))

#?(:clj
(defn- create-java-client-websocket!
[{:as opts :keys [onerror-fn onmessage-fn onclose-fn uri-str headers]}]
(defn- make-client-ws-java
[{:as opts :keys [uri-str headers on-error on-message on-close]}]
(let [uri (java.net.URI. uri-str)

;; headers
Expand All @@ -1136,20 +1136,18 @@
ws-client
(proxy [WebSocketClient] [^java.net.URI uri ^java.util.Map headers]
(onOpen [^org.java_websocket.handshake.ServerHandshake handshakedata] nil)
(onError [ex] (onerror-fn ex))
(onMessage [^String message] (onmessage-fn message))
(onClose [code reason remote] (onclose-fn code reason remote)))]
(onError [ex] (on-error ex))
(onMessage [^String message] (on-message message))
(onClose [code reason remote] (on-close code reason remote)))]

;; JS client attempts to connect right away at construction time.
;; Java client doesn't need to, but we'll do anyway for consistency.
(.connect ws-client)
(do ws-client))))

#?(:cljs
(defn- create-js-client-websocket!
[{:as opts
:keys [onerror-fn onmessage-fn onclose-fn uri-str headers binary-type]}]

(defn- make-client-ws-js
[{:as opts :keys [uri-str headers on-error on-message on-close binary-type]}]
(when-let [WebSocket
(or
(enc/oget goog/global "WebSocket")
Expand All @@ -1158,19 +1156,20 @@

(let [socket (WebSocket. uri-str)]
(doto socket
(aset "onerror" onerror-fn)
(aset "onmessage" onmessage-fn) ; Nb receives both push & cb evs!
(aset "onerror" on-error)
(aset "onmessage" on-message) ; Nb receives both push & cb evs!
;; Fires repeatedly (on each connection attempt) while server is down:
(aset "onclose" onclose-fn))
(aset "onclose" on-close))

(when-let [bt binary-type] ; "arraybuffer" or "blob" (js default)
(aset socket "binaryType" bt))

socket))))

(defn- create-websocket! [{:as opts :keys [onerror-fn onmessage-fn onclose-fn uri-str headers]}]
#?(:cljs (create-js-client-websocket! opts)
:clj (create-java-client-websocket! opts)))
(defn- default-client-ws-constructor
[{:as opts :keys [on-error on-message on-close uri-str headers]}]
#?(:cljs (make-client-ws-js opts)
:clj (make-client-ws-java opts)))

(defn- get-client-csrf-token-str
"Returns non-blank client CSRF token ?string from given token string
Expand All @@ -1197,7 +1196,8 @@
backoff-ms-fn ; (fn [nattempt]) -> msecs
cbs-waiting_ ; {<cb-uuid> <fn> ...}
socket_
udt-last-comms_]
udt-last-comms_
ws-constructor]

IChSocket
(-chsk-disconnect! [chsk reason]
Expand Down Expand Up @@ -1266,7 +1266,7 @@
(swap-chsk-state! chsk
#(assoc % :udt-next-reconnect udt-next-reconnect)))))

onerror-fn
on-error
#?(:cljs
(fn [ws-ev]
(errorf ; ^:meta {:raw-console? true}
Expand All @@ -1286,7 +1286,7 @@
#(assoc % :last-ws-error
{:udt (enc/now-udt), :ex ex}))))

onmessage-fn ; Nb receives both push & cb evs!
on-message ; Nb receives both push & cb evs!
(fn #?(:cljs [ws-ev] :clj [ppstr])
(let [ppstr #?(:clj ppstr
:cljs (enc/oget ws-ev "data"))
Expand Down Expand Up @@ -1319,7 +1319,7 @@

;; Fires repeatedly (on each connection attempt) while
;; server is down:
onclose-fn
on-close
(fn #?(:cljs [ws-ev] :clj [code reason remote])
(let [last-ws-close
#?(:clj
Expand Down Expand Up @@ -1350,12 +1350,12 @@

?socket
(try
(create-websocket!
(ws-constructor
(merge ws-opts
{:onerror-fn onerror-fn
:onmessage-fn onmessage-fn
:onclose-fn onclose-fn
:headers headers
{:on-error on-error
:on-message on-message
:on-close on-close
:headers headers
:uri-str
(enc/merge-url-with-query-string url
(merge params ; 1st (don't clobber impl.):
Expand Down Expand Up @@ -1704,14 +1704,18 @@
; w/in given msecs. Should be different to server's :ws-kalive-ms.
:ws-kalive-ping-timeout-ms ; When above keep-alive ping is triggered, use this
; timeout (default: 5000) before regarding the connection
; as broken."
; as broken.
:ws-constructor ; Advanced, (fn [{:keys [uri-str headers on-message on-error on-close]}]
; => connected WebSocket, see `default-client-ws-constructor` code for
; details."

[path ?csrf-token-or-fn &
[{:keys [type protocol host port params headers recv-buf-or-n packer
ws-kalive-ms ws-kalive-ping-timeout-ms ws-opts
[{:as opts
:keys [type protocol host port params headers recv-buf-or-n packer
ws-constructor ws-kalive-ms ws-kalive-ping-timeout-ms ws-opts
client-id ajax-opts wrap-recv-evs? backoff-ms-fn]

:as opts
:or {type :auto
recv-buf-or-n (async/sliding-buffer 2048) ; Mostly for buffered-evs
packer :edn
Expand All @@ -1721,7 +1725,8 @@
backoff-ms-fn enc/exp-backoff

ws-kalive-ms 20000
ws-kalive-ping-timeout-ms 5000}}
ws-kalive-ping-timeout-ms 5000
ws-constructor default-client-ws-constructor}}

_deprecated-more-opts]]

Expand Down Expand Up @@ -1774,7 +1779,8 @@
:headers headers
:packer packer
:ws-kalive-ms ws-kalive-ms
:ws-kalive-ping-timeout-ms ws-kalive-ping-timeout-ms}
:ws-kalive-ping-timeout-ms ws-kalive-ping-timeout-ms
:ws-constructor default-client-ws-constructor}

ws-chsk-opts
(merge common-chsk-opts
Expand Down

0 comments on commit f560294

Please sign in to comment.