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