-
Notifications
You must be signed in to change notification settings - Fork 4
/
README.aleph
70 lines (45 loc) · 2.14 KB
/
README.aleph
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
Aleph is a framework for asynchronous communication, built on top of "Netty":http://www.jboss.org/netty and "Lamina":http://github.com/ztellman/lamina. It can do all kinds of things, including:
h4. HTTP Server
Aleph conforms to the interface described by "Ring":http://github.com/mmcgrana/ring, with one small difference: the request and response are decoupled.
<pre><code>(use 'lamina.core 'aleph.http)
(defn hello-world [channel request]
(enqueue channel
{:status 200
:headers {"content-type" "text/html"}
:body "Hello World!"}))
(start-http-server hello-world {:port 8080})
</code></pre>
h4. HTTP Client
This snippet prints out a never-ending sequence of tweets:
<pre><code>(use 'lamina.core 'aleph.http)
(let [ch (:body
(sync-http-request
{:method :get
:basic-auth ["aleph_example" "_password"]
:url "http://stream.twitter.com/1/statuses/sample.json"}))]
(doseq [tweet (lazy-channel-seq ch)]
(println tweet)))
</code></pre>
A more in-depth exploration of this example can be found "here":http://github.com/ztellman/aleph/wiki/Consuming-a-Twitter-Stream.
h4. WebSocket
Making a simple chat client is trivial. In this, we assume that the first message sent by the client is the user's name:
<pre><code>(use 'lamina.core 'aleph.http)
(def broadcast-channel (channel))
(defn chat-handler [ch handshake]
(receive ch
(fn [name]
(siphon (map* #(str name ": " %) ch) broadcast-channel)
(siphon broadcast-channel ch))))
(start-http-server chat-handler {:port 8080 :websocket true})
</code></pre>
h4. TCP Client/Server
Here is a basic echo server:
<pre><code>(use 'lamina.core 'aleph.tcp)
(defn echo-handler [channel client-info]
(siphon channel channel))
(start-tcp-server echo-handler {:port 1234})
</code></pre>
--
Other protocols are supported, and still more are forthcoming.
Aleph is meant to be a sandbox for exploring how Clojure can be used effectively in this context. Contributions and ideas are welcome.
A mailing list can be found "here":http://groups.google.com/group/aleph-lib, and API documentation "here":http://ztellman.github.com/aleph/aleph-api.html.