Sunshowers - Web Sockets for Ruby, Rack+Rainbows!

Sunshowers is a Ruby library for Web Sockets. It exposes an easy-to-use
API that may be used in both clients and servers. On the server side,
it is designed to work with Rack::Request and Rainbows! concurrency
models that expose a synchronous application flow. On the client side,
it may be used as a standalone wrapper for IO-like objects.

It appears works well with the echo_client.py example shipped with
pywebsocket. It has not been tested against normal web browsers, though
there’s no reason it shouldn’t work.

== Features

  • supports reads and writes of both UTF-8 and binary Web Socket frames

  • compatible with Revactor, Rainbows::Fiber::IO and core Ruby IO objects

  • pure Ruby implementation, should be highly portable, tested under 1.9

== Install

You may download the tarball from the Rainbows! project page on
Rubyforge
and run setup.rb after unpacking it:

http://rubyforge.org/frs/?group_id=8977

You may also install it via RubyGems on Gemcutter:

gem install sunshowers

== Usage

Make sure you’re using one of the following concurrency models
for Rainbows!:

  • FiberSpawn

  • FiberPool

  • Revactor

  • ThreadSpawn

  • ThreadPool

    A simple echo server example

    require “sunshowers”
    use Rack::ContentLength
    use Rack::ContentType
    run lambda { |env|
    req = Sunshowers::Request.new(env)
    if req.ws?
    req.ws_handshake!
    ws_io = req.ws_io
    ws_io.each do |record|
    ws_io.write(record)
    break if record == “Goodbye”
    end
    req.ws_quit! # Rainbows! should handle this quietly
    end
    [404, {}, []]
    }

Already using a Rack::Request-derived class? Sunshowers::WebSocket may
also be included in any Rack::Request-derived class, so you can just
open it up and include it:

class Sinatra::Request < Rack::Request
include Sunshowers::WebSocket
end

See the examples/ directory in the source tree for a client example.

Sunshowers is a Ruby library for Web Sockets. It exposes an easy-to-use
API that may be used in both clients and servers. On the server side,
it is designed to work with Rack::Request and Rainbows! concurrency
models that expose a synchronous application flow. On the client side,
it may be used as a standalone wrapper for IO-like objects.

Changes:

This release contains a small bugfix to generate the
WebSocket-Location headers correctly. Thanks to Lakshan Perera
for the report and fix.

Sunshowers is a Ruby library for Web Sockets. It exposes an easy-to-use
API that may be used in both clients and servers. On the server side,
it is designed to work with Rack::Request and Rainbows! concurrency
models that expose a synchronous application flow. On the client side,
it may be used as a standalone wrapper for IO-like objects.

Changes:

The ws_handshake! method now accepts optional headers, as
cookies should be settable during the handshake process. Header
rules are exactly the same as normal Rack response headers and
typically a Hash with String keys and newline-delimited values.

Sunshowers::IO#gets now discards binary frames as dictated by
the current IETF draft specification (66). Setting
Sunshowers::IO#keep_binary=true will revert to the old (and
hopefully future) behavior on a per-object basis. Do not expect
the +keep_binary+ member of Sunshowers::IO Struct to become part
of the a stable API.