Use idiomatic undertow/websocket maps instead of raw WebSocket API
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -22,7 +22,7 @@
|
|||||||
[handler]
|
[handler]
|
||||||
(fn [request]
|
(fn [request]
|
||||||
(let [resp (handler request)]
|
(let [resp (handler request)]
|
||||||
(when (:status resp) resp))))
|
(when (or (:status resp) (:undertow/websocket resp)) resp))))
|
||||||
|
|
||||||
(defn wrap-base [{:keys [site-defaults-config cors-origin]}]
|
(defn wrap-base [{:keys [site-defaults-config cors-origin]}]
|
||||||
(let [origin (or cors-origin
|
(let [origin (or cors-origin
|
||||||
|
|||||||
@@ -11,9 +11,7 @@
|
|||||||
[reitit.ring.middleware.parameters :as parameters]
|
[reitit.ring.middleware.parameters :as parameters]
|
||||||
[reitit.swagger :as swagger])
|
[reitit.swagger :as swagger])
|
||||||
(:import
|
(:import
|
||||||
[io.undertow.server HttpServerExchange]
|
[io.undertow.websockets.core WebSockets WebSocketChannel]
|
||||||
[io.undertow.websockets WebSocketConnectionCallback WebSocketProtocolHandshakeHandler]
|
|
||||||
[io.undertow.websockets.core AbstractReceiveListener WebSockets WebSocketChannel]
|
|
||||||
[java.time Instant ZoneId]
|
[java.time Instant ZoneId]
|
||||||
[java.time.format DateTimeFormatter]
|
[java.time.format DateTimeFormatter]
|
||||||
[java.util Locale]
|
[java.util Locale]
|
||||||
@@ -66,9 +64,6 @@
|
|||||||
(let [queue (LinkedBlockingQueue.)
|
(let [queue (LinkedBlockingQueue.)
|
||||||
wkey (keyword (gensym "ws-"))
|
wkey (keyword (gensym "ws-"))
|
||||||
rkey (keyword (gensym "ws-r-"))]
|
rkey (keyword (gensym "ws-r-"))]
|
||||||
(.set (.getReceiveSetter channel)
|
|
||||||
(proxy [AbstractReceiveListener] []))
|
|
||||||
(.resumeReceives channel)
|
|
||||||
(add-watch price-atom wkey
|
(add-watch price-atom wkey
|
||||||
(fn [_ _ _ _] (.offer queue :update)))
|
(fn [_ _ _ _] (.offer queue :update)))
|
||||||
(add-watch rates-atom rkey
|
(add-watch rates-atom rkey
|
||||||
@@ -91,16 +86,12 @@
|
|||||||
(when (.isOpen channel)
|
(when (.isOpen channel)
|
||||||
(try (.close channel) (catch Exception _))))))))
|
(try (.close channel) (catch Exception _))))))))
|
||||||
|
|
||||||
(defn- ws-price-handler [{:keys [binance frankfurter]} req]
|
(defn- ws-price-handler [{:keys [binance frankfurter]} _req]
|
||||||
(let [^HttpServerExchange exchange (:server-exchange req)
|
(let [price-atom (:latest-price binance)
|
||||||
price-atom (:latest-price binance)
|
rates-atom (:rates frankfurter)]
|
||||||
rates-atom (:rates frankfurter)
|
{:undertow/websocket
|
||||||
callback (proxy [WebSocketConnectionCallback] []
|
{:on-open (fn [{:keys [^WebSocketChannel channel]}]
|
||||||
(onConnect [_ws-exchange channel]
|
(start-ws-send-loop! channel price-atom rates-atom))}}))
|
||||||
(start-ws-send-loop! channel price-atom rates-atom)))
|
|
||||||
handler (WebSocketProtocolHandshakeHandler. callback)]
|
|
||||||
(.handleRequest handler exchange)
|
|
||||||
nil))
|
|
||||||
|
|
||||||
(defn- latest-price-handler [{:keys [binance frankfurter]} _req]
|
(defn- latest-price-handler [{:keys [binance frankfurter]} _req]
|
||||||
(let [price-atom (:latest-price binance)
|
(let [price-atom (:latest-price binance)
|
||||||
|
|||||||
Reference in New Issue
Block a user