BrowserChannel Ruby Server
Copyright 2011 David Turnbull. Licensed under the Apache License, Version 2.0.
An event-driven server for Google Closure Library's goog.BrowserChannel class.
Getting Started
Step 1
Ensure you have a modern Ruby and RubyGems. Version 1.8.6 and higher should work. Run:
gem install thin closure json
thin start
Step 2
Open your web browser and continue from there. Check the thin log for the proper port. It's most likely:
http://localhost:3000/
Getting to Production
The browser is started by attaching a handler to a channel. The channel then connects with a server. The handler is your implementation.
var handler = new goog.net.BrowserChannel.Handler();
handler.channelOpened = function(channel) {
// fire off a message immediately after connect
channel.sendMap({message:'data'});
};
handler.channelHandleArray = function(x, data) {
// messages from the server arrive here
alert(data[0].message);
};
channel = new goog.net.BrowserChannel();
channel.setHandler(handler);
channel.connect('demo.test', 'demo.channel');
The server is a Rack application for the thin
server. Other Rack servers do
not support event-driven multi chunk responses. Thin also enables use of the
epoll/kqueue interface which allows for tens of thousands of open connections.
Expect 500-1000 requests per second on a single core of modern hardware.
# for config.ru
require 'browser_channel'
require 'browser_test_channel'
map '/demo.channel' do
run BrowserChannel::Server.new, :handler => MyHandler
end
map '/demo.test' do
run BrowserTestChannel::Server.new
end
Just like the browser side, there's a handler for your implementation.
class MyHandler < BrowserChanner::Handler
# this is an echo server
def call post_data
requests = decode_post_data post_data
requests.each { |r| @session << [r] }
end
# called when channel session is final
def terminate
end
end
Be sure not to deploy the Closure Script build tool or debug tools like Rack::Reloader. These will severely affect performance and security. Check your middleware if you're not seeing the benchmarks you expect.