Search code examples
rubysinatrawebsocketrackeventmachine

Any success with Sinatra working together with EventMachine WebSockets?


I have been using Sinatra for sometime now and I would like to add some realtime features to my web-app by pushing the data via websockets.

I have successfully used the gem 'em-websocket' on its own, but have not been able to write one ruby file that has a sinatra web server AND a web-socket server.

I've tried spinning the run! or start! methods off in separate threads with no success.

Has anyone gotten this to work?

I want to have them in the same file as I can then share variables between the two servers.


Solution

  • Did not try it, but should not be too hard:

    require 'em-websocket'
    require 'sinatra/base'
    require 'thin'
    
    EM.run do
      class App < Sinatra::Base
        # Sinatra code here
      end
    
      EM::WebSocket.start(:host => '0.0.0.0', :port => 3001) do
        # Websocket code here
      end
    
      # You could also use Rainbows! instead of Thin.
      # Any EM based Rack handler should do.
      Thin::Server.start App, '0.0.0.0', 3000
    end
    

    Also, Cramp has a websocket implementation that works directly with Thin/Rainbows! you might be able to extract, so you won't even need to run the server on another port.