class IMP::Client

Public Class Methods

new() click to toggle source
# File lib/client/initialize.rb, line 4
def initialize

  @sock = TCPSocket.new('localhost', PORT)

  # identification
  # todo separate version error
  buff = JSON.parse(@sock.gets)
  raise if buff['imp'].nil?
  raise if buff['version'] != IMP::VERSION

  # now just receive responses
  @requests = Hash.new
  Thread.new do
    listener
  end

end

Public Instance Methods

close() click to toggle source
# File lib/client/close.rb, line 4
def close
  @sock&.close
  @sock = nil
end
listener() click to toggle source
# File lib/client/listener.rb, line 4
def listener

  loop do

    buff = @sock&.gets
    raise IOError if buff.nil?

    buff = JSON.parse(buff)
    uuid = buff['uuid']
    data = buff['data']
    responded(uuid, data)

  rescue IOError

    @requests.each_key do |uuid|
      responded(uuid, nil)
    end

    @requests = nil

    close
    break

  rescue
  end

end
request(event, data, &hook) click to toggle source
# File lib/client/request.rb, line 4
def request(event, data, &hook)

  raise if @requests.nil?

  uuid = Random.uuid
  buff = {
    'uuid'  => uuid,
    'event' => event,
    'data'  => data,
  }

  if hook.nil?
    response = :waiting
    hook = Proc.new do |data|
      response = data
    end
  end

  @requests[uuid] = hook
  @sock.puts buff.to_json

  unless block_given?
    while response == :waiting
      sleep 0.1
    end
    return response
  end

end
responded(uuid, data) click to toggle source
# File lib/client/responded.rb, line 4
def responded(uuid, data)
  todo = @requests[uuid]
  Thread.new { todo.call(data) }
  @requests.delete(uuid)
end