# Rainbows! 0.4.0 - EventMachine+async\_sinatra support

**URL:** <https://www.ruby-forum.com/t/rainbows-0-4-0-eventmachine-async-sinatra-support/177966>\
**Category:** Ruby\
**Created:** [October 27, 2009, 10:02am UTC](https://www.ruby-forum.com/t/rainbows-0-4-0-eventmachine-async-sinatra-support/177966 "2009-10-27T10:02:42Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![ericw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/97f17d/32.png) [@ericw](https://www.ruby-forum.com/u/ericw)\
**Post date:** [October 27, 2009, 10:02am UTC](https://www.ruby-forum.com/t/rainbows-0-4-0-eventmachine-async-sinatra-support/177966/1 "2009-10-27T10:02:42Z")

</div>

Rainbows! is a HTTP server for sleepy Rack applications. It is based on  
Unicorn, but designed to handle applications that expect long  
request/response times and/or slow clients. For Rack applications not  
heavily bound by slow external network dependencies, consider Unicorn  
instead as it simpler and easier to debug.

- [http://rainbows.rubyforge.org/](http://rainbows.rubyforge.org/)
- removed\_email\_address@domain.invalid
- git://git.bogomips.org/rainbows.git

Changes:

Basic single-threaded EventMachine support is now included. It  
supports async\_synatra[1] via the “async.callback” Rack  
environment[2]. For EventMachine, we rely on the updated  
attach/watch API in EventMachine 0.12.10.

As Revactor 0.1.5 is now available, our Revactor support now  
depends on it as it adds the ability to listen on UNIX domain  
sockets.

Of course, all dependencies (besides Unicorn and Rack) are  
soft and only loaded if your configured concurrency model  
requires it.

For developers/QA folks, the integration tests are completely  
revamped for easier maintenance when new concurrency models are  
introduced and should also produce TAP-compliant output. The  
test suite remains highly parallelizable using GNU make.

There are immediate plans to expand support for both Rev and  
EventMachine to support use with threaded application dispatch.

Eric W. (41):  
rev: remove Revactor-specific workaround  
README: change ordering of concurrency model listing  
tests: more correct HTTP/0.9 test  
test-lib: avoid stalling due to bad FIFO handling  
rev: fix static file responses under HTTP/0.9  
add news bodies to site NEWS.atom.xml  
tests: avoid needlessly remaking “rainbows”  
initial EventMachine support  
tests: hopefully fix stalls in input trailer tests  
tests: avoid race condition in reopen logs test  
tests: prefer “RUBY” to lowercased “ruby”  
tests: common setup and wait\_start functions  
tests: add a TAP producer shell library  
tests: port all existing tests to TAP library  
tests: remove symlinks and small files, use Make  
t9000: bail if run with an unsupported/pointless model  
tests: allow “make $model” to run tests for that model  
rev: spell ECONNABORTED correctly  
rev/evma: move common code for event models into ev\_core  
ev\_core: do not drop deferred bodies on graceful quits  
eventmachine: get basic tests working  
rev: do not File.expand\_path on result of body.to\_path  
eventmachine 0.12.8 passes all tests  
tests: make large file memory tests more reliable  
eventmachine: require EM 0.12.10  
update gem dependencies in comments/local.mk.sample  
rev: enforce Rev::VERSION \>= 0.3.0  
eventmachine: add async\_sinatra support  
tests: only load Revactor tests under 1.9.1  
tests: gracefully exit if EventMachine is not available  
tests: error out if socat + curl aren’t reachable  
thread\*: fix MRI 1.8.6 compatibility  
local.mk.sample: cleanups and minor reorg  
eventmachine: remove unnecessary ivar assignment  
eventmachine: document our support of “async\_synatra”  
doc: Update TODO and README  
tests: generate all dependencies atomically  
app\_pool: update RDoc  
test-lib: DWIM handling of temp UNIX sockets  
revactor: require 0.1.5, remove 0.1.4 workarounds  
gemspec: bump up Unicorn dep version to 0.93.4

[1] [GitHub - raggi/async\_sinatra: A plugin for Sinatra to provide a DSL extension for using Thin for asynchronous responses](http://github.com/raggi/async_sinatra)  
[2] this is not 100% Rack::Lint compatible, but we’ll let it  
slide since there are already folks depending on  
the async\_sinatra gem
