class RPCPlus::Client

Public Class Methods

new(host, port) click to toggle source
# File lib/rpcplus/client.rb, line 9
def initialize(host, port)
  @seq = 0
  @requests = {}

  @sock = Celluloid::IO::TCPSocket.new(host, port)
  @sock.write("CONNECT /_goRPC_ HTTP/1.0\r\nAccept: application/vnd.flynn.rpc-hijack+json\r\n\r\n")
  response = @sock.readline(/\r?\n/)
  raise 'invalid response' if !response.start_with?('HTTP/1.0 200')
  @sock.readline(/\r?\n/)
  async.read_responses
end

Public Instance Methods

request(method, arg, &block) click to toggle source
# File lib/rpcplus/client.rb, line 21
def request(method, arg, &block)
  req = { 'id' => @seq+=1, 'method' => method, 'params' => [arg] }
  future = Celluloid::Future.new
  @requests[req['id']] = { stream: block, future: future }
  Yajl::Encoder.encode(req, @sock)

  # block until stream is done, so that the block doesn't become invalid due
  # to https://github.com/celluloid/celluloid/pull/245
  future.value if block

  future
end

Private Instance Methods

read_responses() click to toggle source
# File lib/rpcplus/client.rb, line 40
def read_responses
  loop do
    response = Yajl::Parser.parse(@sock.readline)
    req = @requests[response['id']]
    next if !req
    if req[:stream] && !response['error']
      req[:stream].call(response['result'])
      next
    end
    req[:future].signal(Response.new(response["result"]))
    @requests.delete(response['id'])
  end
end
shutdown() click to toggle source
# File lib/rpcplus/client.rb, line 36
def shutdown
  @sock.close if @sock
end