diff --git a/clj-browserchannel-jetty-adapter/project.clj b/clj-browserchannel-jetty-adapter/project.clj index 3679fb2..c8df53f 100644 --- a/clj-browserchannel-jetty-adapter/project.clj +++ b/clj-browserchannel-jetty-adapter/project.clj @@ -1,9 +1,9 @@ -(defproject net.thegeez/clj-browserchannel-jetty-adapter "0.0.2" +(defproject net.thegeez/clj-browserchannel-jetty-adapter "0.0.3-SNAPSHOT" :description "Jetty async adapter for BrowserChannel" :url "" - :dependencies [[org.clojure/clojure "1.3.0"] - [ring/ring-core "1.2.2"] - [ring/ring-servlet "1.2.0" :exclusions [javax.servlet/servlet-api]] - [org.eclipse.jetty/jetty-server "8.1.13.v20130916"];; includes ssl - [net.thegeez/clj-browserchannel-server "0.0.5"] + :dependencies [[org.clojure/clojure "1.6.0" :scope "provided"] + [ring/ring-core "1.3.1"] + [ring/ring-servlet "1.3.0" :exclusions [javax.servlet/servlet-api]] + [org.eclipse.jetty/jetty-server "8.1.16.v20140903"];; includes ssl + [net.thegeez/clj-browserchannel-server "0.0.7-SNAPSHOT"] ]) diff --git a/clj-browserchannel-server/project.clj b/clj-browserchannel-server/project.clj index 890440e..92fea0e 100644 --- a/clj-browserchannel-server/project.clj +++ b/clj-browserchannel-server/project.clj @@ -1,5 +1,5 @@ -(defproject net.thegeez/clj-browserchannel-server "0.0.6" +(defproject net.thegeez/clj-browserchannel-server "0.0.7" :description "BrowserChannel server implementation in Clojure" - :dependencies [[org.clojure/clojure "1.3.0"] - [ring/ring-core "1.2.2"] - [org.clojure/data.json "0.2.4"]]) ; still using deprecated json-str, need to port to write-str (?) + :dependencies [[org.clojure/clojure "1.6.0" :scope "provided"] + [ring/ring-core "1.3.1"] + [org.clojure/data.json "0.2.5"]]) ; still using deprecated json-str, need to port to write-str (?) diff --git a/clj-browserchannel-server/src/net/thegeez/browserchannel.clj b/clj-browserchannel-server/src/net/thegeez/browserchannel.clj index 3177142..1180e7f 100644 --- a/clj-browserchannel-server/src/net/thegeez/browserchannel.clj +++ b/clj-browserchannel-server/src/net/thegeez/browserchannel.clj @@ -5,8 +5,8 @@ [clojure.data.json :as json] [clojure.string :as str] [net.thegeez.async-adapter :as async-adapter]) - (:import [java.util.concurrent ScheduledExecutorService Executors TimeUnit])) -;; @todo: out of order acks and maps + (:import [java.util.concurrent ScheduledExecutorService Executors TimeUnit Callable ScheduledFuture])) +;; @todo: out of order acks and maps - AKH the maps at least is taken care of. ;; @todo use a more specific Exception for failing writes, which ;; indicate closed connection ;; @todo SSL in jetty-async-adapter @@ -49,11 +49,11 @@ ;; scheduling a task returns a ScheduledFuture, which can be stopped ;; with (.cancel task false) false says not to interrupt running tasks -(defn schedule [f secs] - (.schedule scheduler f secs TimeUnit/SECONDS)) +(defn schedule [^Callable f ^long secs] + (.schedule ^ScheduledExecutorService scheduler f secs TimeUnit/SECONDS)) ;; json responses are sent as "size-of-response\njson-response" -(defn size-json-str [json] +(defn size-json-str [^String json] (let [size (alength (.getBytes json "UTF-8"))] (str size "\n" json))) @@ -188,7 +188,7 @@ (async-adapter/head respond 200 (merge headers ie-headers)) (async-adapter/write-chunk respond "
\n") (when (seq domain) - (async-adapter/write-chunk respond (str "\n")))) + (async-adapter/write-chunk respond (str "\n")))) (write [this data] (async-adapter/write-chunk respond (str "\n")) (when-not write-padding-sent @@ -379,7 +379,7 @@ flush-buffer))) (clear-heartbeat [this] (when heartbeat-timeout - (.cancel heartbeat-timeout + (.cancel ^ScheduledFuture heartbeat-timeout false ;; do not interrupt running tasks )) (assoc this :heartbeat-timeout nil)) @@ -397,7 +397,7 @@ (:heartbeat-interval details)))))) (clear-session-timeout [this] (when session-timeout - (.cancel session-timeout + (.cancel ^ScheduledFuture session-timeout false ;; do not interrupt running tasks )) (assoc this :session-timeout nil)) @@ -526,7 +526,7 @@ flush-buffer)))) (defn send-map [session-id map] - (send-string session-id (json/json-str map))) + (send-string session-id (json/write-str map))) ;; wrap the respond function from :reactor with the proper ;; responsewrapper for either IE or other clients @@ -563,7 +563,7 @@ (rand-nth prefixes))] {:status 200 :headers (assoc (:headers options) "X-Accept" "application/json; application/x-www-form-urlencoded") - :body (json/json-str [host-prefix,nil])}) + :body (json/write-str [host-prefix,nil])}) ;; else phase 2 for get /test ;; client checks if connection is buffered @@ -600,7 +600,7 @@ {:status 200 :headers (assoc (:headers options) "Content-Type" "application/javascript") :body - (size-json-str (json/json-str [[0,["c", session-id, host-prefix, 8]]]))}) + (size-json-str (json/write-str [[0,["c", session-id, host-prefix, 8]]]))}) ;; For existing sessions: ;; Forward sent data by client to listeners ;; reply with @@ -613,7 +613,7 @@ (let [status (session-status @session-agent)] {:status 200 :headers (:headers options) - :body (size-json-str (json/json-str status))}))))) + :body (size-json-str (json/write-str status))}))))) ;; GET req server->client is a backwardchannel opened by client (defn handle-backward-channel [req session-agent options] @@ -664,7 +664,7 @@ (let [options (merge default-options options) base (str (:base options))] (-> (fn [req] - (let [uri (:uri req) + (let [uri ^String (:uri req) method (:request-method req)] (cond (and (.startsWith uri (str base "/test"))