Sha256: 83eb36536368a5b891fd9de12651b0f065dfdb4328bd1a3b11b36eeaabc41ba8

Contents?: true

Size: 1.23 KB

Versions: 3

Compression:

Stored size: 1.23 KB

Contents

# frozen_string_literal: true
require 'rest-client'
require 'json'

module Nano
  def self.client
    @client ||= Client.new
  end

  class Client
    attr_accessor :host, :port

    def initialize(host: 'localhost', port: 7076)
      @host = host
      @port = port
    end

    def call(action, params = {})
      args = { action: action }
      args.merge!(params) if params.is_a?(Hash)
      post(args)
    end

    private

    def post(params)
      response = rest_client_post(url, params)
      ensure_status_success!(response)

      data = Nano::Response.new(JSON[response.body])
      ensure_valid_response!(data)

      data
    end

    def rest_client_post(url, params)
      RestClient.post(url, params.to_json)
    rescue Errno::ECONNREFUSED
      raise Nano::NodeConnectionFailure,
            "Node connection failure at #{url}"
    end

    def url
      "http://#{host}:#{port}"
    end

    def ensure_status_success!(response)
      return if response.code == 200
      raise Nano::BadRequest,
            "Error response from node: #{JSON[response.body]}"
    end

    def ensure_valid_response!(data)
      return unless data['error']
      raise Nano::InvalidRequest,
            "Invalid request: #{data['error']}"
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
nano_rpc-0.3.0 lib/nano_rpc/client.rb
nano_rpc-0.2.0 lib/nano/client.rb
nano_rpc-0.1.0 lib/nano/client.rb