librelist archives

« back to archive

[ANN] LMGTWTY: Web Sockets Library for Rack+Rainbows!

[ANN] LMGTWTY: Web Sockets Library for Rack+Rainbows!

From:
Eric Wong
Date:
2009-12-11 @ 11:50
LMGTWTY is a Rainbows! (and Zbatery) Rack library for Web Sockets.  It
uses unofficial extensions in rainbows.git for Rack which are subject to
change, but it appears to work well enough for 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.

It currently depends on the git version of Rainbows.

http://git.bogomips.org/cgit/lmgtwty.git
http://git.bogomips.org/cgit/rainbows.git

There are no releases yet, just grab from git
(install the wonderful "iobuffer" gem, too).

The API is subject to change (like Web Sockets itself (I think)).  This
was done completely on a whim tonight, with no thought or planning
beforehand.  So I can't say I'm completely happy with the API.

At least I believe I finally understand Ruby 1.9 encodings
after writing Lmgtwty::IO (having read and reread article after
article on it over the past few years)...

Mailing list is here: lmgtwty@librelist.com
Just send and email and follow instructions to subscribe.

-- 
Eric Wong

Re: [ANN] LMGTWTY: Web Sockets Library for Rack+Rainbows!

From:
Eric Wong
Date:
2009-12-13 @ 20:50
Eric Wong <normalperson@yhbt.net> wrote:
> LMGTWTY is a Rainbows! (and Zbatery) Rack library for Web Sockets.  It

This name was too hard to remember for most folks, so
I'm renaming it to Sunshowers:

  sunshowers@librelist.com

-- 
Eric Wong

Re: [ANN] LMGTWTY: Web Sockets Library for Rack+Rainbows!

From:
Eric Wong
Date:
2009-12-11 @ 11:53
Eric Wong <normalperson@yhbt.net> wrote:
> http://git.bogomips.org/cgit/lmgtwty.git
> http://git.bogomips.org/cgit/rainbows.git
> 
> There are no releases yet, just grab from git
> (install the wonderful "iobuffer" gem, too).

One more thing, for both of them, if you have RubyGems 1.3.5,
"make install-gem" works (or "make gem" and then manually
installing the file).

Of course "make install" works too if you're not worried
about uninstalling.

-- 
Eric Wong

[PATCH] env["hack.io"] for Fiber*, Revactor, Thread* models

From:
Eric Wong
Date:
2009-12-11 @ 11:59
This exposes a client IO object directly to the underlying
application.
---

  In case you already have an installation and just want to patch that,
  this is the patch I made for Rainbows! that exposes the ability to
  be used with LMGTWTY

 lib/rainbows/base.rb       |    1 +
 lib/rainbows/const.rb      |    6 ++++++
 lib/rainbows/fiber/base.rb |    1 +
 lib/rainbows/revactor.rb   |    1 +
 4 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/lib/rainbows/base.rb b/lib/rainbows/base.rb
index 424b43b..a735b82 100644
--- a/lib/rainbows/base.rb
+++ b/lib/rainbows/base.rb
@@ -43,6 +43,7 @@ module Rainbows
           buf << client.readpartial(CHUNK_SIZE)
         end
 
+        env[CLIENT_IO] = client
         env[RACK_INPUT] = 0 == hp.content_length ?
                  HttpRequest::NULL_IO :
                  Unicorn::TeeInput.new(client, env, hp, buf)
diff --git a/lib/rainbows/const.rb b/lib/rainbows/const.rb
index 69e58aa..900c9d9 100644
--- a/lib/rainbows/const.rb
+++ b/lib/rainbows/const.rb
@@ -19,5 +19,11 @@ module Rainbows
     CONN_ALIVE = "Connection: keep-alive\r\n"
     LOCALHOST = "127.0.0.1"
 
+    # client IO object that supports reading and writing directly
+    # without filtering it through the HTTP chunk parser.
+    # Maybe we can get this renamed to "rack.io" if it becomes part
+    # of the official spec, but for now it is "hack.io"
+    CLIENT_IO = "hack.io".freeze
+
   end
 end
diff --git a/lib/rainbows/fiber/base.rb b/lib/rainbows/fiber/base.rb
index 129448c..995b4af 100644
--- a/lib/rainbows/fiber/base.rb
+++ b/lib/rainbows/fiber/base.rb
@@ -82,6 +82,7 @@ module Rainbows
             buf << (client.read_timeout or return)
           end
 
+          env[CLIENT_IO] = client
           env[RACK_INPUT] = 0 == hp.content_length ?
                     HttpRequest::NULL_IO : TeeInput.new(client, env, hp, buf)
           env[REMOTE_ADDR] = remote_addr
diff --git a/lib/rainbows/revactor.rb b/lib/rainbows/revactor.rb
index b647d48..ff0e429 100644
--- a/lib/rainbows/revactor.rb
+++ b/lib/rainbows/revactor.rb
@@ -49,6 +49,7 @@ module Rainbows
           buf << client.read(*rd_args)
         end
 
+        env[Const::CLIENT_IO] = client
         env[Const::RACK_INPUT] = 0 == hp.content_length ?
                  HttpRequest::NULL_IO :
                  Rainbows::Revactor::TeeInput.new(client, env, hp, buf)
-- 
Eric Wong