Sha256: 52069b7caf68428cfc60f89351bd6c2b13a80af57259e8d2ac99ab1998cb82e4

Contents?: true

Size: 1.25 KB

Versions: 1

Compression:

Stored size: 1.25 KB

Contents

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

module Raiblocks
  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 = Raiblocks::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 Raiblocks::NodeConnectionFailure,
            "Node connection failure at #{url}"
    end

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

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

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

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
raiblocks_rpc-0.4.0 lib/raiblocks/client.rb