module TezosClient::RpcInterface::RequestManager

Public Instance Methods

get(path, query: {}) click to toggle source
# File lib/tezos_client/rpc_interface/request_manager.rb, line 6
def get(path, query: {})
  url = "http://#{@host}:#{@port}/#{path}"
  response = nil
  exec_time = Benchmark.realtime do
    response = HTTParty.get(url, headers: { "Content-Type" => "application/json" }, query: query)
  end
  formatted_response = format_response(response.parsed_response)

  log("-------")
  log(">>> GET #{response.request.uri} \n")
  log("<<< code: #{response.code} \n    exec time: #{exec_time}\n #{tezos_contents_log(formatted_response)}")
  log("-------")
  unless response.success?
    failed!(url: url, code: response.code, responses: formatted_response)
  end

  formatted_response
end
monitor(path, &event_handler) click to toggle source
# File lib/tezos_client/rpc_interface/request_manager.rb, line 49
def monitor(path, &event_handler)
  uuid = SecureRandom.uuid

  url = "http://#{@host}:#{@port}/#{path}"

  event_reader = monitor_event_reader(uuid, event_handler)

  Thread.new do
    log("Monitor #{uuid}: Start monitoring GET #{url}")
    RestClient::Request.execute(method: :get,
                                read_timeout: 60 * 60 * 24 * 365,
                                url: url,
                                block_response: event_reader,
                                content_type: :json,
                                accept: :json)
  rescue => e
    log "#{uuid}: failed with error #{e}"
    raise
  end
end
post(path, content) click to toggle source
# File lib/tezos_client/rpc_interface/request_manager.rb, line 25
def post(path, content)
  url = "http://#{@host}:#{@port}/#{path}"

  response = nil
  exec_time = Benchmark.realtime do
    response = HTTParty.post(url,
                             body: content.to_json,
                             headers: { "Content-Type" => "application/json" })
  end

  formatted_response = format_response(response.parsed_response)

  log("-------")
  log(">>> POST #{url} \n #{tezos_contents_log(content)}")
  log("<<< code: #{response.code} \n    exec time: #{exec_time} \n #{tezos_contents_log(formatted_response)}")
  log("-------")

  unless response.success?
    failed!(url: url, code: response.code, responses: formatted_response)
  end

  formatted_response
end

Private Instance Methods

exception_klass(error) click to toggle source
# File lib/tezos_client/rpc_interface/request_manager.rb, line 77
def exception_klass(error)
  case get_error_id(error)
  when /proto\.[^.]*\.operation\.invalid_activation/
    TezosClient::InvalidActivation
  when /proto\.[^.]*\.contract\.previously_revealed_key/
    TezosClient::PreviouslyRevealedKey
  else
    TezosClient::RpcRequestFailure
  end
end
failed!(url:, code:, responses:) click to toggle source
# File lib/tezos_client/rpc_interface/request_manager.rb, line 88
def failed!(url:, code:, responses:)
  error = responses.is_a?(Array) ? responses[0] : responses
  raise exception_klass(error).new(
    error: error,
    url: url,
    status_code: code
  )
end
format_response(response) click to toggle source
# File lib/tezos_client/rpc_interface/request_manager.rb, line 107
def format_response(response)
  if response.is_a? Array
    response.map do |el|
      (el.is_a? Hash) ? el.with_indifferent_access : el
    end
  elsif response.is_a? Hash
    response.with_indifferent_access
  else
    response
  end
end
get_error_id(error) click to toggle source
# File lib/tezos_client/rpc_interface/request_manager.rb, line 71
def get_error_id(error)
  error[:id]
rescue TypeError, NoMethodError
  nil
end
monitor_event_reader(uuid, event_handler) click to toggle source
# File lib/tezos_client/rpc_interface/request_manager.rb, line 97
def monitor_event_reader(uuid, event_handler)
  proc do |event_response|
    event_response.read_body do |event_json|
      event = format_response(JSON.parse(event_json))
      log("Monitor #{uuid}: received chunk #{event.pretty_inspect}")
      event_handler.call(event)
    end
  end
end