class MetaRPC::Client

Attributes

metarpc_header_setter_func[R]
metarpc_pending_batch[R]
metarpc_url[R]

Public Class Methods

new(url, header_setter_func = nil) click to toggle source
# File lib/metarpc/client.rb, line 5
def initialize(url, header_setter_func = nil)
  @metarpc_url = URI.parse(url)
  @metarpc_header_setter_func = header_setter_func
end

Public Instance Methods

metarpc_build_method(method, args) click to toggle source
# File lib/metarpc/client.rb, line 28
def metarpc_build_method(method, args)
  {
    jsonrpc: '2.0',
    method: method,
    params: args[0].is_a?(Hash) && args.count == 1 ? args[0] : args,
    id: SecureRandom.uuid
  }
end
metarpc_execute_request(call) click to toggle source
# File lib/metarpc/client.rb, line 37
def metarpc_execute_request(call)
  body = call.to_json
  headers = metarpc_header_setter_func.call(body) if metarpc_header_setter_func.present?
  (headers ||= {})['Content-Type'] = 'text/json'

  http = Net::HTTP.new(metarpc_url.host, metarpc_url.port)
  request = Net::HTTP::Post.new(metarpc_url.request_uri, headers)
  request.body = body

  metarpc_parse_response(http.request(request).body)
end
metarpc_handle_batch_response(response) click to toggle source
# File lib/metarpc/client.rb, line 59
def metarpc_handle_batch_response(response)
  response.each do |raw_call_response|
    call_response = raw_call_response.deep_symbolize_keys
    pending_batch = metarpc_pending_batch.find { |batch| batch[:call][:id] == call_response[:id] }
    next unless pending_batch[:on_response].present?

    response = ResponseWrapper.new(call_response)
    pending_batch[:on_response].call(response)
  end
end
metarpc_parse_response(raw_response) click to toggle source
# File lib/metarpc/client.rb, line 49
def metarpc_parse_response(raw_response)
  response = JSON.parse(raw_response)
  return metarpc_handle_batch_response(response) if metarpc_pending_batch

  response.deep_symbolize_keys!
  raise RpcClientError.new(response[:error]), "#{response[:error][:code]} #{response[:error][:message]}" if response.key?(:error)

  response[:result]
end
method_missing(sym, *args, &blk) click to toggle source
# File lib/metarpc/client.rb, line 14
def method_missing(sym, *args, &blk)
  call = metarpc_build_method(sym, args)
  return metarpc_pending_batch << { call: call, on_response: blk } if metarpc_pending_batch

  metarpc_execute_request(call)
end
respond_to_missing?(_sym) click to toggle source
# File lib/metarpc/client.rb, line 10
def respond_to_missing?(_sym)
  true
end
rpc_batch(&blk) click to toggle source
# File lib/metarpc/client.rb, line 21
def rpc_batch(&blk)
  @metarpc_pending_batch = []
  instance_exec(&blk)
  metarpc_execute_request(metarpc_pending_batch.map { |p| p[:call] })
  @metarpc_pending_batch = nil
end