Class: Evolis::PremiumSdk::RpcClient

Inherits:
Object
  • Object
show all
Defined in:
lib/evolis/premium_sdk/rpc_client.rb

Constant Summary collapse

JSON_RPC_VERSION =

JSON-RPC version number

'2.0'

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(host, port) ⇒ RpcClient

Initializes the class and sets API host and port

Parameters:

  • host (String)

    host or IP for API

  • port (String, Fixnum)

    port for API



26
27
28
29
# File 'lib/evolis/premium_sdk/rpc_client.rb', line 26

def initialize(host, port)
  @host = host
  @port = port
end

Instance Attribute Details

#requestHash (readonly)

Returns the last request made to the API.

Returns:

  • (Hash)

    the last request made to the API



12
13
14
# File 'lib/evolis/premium_sdk/rpc_client.rb', line 12

def request
  @request
end

#responseHash (readonly)

Returns the last response from API.

Returns:

  • (Hash)

    the last response from API



15
16
17
# File 'lib/evolis/premium_sdk/rpc_client.rb', line 15

def response
  @response
end

Class Method Details

.make_idString

Returns randomly generated number between 10 and 12 digits.

Returns:

  • (String)

    randomly generated number between 10 and 12 digits



18
19
20
# File 'lib/evolis/premium_sdk/rpc_client.rb', line 18

def self.make_id
  String rand(10**12)
end

Instance Method Details

#call(method, args) ⇒ Hash, ...

Make call to API and process response

Parameters:

  • method (String)

    request method

  • args (Hash, Array, String)

    data sent as request

Returns:

  • (Hash, Array, String)

    the data in the format received from server

Raises:



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/evolis/premium_sdk/rpc_client.rb', line 37

def call(method, args)
  resp = send_single_request(method.to_s, args)

  begin
    data = MultiJson.decode(resp)
  rescue
    raise Error::InvalidJSON.new(resp)
  end

  return process_single_response(data)

rescue Exception, StandardError => e
  e.extend(Error) unless e.is_a?(Error)
  raise e
end

#process_single_response(data) ⇒ Hash, ...

Process and validate response from API

Parameters:

  • data (Hash)

    response from API

Returns:

  • (Hash, Array, String)

    from result key in response

Raises:



87
88
89
90
91
92
93
94
95
96
97
# File 'lib/evolis/premium_sdk/rpc_client.rb', line 87

def process_single_response(data)
  raise Error::InvalidResponse.new unless valid_response?(data)

  if !!data['error']
    code = data['error']['code']
    msg = data['error']['message']
    raise Error::ServerError.new(code, msg)
  end

  return data['result']
end

#send_single_request(method, args) ⇒ Hash

The method that does the actual sending of data to API

Parameters:

  • method (String)

    request method

  • args (Hash, Array, String)

    data sent as request

Returns:

  • (Hash)

    response from server in JSON format (Hash)

Raises:



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/evolis/premium_sdk/rpc_client.rb', line 59

def send_single_request(method, args)
  @request = MultiJson.encode({
                                  jsonrpc:  JSON_RPC_VERSION,
                                  method:   method,
                                  params:   args,
                                  id:       self.class.make_id
                              })

  begin
    socket = TCPSocket.open(@host, @port)
    socket.write(@request)
    socket.close_write
    resp = socket.read
  ensure
    socket.close if socket
  end

  raise Error::InvalidResponse.new if resp.nil? || resp.empty?

  return @response = resp
end

#valid_response?(data) ⇒ true, false

Validates tje response from API

Parameters:

  • data (Hash)

    response from API

Returns:

  • (true, false)

    true if valid or false when invalid



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/evolis/premium_sdk/rpc_client.rb', line 103

def valid_response?(data)
  return false unless data.is_a?(Hash)
  return false if data['jsonrpc'] != JSON_RPC_VERSION
  return false unless data.has_key?('id')
  return false if data.has_key?('error') && data.has_key?('result')

  if data.has_key?('error')
    if !data['error'].is_a?(Hash) || !data['error'].has_key?('code') || !data['error'].has_key?('message')
      return false
    end

    if !data['error']['code'].is_a?(Fixnum) || !data['error']['message'].is_a?(String)
      return false
    end
  end

  return true
rescue
  return false
end