Skip to content

Commit aefca96

Browse files
committed
CHANGELOG
1 parent 288bee6 commit aefca96

File tree

5 files changed

+118
-75
lines changed

5 files changed

+118
-75
lines changed

CHANGELOG.md

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,16 @@
22

33
## Added
44

5-
## Fixed
5+
- Support multiple formats, add `/?content-type=json|edn|transit` to the
6+
websocket URL. Still defaults to transit.
67

78
## Changed
89

9-
# 1.4.71 (2021-12-16 / 6ae91b0)
10-
11-
## Added
10+
- Remove pedestal.log
1211

13-
## Fixed
12+
# 1.4.71 (2021-12-16 / 6ae91b0)
1413

15-
## Changed
14+
- Testing, tooling, docs updates
1615

1716
# 0.1.42 (2020-08-26 / 4c14cec)
1817

@@ -41,4 +40,4 @@
4140

4241
- First prerelease version, implements `:funnel/whoami`, `:funnel/subscribe`,
4342
`:funnel/unsubscribe`, `:funnel/broadcast`, `:funnel/query`.
44-
- Selectors: `true`, vector, map.
43+
- Selectors: `true`, vector, map.

bb.edn

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{:deps
22
{lambdaisland/open-source {:git/url "https://github.com/lambdaisland/open-source"
3-
:git/sha "bf256a0b6beafc9f0db59e23cfebc566b0643a17"}}}
3+
:git/sha "28c67d7eff0dc1c38dffcff3f6c91f0aac2713c8"}}}

deps.edn

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
11
{:paths ["src" "lib"]
22

33
:deps
4-
{org.clojure/clojure {:mvn/version "1.10.3"}
5-
org.java-websocket/Java-WebSocket {:mvn/version "1.5.2"}
6-
org.clojure/tools.cli {:mvn/version "1.0.206"}
7-
io.pedestal/pedestal.log {:mvn/version "0.5.9"}
8-
org.slf4j/slf4j-jdk14 {:mvn/version "1.7.32"}
9-
org.clojure/core.async {:mvn/version "1.5.648"}
10-
com.cognitect/transit-clj {:mvn/version "1.0.324"
11-
:exclusions [org.msgpack/msgpack]}}
4+
{org.java-websocket/Java-WebSocket {:mvn/version "1.6.0"}
5+
org.clojure/tools.cli {:mvn/version "1.1.230"}
6+
org.slf4j/slf4j-jdk14 {:mvn/version "2.0.17"}
7+
org.clojure/core.async {:mvn/version "1.7.701"}
8+
com.cognitect/transit-clj {:mvn/version "1.0.333"
9+
:exclusions [org.msgpack/msgpack]}
10+
com.cnuernber/charred {:mvn/version "1.036"}}
1211

1312
:aliases
1413
{:test
1514
{:extra-paths ["test"]
16-
:extra-deps {lambdaisland/kaocha {:mvn/version "1.60.945"}
17-
nubank/matcher-combinators {:mvn/version "3.3.1"}}}
15+
:extra-deps {lambdaisland/kaocha {:mvn/version "1.91.1392"}
16+
nubank/matcher-combinators {:mvn/version "3.9.1"}}}
1817

1918
:main
2019
{:main-opts ["-m" "lambdaisland.funnel"]}
@@ -27,7 +26,7 @@
2726
"--initialize-at-run-time=lambdaisland.funnel.Daemon"
2827
"--no-fallback"
2928
"--enable-https"
30-
"--allow-incomplete-classpath"
29+
"-H:+UnlockExperimentalVMOptions"
3130
"-H:Name=funnel"
3231
"-H:Log=registerResource"
3332
"-H:ResourceConfigurationFiles=resource-config.json"
@@ -36,10 +35,10 @@
3635
"-Djava.library.path=lib"
3736
"-H:JNIConfigurationFiles=graal_jni.json"
3837
"-H:+ReportExceptionStackTraces"
38+
"--trace-object-instantiation=com.sun.jmx.mbeanserver.JmxMBeanServer"
3939
#_"--report-unsupported-elements-at-runtime"]
4040
:jvm-opts ["-Dclojure.compiler.direct-linking=true"]
4141
:extra-deps
42-
{com.lambdaisland/clj.native-image {:git/sha "373af196d156659c78a387986b6f3b9bfd542259"
42+
{com.lambdaisland/clj.native-image {:git/sha "836d24a92705f2ff556709ec40ea26a0d5c8dffa"
4343
:git/url "https://github.com/lambdaisland/clj.native-image"}
44-
org.clojure/tools.deps.alpha {:mvn/version "0.7.516"
45-
:exclusions [org.slf4j/slf4j-nop]}}}}}
44+
}}}}

src/lambdaisland/funnel.clj

Lines changed: 76 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,42 @@
11
(ns lambdaisland.funnel
22
(:gen-class)
3-
(:require [clojure.core.async :as async]
4-
[clojure.java.io :as io]
5-
[clojure.pprint :as pprint]
6-
[clojure.tools.cli :as cli]
7-
[cognitect.transit :as transit]
8-
[io.pedestal.log :as log]
9-
[lambdaisland.funnel.version :as version])
10-
(:import (com.cognitect.transit DefaultReadHandler
11-
WriteHandler)
12-
(java.io ByteArrayInputStream
13-
ByteArrayOutputStream
14-
FileInputStream
15-
FileOutputStream
16-
PrintStream
17-
IOException)
18-
(java.net InetSocketAddress Socket)
19-
(java.nio ByteBuffer)
20-
(java.nio.file Files Path Paths)
21-
(java.security KeyStore)
22-
(java.util Comparator)
23-
(javax.net.ssl SSLContext
24-
KeyManagerFactory)
25-
(lambdaisland.funnel Daemon)
26-
(org.java_websocket WebSocket
27-
WebSocketAdapter
28-
WebSocketImpl)
29-
(org.java_websocket.drafts Draft_6455)
30-
(org.java_websocket.handshake Handshakedata)
31-
(org.java_websocket.handshake ClientHandshake)
32-
(org.java_websocket.server DefaultWebSocketServerFactory
33-
DefaultSSLWebSocketServerFactory
34-
WebSocketServer)
35-
(sun.misc Signal)))
3+
(:require
4+
[clojure.core.async :as async]
5+
[clojure.edn :as edn]
6+
[clojure.java.io :as io]
7+
[clojure.pprint :as pprint]
8+
[clojure.tools.cli :as cli]
9+
[cognitect.transit :as transit]
10+
[charred.api :as charred]
11+
[lambdaisland.funnel.log :as log]
12+
[lambdaisland.funnel.version :as version])
13+
(:import
14+
(com.cognitect.transit DefaultReadHandler
15+
WriteHandler)
16+
(java.io ByteArrayInputStream
17+
ByteArrayOutputStream
18+
FileInputStream
19+
FileOutputStream
20+
PrintStream
21+
IOException)
22+
(java.net InetSocketAddress Socket)
23+
(java.nio ByteBuffer)
24+
(java.nio.file Files Path Paths)
25+
(java.security KeyStore)
26+
(java.util Comparator)
27+
(javax.net.ssl SSLContext
28+
KeyManagerFactory)
29+
(lambdaisland.funnel Daemon)
30+
(org.java_websocket WebSocket
31+
WebSocketAdapter
32+
WebSocketImpl)
33+
(org.java_websocket.drafts Draft_6455)
34+
(org.java_websocket.handshake Handshakedata)
35+
(org.java_websocket.handshake ClientHandshake)
36+
(org.java_websocket.server DefaultWebSocketServerFactory
37+
DefaultSSLWebSocketServerFactory
38+
WebSocketServer)
39+
(sun.misc Signal)))
3640

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

@@ -71,7 +75,10 @@
7175
(when (and (vector? e) (= ::error (first e)))
7276
(second e)))
7377

74-
(defn to-transit [value]
78+
(defmulti encode (fn [format value] format))
79+
(defmulti decode (fn [format value] format))
80+
81+
(defmethod encode :transit [_ value]
7582
(try
7683
(let [out (ByteArrayOutputStream. 4096)
7784
writer (transit/writer out :json {:handlers {TaggedValue tagged-write-handler}})]
@@ -80,14 +87,26 @@
8087
(catch Exception e
8188
[::error e])))
8289

83-
(defn from-transit [^String transit]
90+
(defmethod decode :transit [_ ^String transit]
8491
(try
8592
(let [in (ByteArrayInputStream. (.getBytes transit))
8693
reader (transit/reader in :json {:default-handler tagged-read-handler})]
8794
(transit/read reader))
8895
(catch Exception e
8996
[::error e])))
9097

98+
(defmethod encode :edn [_ value]
99+
(pr-str value))
100+
101+
(defmethod decode :edn [_ ^String edn]
102+
(edn/read-string edn))
103+
104+
(defmethod encode :json [_ value]
105+
(charred/write-json-str value))
106+
107+
(defmethod decode :json [_ ^String json]
108+
(charred/read-json json :key-fn keyword))
109+
91110
(defn match-selector? [whoami selector]
92111
(cond
93112
(true? selector) true
@@ -113,21 +132,17 @@
113132
(.getAttachment conn))
114133

115134
(defn handle-query [conn selector conns]
116-
(let [msg (to-transit
117-
{:funnel/clients
118-
(map (comp :whoami val)
119-
(filter
120-
(fn [[c m]]
121-
(and (match-selector? (:whoami m) selector)
122-
(not= c conn)))
123-
conns))})]
124-
(if-let [e (maybe-error msg)]
125-
(log/error :query-encoding-failed {:selector selector :conns (vals conns)} :exception e)
126-
(async/>!! (outbox conn) msg))))
135+
(let [msg {:funnel/clients
136+
(map (comp :whoami val)
137+
(filter
138+
(fn [[c m]]
139+
(and (match-selector? (:whoami m) selector)
140+
(not= c conn)))
141+
conns))}]
142+
(async/>!! (outbox conn) msg)))
127143

128144
(defn handle-message [state ^WebSocket conn raw-msg]
129-
(let [msg (from-transit raw-msg)
130-
inbox (:inbox (.getAttachment conn))]
145+
(let [msg (decode (get-in @state [conn :format]) raw-msg)]
131146
(when-let [e (maybe-error msg)]
132147
(log/warn :message-decoding-failed {:raw-msg raw-msg :desc "Raw message will be forwarded"} :exception e))
133148
(let [[msg broadcast]
@@ -146,10 +161,9 @@
146161
(when-let [selector (:funnel/query msg)]
147162
(handle-query conn selector @state))
148163

149-
[(to-transit
150-
(if-let [whomai (:whoami (get @state conn))]
151-
(assoc msg :funnel/whoami whomai)
152-
msg))
164+
[(if-let [whomai (:whoami (get @state conn))]
165+
(assoc msg :funnel/whoami whomai)
166+
msg)
153167
(:funnel/broadcast msg)]))]
154168
(if-let [e (maybe-error msg)]
155169
(log/error :message-encoding-failed {:msg msg} :exception e)
@@ -162,8 +176,15 @@
162176

163177
(defn handle-open [state ^WebSocket conn handshake]
164178
(log/info :connection-opened {:remote-socket-address (.getRemoteSocketAddress conn)})
165-
(let [outbox (async/chan 8 #_(map #(doto % prn)))]
179+
(let [path (.getResourceDescriptor conn)
180+
format (case path
181+
"/?content-type=json" :json
182+
"/?content-type=edn" :edn
183+
"/?content-type=transit" :transit
184+
:transit)
185+
outbox (async/chan 8 (map (partial encode format)))]
166186
(.setAttachment conn outbox)
187+
(swap! state assoc-in [conn :format] format)
167188
(async/go-loop []
168189
(when-let [^String msg (async/<! outbox)]
169190
(when (.isOpen conn)
@@ -430,4 +451,6 @@
430451
(intern 'user 'foo 123)
431452

432453
(log/error :foo :bar :exception (Exception. "123"))
454+
455+
(start-servers {:ws-port 2234 :wss-port 2235})
433456
)

src/lambdaisland/funnel/log.clj

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
(ns lambdaisland.funnel.log
2+
"Minimal logging shim to replace pedestal.log, since it pulls in stuff that's
3+
not GraalVM compatible."
4+
(:import
5+
(java.util.logging Logger Level)))
6+
7+
(def ^Logger logger (Logger/getLogger "lambdaisland.funnel"))
8+
9+
(defn error [& kvs]
10+
(.log logger Level/SEVERE (pr-str (apply array-map kvs))))
11+
12+
(defn warn [& kvs]
13+
(.log logger Level/WARNING (pr-str (apply array-map kvs))))
14+
15+
(defn info [& kvs]
16+
(.log logger Level/INFO (pr-str (apply array-map kvs))))
17+
18+
(defn debug [& kvs]
19+
(.log logger Level/FINE (pr-str (apply array-map kvs))))
20+
21+
(defn trace [& kvs]
22+
(.log logger Level/FINER (pr-str (apply array-map kvs))))

0 commit comments

Comments
 (0)