Skip to content

Commit 62f9017

Browse files
committed
in-server websockets working
1 parent 40c6354 commit 62f9017

6 files changed

Lines changed: 111 additions & 20 deletions

File tree

rxjava/expt1/src/expt1/core.clj

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
(:gen-class)
88
)
99

10-
11-
1210
(defn -main
1311
"I don't do a whole lot ... yet."
1412
[& args]

rxjava/expt1/src/expt1/k1.clj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@
8888
(defn ^Subscription subscription
8989
"Create a new subscription that calls the given no-arg handler function"
9090
[handler]
91+
;; (Subscriptions .create ???)
9192
(Observable/createSubscription handler))
9293

9394
(defn chain

ws-intro/index.html

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,19 @@ <h1>WebSocket Demo</h1>
1111
</script>
1212
<script>
1313
var ws = $.websocket("ws://127.0.0.1:8080/websocket", {
14-
events: {
15-
upcased: function(e) { $("#content").html(e.message); }}});
14+
events: {
15+
upcased: function(e) { $("#content").html('UPCASED: ' + e.message); },
16+
normal: function(e) { $("#content").html('NORMAL: ' + e.message); }
17+
}
18+
});
1619

17-
$('#message').change(function(){
18-
ws.send('message', {type: "downcase", message: $("#message").val()});});
20+
$('#message').change(function() {
21+
ws.send(
22+
'message',
23+
{type: "downcase",
24+
message: $("#message").val()}
25+
);
26+
});
1927
</script>
2028
</body>
2129
</html>

ws-intro/project.clj

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
:license {:name "Eclipse Public License"
66
:url "http://www.eclipse.org/legal/epl-v10.html"}
77
:repl-options {:init-ns ws-intro.core}
8-
:dependencies [[org.clojure/clojure "1.5.1" ]
9-
[org.webbitserver/webbit "0.4.14"]
10-
[org.clojure/data.json "0.2.2" ]
8+
:dependencies [[org.clojure/clojure "1.5.1" ]
9+
[org.slf4j/slf4j-log4j12 "1.7.5" ]
10+
[com.netflix.rxjava/rxjava-clojure "0.7.0" ]
11+
[org.webbitserver/webbit "0.4.14"]
12+
[org.clojure/data.json "0.2.2" ]
1113
])

ws-intro/src/ws_intro/core.clj

Lines changed: 69 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,77 @@
11
(ns ws-intro.core
22
(:require [clojure.data.json :as json]
3-
[clojure.string :as s])
4-
(:import [org.webbitserver WebServer WebServers WebSocketHandler]
5-
[org.webbitserver.handler StaticFileHandler]))
3+
[clojure.string :as s]
4+
[clojure.pprint :as pp])
5+
(:import [org.webbitserver WebServer WebServers WebSocketHandler]
6+
[org.webbitserver.handler StaticFileHandler ]
7+
[rx Observable Observer Subscription ]
8+
[rx.subscriptions Subscriptions ]
9+
[rx.util AtomicObservableSubscription ]
10+
))
11+
12+
;;; ================================================================
13+
14+
(defn ^Observable observable
15+
"Create an observable from the given handler. When subscribed to, (handler observer)
16+
is called at which point, handler can start emitting values, etc."
17+
[handler]
18+
(Observable/create handler))
19+
20+
(defn getMock [] (json/read-str (slurp "traffic.json")))
21+
22+
(defn mockObservable [mock]
23+
(observable
24+
(fn [observer]
25+
(let [f (future
26+
(-> observer (.onNext "1"))
27+
(Thread/sleep 1000)
28+
(-> observer (.onNext "2"))
29+
(Thread/sleep 1000)
30+
(-> observer (.onNext "3"))
31+
(-> observer (.onCompleted)))
32+
]
33+
(Subscriptions/create #(future-cancel f))))))
34+
35+
;;; ================================================================
36+
37+
(defn on-message [conn json-message]
38+
(println "WEBSOCKET MESSAGE" conn json-message)
39+
(let [msg (->
40+
json-message
41+
json/read-json
42+
(get-in [:data :message]))]
43+
(.send conn (json/json-str
44+
{:type "upcased"
45+
:message (s/upper-case msg)}))
46+
))
647

748
(defn -main []
849
"Thanks to blog.jayfields.com"
9-
(doto (WebServers/createWebServer 8080)
10-
(.add "/websocket"
11-
(proxy [WebSocketHandler] []
12-
(onOpen [c ] (println "websocket opened" c))
13-
(onClose [c ] (println "websocket closed" c))
14-
(onMessage [c j] (println "websocket message" c j))))
15-
(.add (StaticFileHandler. "."))
16-
(.start)))
50+
(pp/pprint (getMock))
51+
(let [server (WebServers/createWebServer 8080)]
52+
(doto server
53+
(.add "/websocket"
54+
(proxy [WebSocketHandler] []
55+
56+
(onOpen [conn]
57+
(println "WEBSOCKET OPENED" conn)
58+
(-> (mockObservable (getMock))
59+
(.subscribe
60+
println
61+
))
62+
)
63+
64+
(onClose [c ]
65+
(println "WEBSOCKET CLOSED" c)
66+
)
67+
68+
(onMessage [c j]
69+
;(println "WEBSOCKET MESSAGE" c j)
70+
(on-message c j)
71+
)
72+
))
73+
(.add (StaticFileHandler. "."))
74+
(.start))))
1775

1876
(defn foo
1977
"I don't do a whole lot."

ws-intro/traffic.json

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"hitRateAggs" : [{ "domain" : "vendorinfoportal.amazon.com", "hitsPerSec": "3.1"},
3+
{ "domain" : "w.amazon.com", "hitsPerSec": "1.2"},
4+
{ "domain" : "cr.amazon.com", "hitsPerSec": ".2"},
5+
{ "domain" : "external", "hitsPerSec": "5.6"},
6+
{ "domain" : "vendormaster.amazon.com", "hitsPerSec": "2.5"},
7+
{ "domain" : "permissions.amazon.com", "hitsPerSec": ".3"},
8+
{ "domain" : "devcentral.amazon.com", "hitsPerSec": ".2"},
9+
{ "domain" : "build.amazon.com", "hitsPerSec": "0"}],
10+
11+
"referralMatrix" : [{ "from" : "vendorinfoportal.amazon.com", "to" : "vendorinfoportal.amazon.com", "refsPerSec" : "2.0"},
12+
{ "from" : "vendorinfoportal.amazon.com", "to" : "w.amazon.com", "refsPerSec" : ".2"},
13+
{ "from" : "vendorinfoportal.amazon.com", "to" : "external", "refsPerSec" : ".3"},
14+
{ "from" : "vendorinfoportal.amazon.com", "to" : "vendormaster.amazon.com", "refsPerSec" : ".3"},
15+
{ "from" : "w.amazon.com", "to" : "w.amazon.com", "refsPerSec" : ".5"},
16+
{ "from" : "w.amazon.com", "to" : "external", "refsPerSec" : ".4"},
17+
{ "from" : "w.amazon.com", "to" : "vendorinfoportal.amazon.com", "refsPerSec" : ".1"},
18+
{ "from" : "vendormaster.amazon.com", "to" : "vendormaster.amazon.com", "refsPerSec" : "1.5"},
19+
{ "from" : "vendormaster.amazon.com", "to" : "w.amazon.com", "refsPerSec" : ".1"},
20+
{ "from" : "vendormaster.amazon.com", "to" : "external", "refsPerSec" : ".3"},
21+
{ "from" : "permissions.amazon.com", "to" : "permissions.amazon.com", "refsPerSec" : ".2"},
22+
{ "from" : "devcentral.amazon.com", "to" : "devcentral.amazon.com", "refsPerSec" : ".05"}
23+
]
24+
}

0 commit comments

Comments
 (0)