Bayeux (COMET or long-polling) protocol server as a Sinatra application. Light weight and high scalability are achieved by using the asynchronous Rack extensions added to Thin by async_sinatra.
Because it uses async_sinatra, which uses EventMachine, it won't work in Passenger. Sorry about that, but Apache doesn't really like long-polling anyhow. Use Thin.
You can see a video presentation of this code here: www.youtube.com/watch?v=Bhj9QOfNd4c
class MyServer < Bayeux configure do # The default :public is inside the Bayeux gem set :public, File.dirname(__FILE__) end def deliver message case channel_name = message['channel'] when '/my/interesting/channel'
data = message['data'] if data == 'ping' publish :channel => channel_name, :data => 'pong' else super end
end end end
gem install bayeux-rack
The MIT license.
Fork on github github.com/cjheath/bayeux-rack or just clone to play:
git clone git://github.com/cjheath/bayeux-rack.git
Patches welcome! Fork and send a pull request. Please follow coding conventions already in use. Please use jslint if you can. There are currently no warnings, please keep it that way.
Current release has a happy path (working ok). Significant drawbacks to be fixed are:
Server-side timeout of long-polls to avoid possible loss of sent messages
Detecting multiple connections (tabs?) from the same browser, to fall back to callback polling.