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