Skip to content

Commit

Permalink
fixup! websockets init
Browse files Browse the repository at this point in the history
  • Loading branch information
mpenet committed Oct 7, 2023
1 parent 14b5c5e commit 7e4d85c
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 21 deletions.
10 changes: 8 additions & 2 deletions src/s_exp/mina.clj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
(ns s-exp.mina
(:require [s-exp.mina.http.handler]
(:require [s-exp.mina.http.routing]
[s-exp.mina.options :as options]
[s-exp.mina.websocket.handler])
[s-exp.mina.websocket.routing])
(:import (io.helidon.webserver WebServer WebServerConfig WebServerConfig$Builder)))

(set! *warn-on-reflection* true)
Expand All @@ -21,6 +21,12 @@
`options` can contain:
* `:http-handler` - ring http handler function
* `:websocket-endpoints` - websocket endpoints (map-of string-endpoint
handler-fns-map), where handler if can be of `:message`, `:ping`, `:pong`,
`:close`, `:error`, `:open`, `:http-upgrade`
* `:host` - host of the default socket
* `:port` - port the server listens to, default to 8080
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
(ns s-exp.mina.http.handler
(ns s-exp.mina.http.routing
(:require [s-exp.mina.http.request :as request]
[s-exp.mina.http.response :as response]
[s-exp.mina.options :as options])
Expand All @@ -23,6 +23,6 @@
handler
(response/set-response! server-response))))])))))))

(defmethod options/set-server-option! :http.handler
(defmethod options/set-server-option! :http-handler
[^WebServerConfig$Builder builder _ handler options]
(set-ring1-handler! builder handler options))
Original file line number Diff line number Diff line change
@@ -1,15 +1,10 @@
(ns s-exp.mina.websocket.handler
(:require [s-exp.mina.options :as options])
(ns s-exp.mina.websocket.listener
(:import (io.helidon.common.buffers BufferData)
(io.helidon.http Headers)
(io.helidon.http HttpPrologue)
(io.helidon.webserver WebServerConfig$Builder)
(io.helidon.webserver.websocket WsRouting)
(io.helidon.websocket WsListener WsSession)
(java.util Optional)))

(set! *warn-on-reflection* true)

(defn make-listener
^WsListener [{:as _listener
:keys [message ping pong close error open http-upgrade]
Expand All @@ -36,14 +31,3 @@
(^Optional onHttpUpgrade [_ ^HttpPrologue http-prologue ^Headers headers]
(http-upgrade http-prologue headers))))

(defn set-websocket-handler! ^WebServerConfig$Builder
[^WebServerConfig$Builder builder [path listener] _options]
(doto builder
(.addRouting
(.build
(doto (WsRouting/builder)
(.endpoint path (make-listener listener)))))))

(defmethod options/set-server-option! :websocket-handler
[^WebServerConfig$Builder builder _ handler options]
(set-websocket-handler! builder handler options))
51 changes: 51 additions & 0 deletions src/s_exp/mina/websocket/response.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
(ns s-exp.mina.websocket.response
(:import (io.helidon.common.buffers BufferData)
(io.helidon.websocket WsSession)))

(set! *warn-on-reflection* true)

(defprotocol ToBufferData
(buffer-data [x]))

(extend-protocol ToBufferData

(Class/forName "[B")
(buffer-data [ba]
(BufferData/create ^"[B" ba))

String
(buffer-data [s]
(BufferData/create s))

clojure.lang.Sequential
(buffer-data [s]
(BufferData/create s))

BufferData
(buffer-data [bd]
bd)

nil
(buffer-data [x]
(BufferData/empty)))

(defn send!
[^WsSession ws-session data last]
(.send ws-session (buffer-data data)
(boolean last)))

(defn ping!
[^WsSession ws-session data]
(.ping ws-session (buffer-data data)))

(defn pong!
[^WsSession ws-session data]
(.pong ws-session (buffer-data data)))

(defn close!
[^WsSession ws-session code reason]
(.close ws-session (int code) (str reason)))

(defn terminate!
[^WsSession ws-session]
(.terminate ws-session))
21 changes: 21 additions & 0 deletions src/s_exp/mina/websocket/routing.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
(ns s-exp.mina.websocket.routing
(:require [s-exp.mina.options :as options]
[s-exp.mina.websocket.listener :as l])
(:import (io.helidon.webserver WebServerConfig$Builder)
(io.helidon.webserver.websocket WsRouting WsRouting$Builder)))

(set! *warn-on-reflection* true)

(defn set-websocket-endpoints! ^WebServerConfig$Builder
[^WebServerConfig$Builder builder endpoints _options]
(doto builder
(.addRouting
(.build ^WsRouting$Builder
(reduce (fn [^WsRouting$Builder builder [path listener]]
(.endpoint builder ^String path (l/make-listener listener)))
(WsRouting/builder)
endpoints)))))

(defmethod options/set-server-option! :websocket-endpoints
[^WebServerConfig$Builder builder _ handler options]
(set-websocket-endpoints! builder handler options))

0 comments on commit 7e4d85c

Please sign in to comment.