class PackServ::Client

Attributes

handler[RW]

Public Class Methods

new(proto = nil) click to toggle source
# File lib/packserv/client.rb, line 5
def initialize(proto = nil)
  @proto = proto || DefaultProtocol

  @handler = ->(_) {}
  @event_queue = Queue.new
  @response_queue = Queue.new
  @outgoing_queue = Queue.new

  @threads = ThreadGroup.new
end

Public Instance Methods

connect(host, port) click to toggle source
# File lib/packserv/client.rb, line 16
def connect(host, port)
  @server = TCPSocket.new(host, port)

  @threads.add(Thread.new { _connect(@server) })
  @threads.add(Thread.new { dispatch_events })

  self
end
disconnect() click to toggle source
# File lib/packserv/client.rb, line 25
def disconnect
  @threads.list.map(&:exit)
  @server.close
end
send(obj) click to toggle source
# File lib/packserv/client.rb, line 30
def send(obj)
  @outgoing_queue.push(obj)

  @response_queue.pop
end

Private Instance Methods

_connect(server) click to toggle source
# File lib/packserv/client.rb, line 49
def _connect(server)
  setup_mailbox(server)

  IOUnpacker.each_from(server, @proto) do |msg|
    case msg['type']
    when 'event'
      @event_queue
    else
      @response_queue
    end.push(@proto.extract(msg))
  end
end
dispatch_events() click to toggle source
# File lib/packserv/client.rb, line 38
def dispatch_events
  loop { handler.(@event_queue.pop) }
end
setup_mailbox(server) click to toggle source
# File lib/packserv/client.rb, line 42
def setup_mailbox(server)
  packer = IOPacker.new(server, @proto)
  @threads.add(Thread.new do
    loop { packer.pack(@proto.create(@outgoing_queue.pop)) }
  end)
end