sinatra-rocketio
================
* Node.js like I/O plugin for Sinatra.
* Automatically selects from Comet and WebSocket.
* https://github.com/shokai/sinatra-rocketio
* https://github.com/shokai/sinatra-rocketio/wiki
* [Handle 10K+ clients on 1 process](https://github.com/shokai/sinatra-websocketio/wiki/C10K)
Installation
------------
% gem install sinatra-rocketio
Requirements
------------
* Ruby 1.8.7 or 1.9.2 or 1.9.3 or 2.0.0
* Sinatra 1.3.0+
* [EventMachine](http://rubyeventmachine.com)
* [jQuery](http://jquery.com)
Usage
-----
### Server --(WebSocket/Comet)--> Client
Server Side
```ruby
require 'sinatra'
require 'sinatra/rocketio'
set :cometio, :timeout => 120, :post_interval => 2
set :websocketio, :port => 8080
set :rocketio, :websocket => true, :comet => true # enable WebSocket and Comet
run Sinatra::Application
```
```ruby
io = Sinatra::RocketIO
io.push :temperature, 35 # to all clients
io.push :light, {:value => 150}, {:to => session_id} # to specific client
```
Client Side
```html
```
```javascript
var io = new RocketIO().connect();
io.on("temperature", function(value){
console.log("server temperature : " + value);
}); // => "server temperature : 35"
io.on("light", function(data){
console.log("server light sensor : " + data.value);
}); // => "server light sensor : 150"
```
### Client --(WebSocket/Ajax)--> Server
Client Side
```javascript
io.on("connect", function(){
io.push("chat", {name: "shokai", message: "hello"}); // client -> server
});
```
Server Side
```ruby
io.on :chat do |data, client|
puts "#{data['name']} : #{data['message']} <#{client.session}> type:#{client.type}"
end
## => "shokai : hello <12abcde345f6g7h8ijk> type:websocket"
```
### On "connect" Event
Client Side
```javascript
io.on("connect", function(){
alert("connect!! "+io.session);
});
```
Server Side
```ruby
io.on :connect do |client|
puts "new client <#{client.session}> type:#{client.type}"
io.push :hello, "hello new client!!"
end
io.on :disconnect do |client|
puts "client disconnected <#{client.session}> type:#{client.type}"
end
```
### On "error" Event
Client Side
```javascript
io.on("error", function(err){
console.error(err);
});
```
### Remove Event Listener
Server Side
```ruby
event_id = io.on :chat do |data, client|
puts "chat #{data} - from:#{client.session} type:#{client.type}"
end
io.removeListener event_id
```
or
```ruby
io.removeListener :chat # remove all "chat" listener
```
Client Side
```javascript
var event_id = io.on("error", function(err){
console.error("RocketIO error : "err);
});
io.removeListener(event_id);
```
or
```javascript
io.removeListener("error"); // remove all "error" listener
```
### Chanel
make client groups.
Client Side
```javascript
var io = new RocketIO({channel: "ch1"}).connect(); // set channel "ch1"
io.on("connect", function(){
io.push("hi", "haaaaaaaai!!");
});
io.on("announce", function(msg){
alert(msg);
// => alert "new client a1b2cde345fg in ch1"
});
```
Server Side
```ruby
io = Sinatra::RocketIO
io.on :connect do |client|
msg = "new client #{client.session} in #{client.channel}"
io.push :announce, msg, :channel => client.channel # to all clients in Channel "ch1"
end
io.on :hi do |msg, client|
puts "client says #{msg} (channel:#{client.channel})"
# => "client says haaaaaaaai!! (channel:ch1)"
end
```
Sample App
----------
chat app
- https://github.com/shokai/sinatra-rocketio/tree/master/sample
- https://github.com/shokai/rocketio-chat-sample
- https://github.com/shokai/rocketio-arduino-sample
Test
----
% gem install bundler
% bundle install
start server
% rake test_server
run test
% rake test
Contributing
------------
1. Fork it
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create new Pull Request