Skip to content

Instantly share code, notes, and snippets.

@itsWill
Created March 9, 2016 00:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save itsWill/cad4176c0ec405a3fd2f to your computer and use it in GitHub Desktop.
Save itsWill/cad4176c0ec405a3fd2f to your computer and use it in GitHub Desktop.
Evented Reactor Part for a HTTP Server
# BASED ON WORKING WITH TCP/IP-SOCKETS BY JESSEE STORIMER
require 'socket'
require 'omers/events_emitter'
require 'omers/stream'
require 'omers/server'
module OMERS
class Reactor
include EventsEmitter
attr_accessor :streams, :socket
def initialize
@streams = []
end
def listen(host, port)
@socket = TCPServer.new(host, port)
server = Server.new(@socket)
register(server)
server.on(:accept) do |client|
register(client)
end
server
end
def register(stream)
streams << stream
stream.on(:close) do
streams.delete(stream)
end
end
def start
loop {tick}
end
def tick
begin
readable, writable, _ = IO.select(streams, streams)
readable.each { |stream| stream.handle_read }
writable.each { |stream| stream.handle_write }
rescue Errno::EBADF
# when the server is close on shutdown select will raise Errno::EBADF
rescue => ex
raise ex
end
end
def shutdown
@streams.each do |s|
s.close
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment