sockets and rails
DESCRIPTION
Using websockets with rails, and also using node servers with rails.TRANSCRIPT
Rails and Sockets
Websocket Rails Gem
https://github.com/websocket-rails/websocket-rails
Steps● Add Gem “websocket-rails”● bundle install● rails g websocket_rails:install● config.middleware.delete Rack::Lock● rails server
B
Client
var dispatcher = new WebSocketRails('localhost:3000/websocket');
Initialize the socket
File: application.js
Bind for changes
channel = dispatcher.subscribe('posts');channel.bind('new', function(data) { console.log('a new post about '+data.title+' arrived!');});
File: application.js
Server
rails g scaffold posts title:string description:string
In some_action (create) WebsocketRails[:posts].trigger 'new', latest_post
File: posts_controller create action
Events from clients
Event Router - Clientvar success = function(res) { console.log("Created: " + res.post.title); }
var failure = function(res) { console.log("Failed to create post: " + res)}
dispatcher.trigger(‘create_event', post, success, failure);
File: application.js
Event Router - Server
WebsocketRails::EventMap.describe do
# using a Hash to specify the target
subscribe :create_event, 'sockets#create_from_socket'
end
File: config/events.rb
class SocketsController < WebsocketRails::BaseController def create_from_socket post = Post.new message if post.save trigger_success post: post else trigger_failure post: post.errors end end
end
Event Router - Server
File: sockets_controller
● sinatra-websocket
● webmachine-ruby
● faye-websocket
● tubesock
Few more!
Rails and Node
http://liamkaufman.com/blog/2013/02/27/adding-real-time-to-a-restful-rails-app/
Basic Flow
Node and Redis
Prerequisites
Setting up Rails Server
gem 'redis'gem 'socket.io-rails'
File: gemfile
Initializing Redis on Server
$redis = Redis.new(:host => 'localhost', :port=> 6379)
File: initializers/redis_init.rb (manually_created)
$redis.publish 'rt-change', @post.to_json
Publishing from rails to a channel
File: posts_controller.rb
Setting up Node ServerListen and subscribe to changes in rt-change (rails)
channel
var io = require('socket.io').listen(5001),redis = require('redis').createClient();redis.subscribe('rt-change');io.on('connection', function(soc){ console.log(soc.id); });});
File: app/<folder>/<file-name>.js
Setting up Node Server
Publishing changes to client channel
redis.on('message', function(channel, message){io.sockets.emit('client-channel',JSON.parse(message));
});
File: app/<folder>/<file-name>.js
Setting up Rails Client
Include //= require socket.io in application.js
socket = io.connect("http://0.0.0.0:5001");socket.on("client-channel", function(message){
alert(message);});
File: application.js
Rails - rails sNode - node <folder>/<file-name>.js
Start the servers
File: app/<folder>/<file-name>.js
redis_pub = require('redis').createClient();redis_pub.publish('my_callback', JSON.parse(message));
Callback from node
File: app/<folder>/<file-name>.js
$redis.subscribe("my_callback") do |on| on.message do |channel, message| puts message.to_s end end
A task to listen on callbacks from node
File: app/lib/tasks/<file-name>.rake
Load distribution.
Easy integration with APNS,MPNS and GCM services.
Also has queuing systems.
Advantages
Few ways to manage node server
Forever - https://github.com/nodejitsu/forever
PM2 - https://github.com/Unitech/pm2
Questions?
https://github.com/shrikanthkr/wsrailshttps://github.com/shrikanthkr/redis-socketio
Samples
Thank You!