Security News
38% of CISOs Fear They’re Not Moving Fast Enough on AI
CISOs are racing to adopt AI for cybersecurity, but hurdles in budgets and governance may leave some falling behind in the fight against cyber threats.
"A dizzying lifetime... reeling by on celluloid" -- Rush / Between The Wheels
Reel is a fast, non-blocking "evented" web server built on http_parser.rb, websocket_parser, Celluloid::IO, and nio4r. Thanks to Celluloid, Reel also works great for multithreaded applications and provides traditional multithreaded blocking I/O support too.
Connections to Reel can be either non-blocking and handled entirely within the Reel::Server thread (handling HTTP, HTTPS, or UNIX sockets), or the same connections can be dispatched to worker threads where they will perform ordinary blocking IO. Reel provides no built-in thread pool, however you can build one yourself using Celluloid.pool, or because Celluloid already pools threads to begin with, you can simply use an actor per connection.
This gives you the best of both worlds: non-blocking I/O for when you're primarily I/O bound, and threads for where you're compute bound.
Please see the Reel Wiki for detailed documentation and usage notes.
YARD documentation is also available.
A Rack adapter for Reel is available at:
https://github.com/celluloid/reel-rack
The most notable library with native Reel support is webmachine-ruby, an advanced HTTP framework for Ruby with a complete state machine for proper processing of HTTP/1.1 requests. Together with Reel, Webmachine provides full streaming support for both requests and responses.
To use Reel with Webmachine, add the following to your Gemfile:
gem 'webmachine', git: 'git://github.com/seancribbs/webmachine-ruby.git'
Then use config.adapter = :Reel
when configuring a Webmachine app, e.g:
MyApp = Webmachine::Application.new do |app|
app.routes do
add ['*'], MyHome
end
app.configure do |config|
config.ip = MYAPP_IP
config.port = MYAPP_PORT
config.adapter = :Reel
# Optional: handler for incoming websockets
config.adapter_options[:websocket_handler] = proc do |websocket|
# websocket is a Reel::WebSocket
websocket << "hello, world"
end
end
end
MyApp.run
See the Webmachine documentation for further information
Reel aims to provide a "bare metal" API that other frameworks (such as Rack and Webmachine) can leverage. This API can also be nice in performance critical applications.
Reel lets you pass a block to initialize which receives connections:
require 'celluloid/autostart'
require 'reel'
Reel::Server::HTTP.supervise("0.0.0.0", 3000) do |connection|
# Support multiple keep-alive requests per connection
connection.each_request do |request|
# WebSocket support
if request.websocket?
puts "Client made a WebSocket request to: #{request.url}"
websocket = request.websocket
websocket << "Hello everyone out there in WebSocket land"
websocket.close
else
puts "Client requested: #{request.method} #{request.url}"
request.respond :ok, "Hello, world!"
end
end
end
sleep
When we read a request from the incoming connection, we'll either get back a Reel::Request object, indicating a normal HTTP connection, or a Reel::WebSocket object for WebSockets connections.
You can also subclass Reel, which allows additional customizations:
require 'celluloid/autostart'
require 'reel'
class MyServer < Reel::Server::HTTP
def initialize(host = "127.0.0.1", port = 3000)
super(host, port, &method(:on_connection))
end
def on_connection(connection)
connection.each_request do |request|
if request.websocket?
handle_websocket(request.websocket)
else
handle_request(request)
end
end
end
def handle_request(request)
request.respond :ok, "Hello, world!"
end
def handle_websocket(sock)
sock << "Hello everyone out there in WebSocket land!"
sock.close
end
end
MyServer.run
This library supports and is tested against the following Ruby versions:
Copyright (c) 2012-2016 Tony Arcieri. Distributed under the MIT License. See LICENSE.txt for further details.
FAQs
Unknown package
We found that reel demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
CISOs are racing to adopt AI for cybersecurity, but hurdles in budgets and governance may leave some falling behind in the fight against cyber threats.
Research
Security News
Socket researchers uncovered a backdoored typosquat of BoltDB in the Go ecosystem, exploiting Go Module Proxy caching to persist undetected for years.
Security News
Company News
Socket is joining TC54 to help develop standards for software supply chain security, contributing to the evolution of SBOMs, CycloneDX, and Package URL specifications.