Skip to content

Commit c987b71

Browse files
committed
Extend websocket listener protocol to maps
1 parent d0f2838 commit c987b71

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed

ring-core/src/ring/websocket.clj

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,19 @@
99
(on-error [listener socket throwable])
1010
(on-close [listener socket code reason]))
1111

12+
(extend-protocol Listener
13+
clojure.lang.IPersistentMap
14+
(on-open [m socket]
15+
(when-let [kv (find m :on-open)] ((val kv) socket)))
16+
(on-message [m socket message]
17+
(when-let [kv (find m :on-message)] ((val kv) socket message)))
18+
(on-pong [m socket data]
19+
(when-let [kv (find m :on-pong)] ((val kv) socket data)))
20+
(on-error [m socket throwable]
21+
(when-let [kv (find m :on-error)] ((val kv) socket throwable)))
22+
(on-close [m socket code reason]
23+
(when-let [kv (find m :on-close)] ((val kv) socket code reason))))
24+
1225
(defprotocol Socket
1326
(-send [socket message])
1427
(-ping [socket data])

ring-jetty-adapter/test/ring/adapter/test/jetty.clj

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -716,4 +716,21 @@
716716
@(hato/close! ws)
717717
(Thread/sleep 100)))
718718
(is (= [[:ping "foo"] [:pong "foo"]]
719-
@log)))))
719+
@log))))
720+
721+
(testing "using a map as a listener"
722+
(let [listener {:on-open (fn [s] [:on-open s])
723+
:on-message (fn [s m] [:on-message s m])
724+
:on-pong (fn [s d] [:on-pong s d])
725+
:on-error (fn [s e] [:on-error s e])
726+
:on-close (fn [s c r] [:on-close s c r])}]
727+
(is (= [:on-open :sock]
728+
(ws/on-open listener :sock)))
729+
(is (= [:on-message :sock "foo"]
730+
(ws/on-message listener :sock "foo")))
731+
(is (= [:on-pong :sock "data"]
732+
(ws/on-pong listener :sock "data")))
733+
(is (= [:on-error :sock "err"]
734+
(ws/on-error listener :sock "err")))
735+
(is (= [:on-close :sock 1000 "closed"]
736+
(ws/on-close listener :sock 1000 "closed"))))))

0 commit comments

Comments
 (0)