Websocket interface on Rack Hijack w/ Rails support
Ruby
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
lib
test
.gitignore
.travis.yml
Gemfile
LICENSE.txt
README.md
Rakefile
tubesock.gemspec

README.md

Tubesock

Build Status Code Climate Codeship Status for ngauthier/tubesock

Tubesock lets you use websockets from rack and rails 4+ by using Rack's new hijack interface to access the underlying socket connection.

In contrast to other websocket libraries, Tubesock does not use a reactor (read: no eventmachine). Instead, it leverages Rails 4's new full-stack concurrency support. Note that this means you must use a concurrent server. We recommend Puma > 2.0.0.

Installation

Add this line to your application's Gemfile:

gem 'tubesock'

And then execute:

$ bundle

Or install it yourself as:

$ gem install tubesock

Usage

Rack

To use Tubesock with rack, you need to hijack the rack environment and then return an asynchronous response. For example:

require 'tubesock'

class Server
  def call(env)
    if env["HTTP_UPGRADE"] == 'websocket'
      tubesock = Tubesock.hijack(env)
      tubesock.onmessage do |message|
        puts "Got #{message}"
      end
      tubesock.listen
      [ -1, {}, [] ]
    else
      [404, {'Content-Type' => 'text/plain'}, ['Not Found']]
    end
  end
end

Then you could do the following in your config.ru file to use this class:

run Server.new

Rails 4+

On Rails 4 there is a module you can use called Tubesock::Hijack. In a controller:

class ChatController < ApplicationController
  include Tubesock::Hijack

  def chat
    hijack do |tubesock|
      tubesock.onopen do
        tubesock.send_data "Hello, friend"
      end

      tubesock.onmessage do |data|
        tubesock.send_data "You said: #{data}"
      end
    end
  end
end

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