1. WebSockets in Ruby
(and things you can do with them)
Ismael Celis @ismasan github.com/ismasan
new bamboo
new-bamboo.co.uk pusherapp.com
Friday, 19 November 2010
6. "x00Hello Worldxff"
Mensajes
// Incoming server message
socket.onmessage = function (evt) {
alert( evt.data )
};
// Send message to server
socket.send("Hello server, this is a new client");
Friday, 19 November 2010
7. (Ruby) WebSockets server
•Hablar WebSockets (handshake)
•Mantener conexiones abiertas
•Rendimiento
•Escalable
•Threads? Eventos?
Friday, 19 November 2010
8. EventMachine rubyeventmachine.com
require 'eventmachine'
module EchoServer
def receive_data(data)
send_data data
end
end
EventMachine::run {
EventMachine::start_server 'localhost', 8080, EchoServer
puts 'running echo server on 8080'
}
Friday, 19 November 2010
11. Multicast - subscribers
# Server
socket.onopen {
@channel.subscribe socket
}
class Channel
def initialize
@sockets = []
end
def subscribe( socket )
@sockets << socket
end
...
end
Friday, 19 November 2010
12. Multicast - channel
class Channel
...
def subscribe( socket )
@sockets << socket
end
def send_message( msg )
@sockets.each do |socket|
socket.send msg
end
end
def unsubscribe( socket )
@sockets.delete socket
end
end
Friday, 19 November 2010
13. Multicast - ejemplo
var socket = new WebSocket('ws://localhost:8080');
socket.onmessage = function( evt ) {
$('<li>')
.text(evt.data)
.appendTo('#messages');
}
<ul id="messages">
</ul>
HTML
Javascript
Friday, 19 November 2010
37. pusherapp.com
var socket = new Pusher('293d8ae77496e1fc053b');
// Subscribe to channels
var channel = socket.subscribe( 'test' );
channel.bind( 'new_message', function (data) {
alert( data.message );
})
Friday, 19 November 2010
38. pusherapp.com
// Subscribe to PRESENCE channel
var chat = socket.subscribe( 'presence-chat' );
// Listen to new members
chat.bind( 'pusher:member_added', function (member) {
alert( member.user_data.name );
})
Friday, 19 November 2010
39. require 'pusher'
require 'sinatra'
post '/messages' do
message = Message.create(params[:message])
Pusher['presence-chat'].trigger(:new_message, message.attributes)
redirect '/messages'
end
pusherapp.com
$ gem install pusher
Friday, 19 November 2010
42. Widgets
var chat = pusher.subscribe('presence-chat');
new Widgets.Messages( chat ); new Widgets.Members( chat );
new Widgets.SoundAlerts( chat );
Friday, 19 November 2010
43. Widgets
Widgets.Messages = function (chat) {
/*------------------------------------------------------
Listen to messages
-------------------------------------------------------*/
chat.bind( 'message', function (message) {
$('<li>')
.text(message.user + ' dice: ' + message.body)
.appendTo('#messages');
});
}
// new Widgets.Messages( chat );
Friday, 19 November 2010