lib/nano_rpc/node.rb in nano_rpc-0.14.0 vs lib/nano_rpc/node.rb in nano_rpc-0.15.0

- old
+ new

@@ -4,161 +4,196 @@ module NanoRpc def self.node @node ||= Node.new end +end - class Node - include NanoRpc::Proxy - include NanoRpc::NodeHelper +class NanoRpc::Node + include NanoRpc::Proxy + include NanoRpc::NodeHelper - attr_reader :host, :port, :auth, :headers, :node + attr_reader :host, :port, :auth, :headers, :node, :timeout - def initialize(host: 'localhost', port: 7076, auth: nil, headers: nil) - @host = host - @port = port - @auth = auth - @headers = headers - @node = self + DEFAULT_TIMEOUT = 60 - super - end + def initialize( + host: 'localhost', + port: 7076, + auth: nil, + headers: nil, + timeout: DEFAULT_TIMEOUT + ) + @host = host + @port = port + @auth = auth + @headers = headers + @timeout = timeout + @node = self - # Condense host/port on object inspection - def inspect - "#{inspect_prefix}, @url=\"#{@host}:#{port}\">" - end + super + end - def call(action, params = {}) - args = { action: action } - args.merge!(params) if params.is_a?(Hash) - args = extract_proxy_args(args) - rpc_post(args) - end + def call(action, params = {}) + args = { action: action } + args.merge!(params) if params.is_a?(Hash) + args = extract_proxy_args(args) + rpc_post(args) + end - proxy_method :available_supply - proxy_method :block, required: %i[hash] - proxy_method :block_account, required: %i[hash] - proxy_method :block_confirm, required: %i[hash] - proxy_method :block_count - proxy_method :block_count_type - proxy_method :block_create, - required: %i[type key representative source], - optional: %i[work] - proxy_method :blocks, required: %i[hashes] - proxy_method :blocks_info, - required: %i[hashes], - optional: %i[pending source balance] - proxy_method :bootstrap, required: %i[address port] - proxy_method :bootstrap_any - proxy_method :chain, required: %i[block count] - proxy_method :confirmation_history - proxy_method :deterministic_key, required: %i[seed index] - proxy_method :frontier_count - proxy_method :history, required: %i[hash count] - proxy_method :keepalive, required: %i[address port] - proxy_method :key_create - proxy_method :key_expand, required: %i[key] - proxy_method :krai_from_raw, required: %i[amount] - proxy_method :krai_to_raw, required: %i[amount] - proxy_method :mrai_from_raw, required: %i[amount] - proxy_method :mrai_to_raw, required: %i[amount] - proxy_method :payment_wait, required: %i[account amount timeout] - proxy_method :peers - proxy_method :pending_exists, required: %i[hash] - proxy_method :process, required: %i[block] - proxy_method :rai_from_raw, required: %i[amount] - proxy_method :rai_to_raw, required: %i[amount] - proxy_method :receive_minimum - proxy_method :receive_minimum_set, required: %i[amount] - proxy_method :representatives - proxy_method :representatives_online - proxy_method :republish, - required: %i[hash], - optional: %i[count sources destinations] - proxy_method :search_pending, required: %i[wallet] - proxy_method :search_pending_all - proxy_method :stats, required: %i[type] - proxy_method :stop - proxy_method :successors, required: %i[block count] - proxy_method :unchecked, required: %i[count] - proxy_method :unchecked_clear - proxy_method :unchecked_get, required: %i[hash] - proxy_method :unchecked_keys, required: %i[key count] - proxy_method :version - proxy_method :wallet_create - proxy_method :work_cancel, required: %i[hash] - proxy_method :work_generate, - required: %i[hash], - optional: %i[use_peers] - proxy_method :work_peer_add, required: %i[address port] - proxy_method :work_peers - proxy_method :work_peers_clear - proxy_method :work_validate, required: %i[work hash] + # Condense host/port on object inspection + def inspect + "#{inspect_prefix}, @url=\"#{@host}:#{port}\">" + end - private + proxy_method :available_supply + proxy_method :block, required: %i[hash] + proxy_method :block_account, required: %i[hash] + proxy_method :block_confirm, required: %i[hash] + proxy_method :block_count + proxy_method :block_count_type + proxy_method :block_create, + required: %i[type key representative source], + optional: %i[work] + proxy_method :blocks, required: %i[hashes] + proxy_method :blocks_info, + required: %i[hashes], + optional: %i[pending source balance] + proxy_method :bootstrap, required: %i[address port] + proxy_method :bootstrap_any + proxy_method :chain, required: %i[block count] + proxy_method :confirmation_history + proxy_method :deterministic_key, required: %i[seed index] + proxy_method :frontier_count + proxy_method :history, required: %i[hash count] + proxy_method :keepalive, required: %i[address port] + proxy_method :key_create + proxy_method :key_expand, required: %i[key] + proxy_method :krai_from_raw, required: %i[amount] + proxy_method :krai_to_raw, required: %i[amount] + proxy_method :mrai_from_raw, required: %i[amount] + proxy_method :mrai_to_raw, required: %i[amount] + proxy_method :payment_wait, required: %i[account amount timeout] + proxy_method :peers + proxy_method :pending_exists, required: %i[hash] + proxy_method :process, required: %i[block] + proxy_method :rai_from_raw, required: %i[amount] + proxy_method :rai_to_raw, required: %i[amount] + proxy_method :receive_minimum + proxy_method :receive_minimum_set, required: %i[amount] + proxy_method :representatives + proxy_method :representatives_online + proxy_method :republish, + required: %i[hash], + optional: %i[count sources destinations] + proxy_method :search_pending, required: %i[wallet] + proxy_method :search_pending_all + proxy_method :stats, required: %i[type] + proxy_method :stop + proxy_method :successors, required: %i[block count] + proxy_method :unchecked, required: %i[count] + proxy_method :unchecked_clear + proxy_method :unchecked_get, required: %i[hash] + proxy_method :unchecked_keys, required: %i[key count] + proxy_method :receive_minimum + proxy_method :receive_minimum_set, required: %i[amount] + proxy_method :representatives + proxy_method :representatives_online + proxy_method :republish, + required: %i[hash], + optional: %i[count sources destinations] + proxy_method :search_pending, required: %i[wallet] + proxy_method :search_pending_all + proxy_method :stats, required: %i[type] + proxy_method :stop + proxy_method :successors, required: %i[block count] + proxy_method :unchecked, required: %i[count] + proxy_method :unchecked_clear + proxy_method :unchecked_get, required: %i[hash] + proxy_method :unchecked_keys, required: %i[key count] + proxy_method :version + proxy_method :wallet_create + proxy_method :work_cancel, required: %i[hash] + proxy_method :work_generate, + required: %i[hash], + optional: %i[use_peers] + proxy_method :work_peer_add, required: %i[address port] + proxy_method :work_peers + proxy_method :work_peers_clear + proxy_method :work_validate, required: %i[work hash] - def extract_proxy_args(args) - args.each do |k, v| - m = proxy_method(v) - args[k] = v.send(m) if m - end - args + private + + def extract_proxy_args(args) + args.each do |k, v| + m = proxy_method(v) + args[k] = v.send(m) if m end + args + end - def proxy_method(obj) - if obj.is_a?(NanoRpc::Wallet) - :seed - elsif obj.is_a?(NanoRpc::Accounts) - :addresses - elsif obj.is_a?(NanoRpc::Account) - :address - end + def proxy_method(obj) + if obj.is_a?(NanoRpc::Wallet) + :seed + elsif obj.is_a?(NanoRpc::Accounts) + :addresses + elsif obj.is_a?(NanoRpc::Account) + :address end + end - def rpc_post(params) - response = rest_client_post(url, params) - ensure_status_success(response) - data = NanoRpc::Response.new(JSON[response&.body]) - ensure_valid_response(data) + def rpc_post(params) + response = rest_client_post(params) + ensure_status_success(response) + data = NanoRpc::Response.new(JSON[response&.body]) + ensure_valid_response(data) - data - end + data + end - def request_headers - h = headers || {} - h['Content-Type'] = 'json' - h['Authorization'] = auth unless auth.nil? - h - end + def request_headers + h = headers || {} + h['Content-Type'] = 'json' + h['Authorization'] = auth unless auth.nil? + h + end - def rest_client_post(url, params) - RestClient.post(url, params.to_json, request_headers) - rescue Errno::ECONNREFUSED - raise NanoRpc::NodeConnectionFailure, - "Node connection failure at #{url}" - rescue RestClient::Exceptions::OpenTimeout - raise NanoRpc::NodeOpenTimeout, - 'Node failed to respond in time' - end + def rest_client_post(params) + execute_post(params) + rescue Errno::ECONNREFUSED + raise NanoRpc::NodeConnectionFailure, + "Node connection failure at #{url}" + rescue RestClient::Exceptions::OpenTimeout + raise NanoRpc::NodeOpenTimeout, + 'Node failed to respond in time' + end - def url - if host.start_with?('http://', 'https://') - "#{host}:#{port}" - else - "http://#{host}:#{port}" - end - end + def execute_post(params) + RestClient::Request.execute( + method: :post, + url: url, + headers: request_headers, + payload: params.to_json, + timeout: timeout + ) + end - def ensure_status_success(response) - return if response&.code == 200 - raise NanoRpc::BadRequest, - "Error response from node: #{JSON[response&.body]}" + def url + if host.start_with?('http://', 'https://') + "#{host}:#{port}" + else + "http://#{host}:#{port}" end + end - def ensure_valid_response(data) - return unless data['error'] - raise NanoRpc::InvalidRequest, - "Invalid request: #{data['error']}" - end + def ensure_status_success(response) + return if response&.code == 200 + raise NanoRpc::BadRequest, + "Error response from node: #{JSON[response&.body]}" + end + + def ensure_valid_response(data) + return unless data['error'] + raise NanoRpc::InvalidRequest, + "Invalid request: #{data['error']}" end end