Skip to content

Commit 7e08f7c

Browse files
committed
Add docstrings to functions
1 parent e69cb21 commit 7e08f7c

File tree

1 file changed

+51
-38
lines changed

1 file changed

+51
-38
lines changed

src/ring/middleware/websocket_keepalive.clj

Lines changed: 51 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,44 +4,57 @@
44
(:import [java.util.concurrent
55
Executors Future ScheduledExecutorService TimeUnit]))
66

7-
(def default-schedule-executor
7+
(def ^:private default-schedule-executor
88
(delay (Executors/newSingleThreadScheduledExecutor)))
99

10-
(defn websocket-keepalive-response [response options]
11-
(if (ws/websocket-response? response)
12-
(let [listener (::ws/listener response)
13-
executor (:executor options @default-schedule-executor)
14-
period (:period options 30000)
15-
task (promise)]
16-
(assoc response ::ws/listener
17-
(reify wsp/Listener
18-
(on-open [_ socket]
19-
(deliver task (.scheduleAtFixedRate
20-
^ScheduledExecutorService executor
21-
#(ws/ping socket)
22-
period period TimeUnit/MILLISECONDS))
23-
(wsp/on-open listener socket))
24-
(on-message [_ socket message]
25-
(wsp/on-message listener socket message))
26-
(on-pong [_ socket data]
27-
(wsp/on-pong listener socket data))
28-
(on-error [_ socket throwable]
29-
(wsp/on-error listener socket throwable))
30-
(on-close [_ socket code reason]
31-
(.cancel ^Future @task false)
32-
(wsp/on-close listener socket code reason))
33-
wsp/PingListener
34-
(on-ping [_ socket data]
35-
(if (satisfies? wsp/PingListener listener)
36-
(wsp/on-ping listener socket data)
37-
(wsp/-ping socket data))))))
38-
response))
10+
(defn websocket-keepalive-response
11+
"Adds a periodic ping to a WebSocket response; returns the response unaltered
12+
otherwise. See wrap-websocket-keepalive for the available options."
13+
([response]
14+
(websocket-keepalive-response response {}))
15+
([response options]
16+
(if (ws/websocket-response? response)
17+
(let [listener (::ws/listener response)
18+
executor (:executor options @default-schedule-executor)
19+
period (:period options 30000)
20+
task (promise)]
21+
(assoc response ::ws/listener
22+
(reify wsp/Listener
23+
(on-open [_ socket]
24+
(deliver task (.scheduleAtFixedRate
25+
^ScheduledExecutorService executor
26+
#(ws/ping socket)
27+
period period TimeUnit/MILLISECONDS))
28+
(wsp/on-open listener socket))
29+
(on-message [_ socket message]
30+
(wsp/on-message listener socket message))
31+
(on-pong [_ socket data]
32+
(wsp/on-pong listener socket data))
33+
(on-error [_ socket throwable]
34+
(wsp/on-error listener socket throwable))
35+
(on-close [_ socket code reason]
36+
(.cancel ^Future @task false)
37+
(wsp/on-close listener socket code reason))
38+
wsp/PingListener
39+
(on-ping [_ socket data]
40+
(if (satisfies? wsp/PingListener listener)
41+
(wsp/on-ping listener socket data)
42+
(wsp/-ping socket data))))))
43+
response)))
3944

40-
(defn wrap-websocket-keepalive [handler options]
41-
(fn
42-
([request]
43-
(websocket-keepalive-response (handler request) options))
44-
([request respond raise]
45-
(handler request
46-
#(respond (websocket-keepalive-response % options))
47-
raise))))
45+
(defn wrap-websocket-keepalive
46+
"Middleware that adds a periodic ping to WebSocket responses, in order to
47+
stop them from timing out. Takes the following options:
48+
49+
:period - the time in milliseconds between pings (default 30000)
50+
:executor - a custom ScheduledExecutorService to handle scheduling"
51+
([handler]
52+
(wrap-websocket-keepalive handler {}))
53+
([handler options]
54+
(fn
55+
([request]
56+
(websocket-keepalive-response (handler request) options))
57+
([request respond raise]
58+
(handler request
59+
#(respond (websocket-keepalive-response % options))
60+
raise)))))

0 commit comments

Comments
 (0)