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:
2026-03-06 07:50:55 +01:00
co-authored by Claude Opus 4.6
parent faad73c4ef
commit 26420fd6ec
2 changed files with 8 additions and 17 deletions
@@ -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
+7 -16
View File
@@ -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)