Skip to content

Commit eae2726

Browse files
committed
[fix] [#259] Improve client-side detection of broken connections
BEFORE THIS COMMIT Client sends regular ping to server on inactivity. When the connection is broken, this sometimes (but not always) triggers a connection close that will then trigger reconnect. AFTER THIS COMMIT Client sends regular ping to server on inactivity AND EXPECTS REPLY FROM SERVER. If the server doesn't reply within a timeout, explicitly triggers a connection close that will then trigger reconnect.
1 parent a2b9af8 commit eae2726

File tree

1 file changed

+30
-10
lines changed

1 file changed

+30
-10
lines changed

src/taoensso/sente.cljc

+30-10
Original file line numberDiff line numberDiff line change
@@ -775,9 +775,12 @@
775775
;; No conn send/recv activity w/in kalive window
776776
;; so send ping to client. Should trigger close
777777
;; if conn is broken.
778-
(interfaces/sch-send! server-ch websocket?
779-
(pack packer :chsk/ws-ping)))
780-
(recur udt-t1))))))
778+
;;
779+
;; Might be nice to expect pong reply? Ref. #423
780+
(interfaces/sch-send! server-ch websocket?
781+
(pack packer :chsk/ws-ping)))
782+
783+
(recur udt-t1))))))
781784

782785
;; Ajax handshake/poll
783786
(let [_ (tracef "New Ajax handshake/poll: %s (%s)" uid sch-uuid)
@@ -805,13 +808,23 @@
805808
(assert websocket?)
806809
(upd-conn! :ws uid client-id)
807810
(let [[clj ?cb-uuid] (unpack packer req-ppstr)]
808-
(receive-event-msg! clj ; Should be ev
809-
(when ?cb-uuid
810-
(fn reply-fn [resp-clj] ; Any clj form
811-
(tracef "Chsk send (ws reply): %s" resp-clj)
812-
;; true iff apparent success:
811+
;; clj should be ev
812+
(if (= clj [:chsk/ws-ping])
813+
(do
814+
;; Auto reply to ping
815+
(when-let [cb-uuid ?cb-uuid]
813816
(interfaces/sch-send! server-ch websocket?
814-
(pack packer resp-clj ?cb-uuid)))))))
817+
(pack packer "pong" cb-uuid)))
818+
819+
(receive-event-msg! clj nil))
820+
821+
(receive-event-msg! clj
822+
(when ?cb-uuid
823+
(fn reply-fn [resp-clj] ; Any clj form
824+
(tracef "Chsk send (ws reply): %s" resp-clj)
825+
;; true iff apparent success:
826+
(interfaces/sch-send! server-ch websocket?
827+
(pack packer resp-clj ?cb-uuid))))))))
815828

816829
:on-close ; We rely on `on-close` to trigger for _every_ conn!
817830
(fn [server-ch websocket? _status]
@@ -1373,7 +1386,14 @@
13731386
;; No conn send/recv activity w/in kalive window
13741387
;; so send ping to server. Should trigger close
13751388
;; if conn is broken.
1376-
(-chsk-send! chsk [:chsk/ws-ping] {:flush? true})))
1389+
(-chsk-send! chsk [:chsk/ws-ping]
1390+
{:flush? true
1391+
:timeout-ms 5000 ; TODO Configurable
1392+
:cb ; Server will auto reply
1393+
(fn [reply]
1394+
(when (and (have-handle?) (not= reply "pong") #_(= reply :chsk/timeout))
1395+
(-chsk-disconnect! chsk :ws-ping-timeout)
1396+
(-chsk-connect! chsk)))})))
13771397
(recur)))))
13781398

13791399
chsk)))

0 commit comments

Comments
 (0)