Cramp Chat Demo
This is just a proof-of-concept app to showcase Cramp’s potential.
This should install all the dependencies
gem install arel --pre gem install activemodel --pre gem install thin gem install cramp
You will need a valid hostname if you’re going to test it under your machine so edit your
/etc/hosts and add:
127.0.0.1 localhost foo.com.br
This demo uses MySQL, so you will need to create your own database. Read
config/database.sql to create it and edit
config/database.yml with the correct server, username and password.
If you want to test the WebSocket implementation outside of Google Chrome 4+, the app loads web-socket.js. As it uses Flash connection it is required that the server provides a policy file. This app uses Peleus Uhley implementation available in the
extra folder. Start it like this:
cd extra sudo python flashpolicyd.py --port 843 --file crossdomain.xml
It has to be
sudo because 843 is a privileged port. Now you need to start up the application itself:
It will start the server on the port 3000. So you can fire up a webbrowser and use either of these URLs:
The first URL is the WebSocket version. The second is a more usual Ajax Polling version, which may be more compatible with webbrowsers. As the WebSocket version uses Flash it’s less friendly to environments behind proxies and firewalls.
You can also test the server using
curl http://foo.com.br:3000/websocket curl http://foo.com.br:3000/retrieve curl -d "from=foo&msg=hello" http://foo.com.br:3000/receive
The first URL will keep an open HTTP connection, receiving new messages as they are inserted in the database. The second one retrieves the last few messages and you can pass a ‘last_timestamp’ parameter to the URL with the value having the format of
Time.now.to_formatted_s(:db). Finally, the third operation simulates a form post to add new messages. The first URL is the WebSocket version, the last 2 are the polling version.
- In the WebSocket version, sending data is not returning the expected results
- In the Polling version it is manually setting the last message’s timestamp in the URL. I was still now able to make a version using a Rack::Session
- Just because it is a proof-of-concept, it uses Rack::Static to serve the HTML and JS files, but it’s not certain that this is the best way to do it
- Up until Cramp 0.9, it depends on ActiveRecord, take a look at
- Add CSS to make the demo a little bit more compelling
- Add multiple room and user registration support, but this requires exchanging session information as well. Making Rack::Session work may be a requirement
- Add templating than just static file to allow for some HAML or ERB views, adding Tilt to Cramp would be good as well