Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[mod] #424 reintroduce jetty9 support #426

Open
wants to merge 18 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
ad9c6f8
[nop] Update README
ptaoussanis Mar 16, 2023
7a762ee
v1.18.0-SNAPSHOT
ptaoussanis Feb 24, 2023
91f328c
[wip] [#426] [#424] Reintroduce `jetty9-ring-adapter` support (@TimoK…
ptaoussanis Apr 7, 2023
0d68ee0
[tmp] [#426] Temporarily mod example project to use `jetty9-ring-adap…
ptaoussanis Apr 7, 2023
69721b4
[nop] Bump deps
ptaoussanis Feb 24, 2023
561097c
Revert "[mod] [#424] [BREAKING] Temporarily remove `jetty9-ring-adapt…
TimoKramer Mar 17, 2023
a611614
[mod] [#424] reintroduce fixed `jetty9-ring-adapter` support
TimoKramer Mar 21, 2023
4bbfaac
fixup! [mod] [#424] reintroduce fixed `jetty9-ring-adapter` support
TimoKramer Mar 21, 2023
3673019
fixup! [mod] [#424] reintroduce fixed `jetty9-ring-adapter` support
TimoKramer Mar 21, 2023
65387f5
fixup! [mod] [#424] reintroduce fixed `jetty9-ring-adapter` support
TimoKramer Mar 21, 2023
1758ddd
fixup! [mod] [#424] reintroduce fixed `jetty9-ring-adapter` support
TimoKramer Mar 21, 2023
48c4d44
fixup! [mod] [#424] reintroduce fixed `jetty9-ring-adapter` support
TimoKramer Mar 22, 2023
fb8dac8
fixup! [mod] [#424] reintroduce fixed `jetty9-ring-adapter` support
TimoKramer Mar 22, 2023
eb6466a
fixup! [mod] [#424] reintroduce fixed `jetty9-ring-adapter` support
TimoKramer Mar 22, 2023
75f475c
fixup! [mod] [#424] reintroduce fixed `jetty9-ring-adapter` support
TimoKramer Mar 22, 2023
bb0317d
fixup! [mod] [#424] reintroduce fixed `jetty9-ring-adapter` support
TimoKramer Mar 31, 2023
5ef90bd
fixup! [mod] [#424] reintroduce fixed `jetty9-ring-adapter` support
TimoKramer Apr 11, 2023
12d8879
fixup! [mod] [#424] reintroduce fixed `jetty9-ring-adapter` support
TimoKramer Apr 11, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 0 additions & 2 deletions README.md
Expand Up @@ -21,8 +21,6 @@

> **Sen-te** (先手) is a Japanese [Go] term used to describe a play with such an overwhelming follow-up that it demands an immediate response, leaving its player with the initiative.

(I'd also recommend checking out James Henderson's [Chord] and Kevin Lynagh's [jetty7-websockets-async] as possible alternatives!)

## Features
* **Bidirectional a/sync comms** over both **WebSockets** and **Ajax** (auto-fallback)
* **It just works**: auto keep-alives, buffering, protocol selection, reconnects
Expand Down
6 changes: 4 additions & 2 deletions example-project/project.clj
@@ -1,4 +1,4 @@
(defproject com.taoensso.examples/sente "1.17.0"
(defproject com.taoensso.examples/sente "1.18.0-SNAPSHOT"
:description "Sente, reference web-app example project"
:url "https://github.com/ptaoussanis/sente"
:license {:name "Eclipse Public License"
Expand All @@ -15,7 +15,7 @@
[org.clojure/core.async "1.6.673"]
[nrepl "1.0.0"] ; Optional, for Cider

[com.taoensso/sente "1.17.0"] ; <--- Sente
[com.taoensso/sente "1.18.0-SNAPSHOT"] ; <--- Sente
[com.taoensso/timbre "6.1.0"]

;;; TODO Choose (uncomment) a supported web server -----------------------
Expand All @@ -25,6 +25,8 @@
;; [nginx-clojure/nginx-clojure-embed "x.y.z"] ; Needs v0.4.2+
;; [aleph "x.y.z"]
;; [info.sunng/ring-jetty9-adapter "x.y.z"]
[info.sunng/ring-jetty9-adapter "0.18.5"]
[commons-io/commons-io "2.11.0"]
;; -----------------------------------------------------------------------

[ring "1.10.0"]
Expand Down
22 changes: 14 additions & 8 deletions example-project/src/example/server.clj
Expand Up @@ -15,8 +15,8 @@
[taoensso.sente :as sente]

;;; TODO Choose (uncomment) a supported web server + adapter -------------
[org.httpkit.server :as http-kit]
[taoensso.sente.server-adapters.http-kit :refer [get-sch-adapter]]
;;[org.httpkit.server :as http-kit]
;;[taoensso.sente.server-adapters.http-kit :refer [get-sch-adapter]]

;; [immutant.web :as immutant]
;; [taoensso.sente.server-adapters.immutant :refer [get-sch-adapter]]
Expand All @@ -27,8 +27,8 @@
;; [aleph.http :as aleph]
;; [taoensso.sente.server-adapters.aleph :refer [get-sch-adapter]]

;; [ring.adapter.jetty9.websocket :as jetty9.websocket]
;; [taoensso.sente.server-adapters.jetty9 :refer [get-sch-adapter]]
[ring.adapter.jetty9 :as jetty]
[taoensso.sente.server-adapters.community.jetty9 :refer [get-sch-adapter]]
;;
;; See https://gist.github.com/wavejumper/40c4cbb21d67e4415e20685710b68ea0
;; for full example using Jetty 9
Expand Down Expand Up @@ -245,13 +245,13 @@
(defn stop-web-server! [] (when-let [stop-fn @web-server_] (stop-fn)))
(defn start-web-server! [& [port]]
(stop-web-server!)
(let [port (or port 0) ; 0 => Choose any available port
(let [port (or port 3333) ; 0 => Choose any available port
ring-handler (var main-ring-handler)

[port stop-fn]
;;; TODO Choose (uncomment) a supported web server ------------------
(let [stop-fn (http-kit/run-server ring-handler {:port port})]
[(:local-port (meta stop-fn)) (fn [] (stop-fn :timeout 100))])
;;(let [stop-fn (http-kit/run-server ring-handler {:port port})]
;; [(:local-port (meta stop-fn)) (fn [] (stop-fn :timeout 100))]]
;;
;; (let [server (immutant/run ring-handler :port port)]
;; [(:port server) (fn [] (immutant/stop server))])
Expand All @@ -265,6 +265,11 @@
;; ;; (aleph.netty/wait-for-close server)
;; [(aleph.netty/port server)
;; (fn [] (.close ^java.io.Closeable server) (deliver p nil))])

(let [server (jetty/run-jetty ring-handler {:port port
:async? true
:join? false})]
[port (fn [] (jetty/stop-server server))])
;; ------------------------------------------------------------------

uri (format "http://localhost:%s/" port)]
Expand All @@ -283,4 +288,5 @@

(comment
(start!) ; Eval this at REPL to start server via REPL
(test-fast-server>user-pushes))
(test-fast-server>user-pushes)
(stop!))
2 changes: 1 addition & 1 deletion project.clj
@@ -1,4 +1,4 @@
(defproject com.taoensso/sente "1.17.0"
(defproject com.taoensso/sente "1.18.0-SNAPSHOT"
:author "Peter Taoussanis <https://www.taoensso.com>"
:description "Realtime web comms for Clojure/Script"
:url "https://github.com/ptaoussanis/sente"
Expand Down
4 changes: 1 addition & 3 deletions src/taoensso/sente.cljc
Expand Up @@ -91,9 +91,7 @@
#?(:clj (:import [org.java_websocket.client WebSocketClient])))

(enc/assert-min-encore-version [3 49 0])

(def sente-version "Useful for identifying client/server mismatch"
[1 11 0])
(def sente-version "Useful for identifying client/server mismatch" [1 18 0])

#?(:cljs (def ^:private node-target? (= *target* "nodejs")))

Expand Down
49 changes: 49 additions & 0 deletions src/taoensso/sente/server_adapters/community/jetty9.clj
@@ -0,0 +1,49 @@
(ns taoensso.sente.server-adapters.community.jetty9
"Sente adapter for ring-jetty9-adapter,
(https://github.com/sunng87/ring-jetty9-adapter).

Note that ring-jetty9-adapter defines WebSocket routes/handlers
separately from regular Ring routes/handlers [1,2].

This can make it tricky to set up stateful middleware correctly
(for example as you may want to do for CSRF protection).

See [3] for a full example.

[1] https://github.com/sunng87/ring-jetty9-adapter/blob/master/examples/rj9a/websocket.clj
[2] https://github.com/sunng87/ring-jetty9-adapter/issues/41#issuecomment-630206233
[3] https://gist.github.com/wavejumper/40c4cbb21d67e4415e20685710b68ea0"

{:author "Thomas Crowley (@wavejumper), modified for async jetty by Timo Kramer"}
(:require [ring.adapter.jetty9.websocket :as jetty9.websocket]
[taoensso.sente.interfaces :as i]))

(defn- ajax-cbs [sch]
{:write-failed (fn [_throwable] (jetty9.websocket/close! sch))
:write-success (fn [ ] (jetty9.websocket/close! sch))})

(extend-type org.eclipse.jetty.websocket.api.WebSocketAdapter
i/IServerChan
(sch-open? [sch] (jetty9.websocket/connected? sch))
(sch-close! [sch] (jetty9.websocket/close! sch))
(sch-send! [sch websocket? msg]
(if websocket?
(jetty9.websocket/send! sch msg)
(jetty9.websocket/send! sch msg (ajax-cbs sch)))))

(defn- server-ch-resp
[websocket? {:keys [on-open on-close on-msg on-error ring-async-resp-fn ring-async-raise-fn]}]
{:on-connect (fn [sch ] (on-open sch websocket?))
:on-text (fn [sch msg ] (on-msg sch websocket? msg))
:on-error (fn [sch error ] (on-error sch websocket? error))
:on-close (fn [sch status _] (on-close sch websocket? status))
:ring-async-resp-fn ring-async-resp-fn
:ring-async-raise-fn ring-async-raise-fn})

(deftype JettyServerChanAdapter []
i/IServerChanAdapter
(ring-req->server-ch-resp [_ req callbacks-map]
(jetty9.websocket/ws-upgrade-response
(server-ch-resp (jetty9.websocket/ws-upgrade-request? req) callbacks-map))))

(defn get-sch-adapter [] (JettyServerChanAdapter.))