Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

asynchronous communication for clojure

branch: udp

This branch is 0 commits ahead and 217 commits behind clj-1.3

Fetching latest commit…

Cannot retrieve the latest commit at this time

README.textile

Aleph is a framework for asynchronous communication, built on top of Netty and Lamina. It can do all kinds of things, including:

HTTP Server

Aleph conforms to the interface described by Ring, with one small difference: the request and response are decoupled.

(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})

HTTP Client

This snippet prints out a never-ending sequence of tweets:

(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)))

A more in-depth exploration of this example can be found here.

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:

(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})

TCP Client/Server

Here is a basic echo server:

(use 'lamina.core 'aleph.tcp)
	
(defn echo-handler [channel client-info]
  (siphon channel channel))

(start-tcp-server echo-handler {:port 1234})

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, and API documentation here.

Something went wrong with that request. Please try again.