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