Skip to content

Commit f681675

Browse files
committed
Add ring.websocket namespace
1 parent c62702a commit f681675

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed

ring-core/src/ring/websocket.clj

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
(ns ring.websocket
2+
(:refer-clojure :exclude [send])
3+
(:import [java.nio ByteBuffer]))
4+
5+
(defprotocol Listener
6+
(on-open [listener socket])
7+
(on-message [listener socket message])
8+
(on-pong [listener socket data])
9+
(on-error [listener socket throwable])
10+
(on-close [listener socket code reason]))
11+
12+
(defprotocol Socket
13+
(-send [socket message])
14+
(-ping [socket data])
15+
(-pong [socket data])
16+
(-close [socket status reason]))
17+
18+
(defprotocol TextData
19+
(->string [data]))
20+
21+
(defprotocol BinaryData
22+
(->byte-buffer [data]))
23+
24+
(extend-protocol TextData
25+
String
26+
(->string [s] s))
27+
28+
(extend-protocol BinaryData
29+
(Class/forName "[B")
30+
(->byte-buffer [bs] (ByteBuffer/wrap bs))
31+
ByteBuffer
32+
(->byte-buffer [bb] bb))
33+
34+
(defn- encode-message [message]
35+
(cond
36+
(satisfies? TextData message) (->string message)
37+
(satisfies? BinaryData message) (->byte-buffer message)
38+
:else (throw (ex-info "message is not a valid text or binary data type"
39+
{:message message}))))
40+
41+
(defn send [socket message]
42+
(-send socket (encode-message message)))
43+
44+
(defn ping
45+
([socket]
46+
(-ping socket (ByteBuffer/allocate 0)))
47+
([socket data]
48+
(-ping socket (->byte-buffer data))))
49+
50+
(defn pong
51+
([socket]
52+
(-pong socket (ByteBuffer/allocate 0)))
53+
([socket data]
54+
(-pong socket (->byte-buffer data))))
55+
56+
(defn close
57+
([socket]
58+
(-close socket 1000 "Normal Closure"))
59+
([socket code reason]
60+
(-close socket code reason)))
61+
62+
(defn websocket-request? [request]
63+
(let [headers (:headers request)]
64+
(and (.equalsIgnoreCase "upgrade" (get headers "connection"))
65+
(.equalsIgnoreCase "websocket" (get headers "upgrade")))))
66+
67+
(defn websocket-response? [response]
68+
(contains? response ::listener))

0 commit comments

Comments
 (0)