======================== Akka Whiteboard ======================== What is it? ------------------------ This is a web application that implements a shared whiteboard using HTML5 canvas and websockets. It requires a modern browser that supports websockets such as Firefox 11, Chrome 16, Safari 6, or IE10. You can also use it on recent iOS devices using HTML5 touch events. It's very message-intensive so you should probably run it on a fast network. Running over the WAN can be a bit laggy. Running it ------------------------ ``$ cd akka_whiteboard`` ``$ sbt run`` Then point your browser to http://localhost:9000/, or get your IP and point your tablet/phone to http://<your-ip>:9000/ Architecture ------------------------ This application has a liberal use of akka actors. There is one Master websocket actor acts as a singleton. It creates a child websocket actor for every connected client. The master object is very simple, and it just broadcasts JsObject messages to each client. The client websocket Actors are also very simple, translating websocket messages in Play's Enumerator/Iteratee interface to/from Akka messages:: +----------+ +------- | master | -----+ | +----+-----+ | | | +---------+ +--------+ +---------+ | child | | child | | child | +---------+ +--------+ +---------+ | | | | websocket websocket websocket | | | v v v +---------+ +---------+ +---------+ | browser | | browser | | browser | +---------+ +---------+ +---------+ On the Javascript side, touch/draw events are put into JSON objects and sent down the socket. When the other connected clients receive these messages, they draw them on the screen. I've written a few unit tests integrating specs2 with Akka and play to test the differnet components. The tests are written with an aim to be helpful in future projects, not necessarily to be complete for this project. Architecture Continued -------------------------- It might be more simple to forego the Actors and just keep a list of Enumerator/Iteratee pairs of connected clients, but that ties the application to a single machine. The current implementation would be the simplest way to run on multiple machines (with a few changes). Websockets are used to keep the javascript code clean and free of dependencies, since the focus is on the typesafe stack, but a better solution would be multi-protocol solution using something like socket.io Also there's no real user management or message verification/authentication, again to keep the code simple. A more robust solution would add these layers.