class PackServ::Server
Attributes
handler[RW]
Public Class Methods
new(proto = nil)
click to toggle source
# File lib/packserv/server.rb, line 5 def initialize(proto = nil) @proto = proto || DefaultProtocol @handler = ->(_) {} @packers = {} @event_queue = Queue.new @threads = ThreadGroup.new end
Public Instance Methods
event(data)
click to toggle source
# File lib/packserv/server.rb, line 14 def event(data) @event_queue.push(data) end
serve(port)
click to toggle source
# File lib/packserv/server.rb, line 18 def serve(port) server = TCPServer.new(port) @threads.add(Thread.new { _serve(server) }) @threads.add(Thread.new { deliver_events }) self end
stop()
click to toggle source
# File lib/packserv/server.rb, line 27 def stop @threads.list.map(&:exit) end
Private Instance Methods
_serve(server)
click to toggle source
# File lib/packserv/server.rb, line 63 def _serve(server) loop do @threads.add(Thread.new(server.accept) { |client| handle(client) }) end end
deliver_events()
click to toggle source
# File lib/packserv/server.rb, line 56 def deliver_events loop do data = @event_queue.pop @packers.each { |_, k| k.pack(@proto.create(data, 'event')) } end end
handle(client)
click to toggle source
# File lib/packserv/server.rb, line 46 def handle(client) outgoing = setup_mailbox(client) IOUnpacker.each_from(client, @proto) do |msg| response = handler.(@proto.extract(msg)) outgoing.push(response) end end
setup_mailbox(client)
click to toggle source
# File lib/packserv/server.rb, line 33 def setup_mailbox(client) packer = IOPacker.new(client, @proto) outgoing = Queue.new @threads.add(Thread.new do loop { packer.pack(@proto.create(outgoing.pop)) } end) @packers[client.object_id] = packer outgoing end