-
Notifications
You must be signed in to change notification settings - Fork 10
/
pedestal_jetty.clj
50 lines (42 loc) · 1.89 KB
/
pedestal_jetty.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
(ns ripley.live.impl.pedestal-jetty
"Pedestal (pedestal.io) + jetty WebSocket context support.
NOTE: bring your own pedestal dependencies, Ripley does not provide them."
(:require [io.pedestal.http.jetty.websockets :as ws]
[clojure.core.async :as async]
[ripley.live.protocols :as p]
[clojure.tools.logging :as log])
(:import (org.eclipse.jetty.websocket.api Session WebSocketConnectionListener WebSocketListener)
(org.eclipse.jetty.websocket.servlet ServletUpgradeRequest)))
(defn- send-fn! [session-delay data]
(let [^Session session @session-delay]
(-> session .getRemote (.sendString data))))
(defn make-ws-listener
[^ServletUpgradeRequest req {::keys [initialize-connection] :as m}]
(let [id (-> req .getParameterMap (.get "id") first java.util.UUID/fromString)
session* (object-array 1)
send! (partial send-fn! (delay (aget session* 0)))
callbacks (initialize-connection id send!)]
(reify
WebSocketConnectionListener
(onWebSocketConnect [_this ws-session]
(aset session* 0 ws-session)
(p/on-open callbacks))
(onWebSocketClose [_this status _reason]
(p/on-close callbacks status))
(onWebSocketError [_this _cause]
(p/on-close callbacks -1))
WebSocketListener
(onWebSocketText [_this msg]
(p/on-receive callbacks msg))
(onWebSocketBinary [_this payload offset length]
(log/warn "Unexpected binary message, payload: " payload ", offset: " offset ", length: " length)))))
(defn handler
"Returns a context configurator that you add to the
HTTP container options when starting a pedestal service."
[uri _options initialize-connection]
(fn [ctx]
(ws/add-ws-endpoints
ctx
{uri {::initialize-connection initialize-connection}}
{:listener-fn (fn [req _response ws-map]
(make-ws-listener req ws-map))})))