jrpc 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 02a37ef8c074646479c26dd113cf7245f5989412
4
- data.tar.gz: 337a198aa49dc1e34561cd5941e5c65f63e00c97
3
+ metadata.gz: 121af4aaa6f193b8f5a4fb4a0a9251cf1483e425
4
+ data.tar.gz: 4e2a49c53d7100843ecefabbcffc15e35292e881
5
5
  SHA512:
6
- metadata.gz: 189d7c573b2373bcb16ca7c2fe8e06c18e1827fa7aaa4fef73d984f04230a75653ef93ee80785f464c227f8d0a360dbe2add18376f3ff03f267e5413aba66c39
7
- data.tar.gz: 0355449f1477898dbf19c22ed2930b8ab239fb619948d952bdb27f48adc2ebfdeff4364bb4e60dfa61d0d8dd7621cb2abf2ecd3da9c56e6b4a84b91ebe0eb935
6
+ metadata.gz: ad04bf864632f4ab4856f237dc98b4df3c8773291527cfebadee4b2ebc842aeacbd342ff8ec5e156606198896f91df5dfed9d2500f29c6eb8d803e5dd42dadc6
7
+ data.tar.gz: f652f6d410f9eb68baf0fb2937880306443b6f475713c066ca7875d892fef86b8fc57f957a87adce51b3181abdcdf377e33720a8f501db553598ff0ed38114af
data/jrpc.gemspec CHANGED
@@ -18,6 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.require_paths = ['lib']
19
19
 
20
20
  spec.add_dependency 'netstring'
21
+ spec.add_dependency 'net_tcp_client'
21
22
 
22
23
  spec.add_development_dependency 'bundler', '~> 1.10'
23
24
  spec.add_development_dependency 'rake', '~> 10.0'
data/lib/jrpc.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  require 'jrpc/version'
2
- require 'jrpc/netstring_tcp_socket'
3
2
  require 'jrpc/base_client'
4
3
  require 'jrpc/tcp_client'
5
4
  require 'jrpc/error/error'
@@ -1,6 +1,17 @@
1
1
  require 'json'
2
+ require 'forwardable'
2
3
  module JRPC
3
4
  class BaseClient
5
+ extend Forwardable
6
+
7
+ attr_reader :uri, :options
8
+
9
+ ID_CHARACTERS = (('a'..'z').to_a + ('0'..'9').to_a + ('A'..'Z').to_a).freeze
10
+
11
+ def initialize(uri, options)
12
+ @uri = uri
13
+ @options = options
14
+ end
4
15
 
5
16
  def method_missing(method, *params)
6
17
  invoke_request(method, *params)
@@ -11,7 +22,7 @@ module JRPC
11
22
  id = generate_id
12
23
  request['id'] = id
13
24
 
14
- response = send_request request.to_json
25
+ response = send_command request.to_json
15
26
  response = JSON.parse response
16
27
 
17
28
  validate_response(response, id)
@@ -52,7 +63,7 @@ module JRPC
52
63
  end
53
64
  end
54
65
 
55
- def send_request(json)
66
+ def send_command(json)
56
67
  raise NotImplementedError
57
68
  end
58
69
 
@@ -61,7 +72,8 @@ module JRPC
61
72
  end
62
73
 
63
74
  def generate_id
64
- (0...10).map { ('a'..'z').to_a[rand(26)] }.join
75
+ size = ID_CHARACTERS.size
76
+ (0...32).map { ID_CHARACTERS.to_a[rand(size)] }.join
65
77
  end
66
78
 
67
79
  def create_message(method, params)
@@ -1,34 +1,58 @@
1
+ require 'net/tcp_client'
2
+ require 'netstring'
1
3
  module JRPC
2
4
  class TcpClient < BaseClient
3
- attr_reader :hostname, :port, :namespace, :options
5
+ attr_reader :namespace
6
+ def_delegators :@socket, :logger, :logger=, :close, :alive?
4
7
 
5
- def initialize(options = {})
6
- @hostname = options.delete(:hostname)
7
- @port = options.delete(:port)
8
+ def initialize(uri, options = {})
9
+ super
8
10
  @namespace = options.delete(:namespace).to_s
9
- @options = options
10
- @socket = NetstringTcpSocket.new(@hostname, @port)
11
- @socket.set_timeout @options.fetch(:timeout, 5)
11
+ t = @options.fetch(:timeout, 5)
12
+
13
+ @socket = Net::TCPClient.new server: @uri,
14
+ connect_retry_count: t,
15
+ connect_timeout: t,
16
+ read_timeout: t,
17
+ # write_timeout: t,
18
+ buffered: false # recommended for RPC
12
19
  end
13
20
 
14
- def close
15
- @socket.close
16
- end
21
+ private
17
22
 
23
+ def send_command(request)
24
+ send_request(request)
25
+ receive_response
26
+ end
18
27
 
19
- private
28
+ def send_notification(request)
29
+ send_request(request)
30
+ end
20
31
 
21
32
  def create_message(method, params)
22
33
  super("#{namespace}#{method}", params)
23
34
  end
24
35
 
25
36
  def send_request(request)
26
- @socket.send_string(request)
27
- @socket.receive_string
37
+ @socket.send Netstring.dump(request.to_s), 0
28
38
  end
29
39
 
30
- def send_notification(request)
31
- @socket.send_string(request)
40
+ def receive_response
41
+ length = get_msg_length
42
+ response = @socket.read(length+1)
43
+ raise ClientError.new('invalid response. missed comma as terminator') if response[-1] != ','
44
+ response.chomp(',')
45
+ end
46
+
47
+ def get_msg_length
48
+ length = ''
49
+ while true do
50
+ character = @socket.read(1)
51
+ break if character == ':'
52
+ length += character
53
+ end
54
+
55
+ Integer(length)
32
56
  end
33
57
 
34
58
  end
data/lib/jrpc/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module JRPC
2
- VERSION = '0.2.0'
2
+ VERSION = '0.3.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jrpc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Denis Talakevich
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-19 00:00:00.000000000 Z
11
+ date: 2015-11-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: netstring
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: net_tcp_client
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -93,7 +107,6 @@ files:
93
107
  - lib/jrpc/error/parse_error.rb
94
108
  - lib/jrpc/error/server_error.rb
95
109
  - lib/jrpc/error/unknown_error.rb
96
- - lib/jrpc/netstring_tcp_socket.rb
97
110
  - lib/jrpc/tcp_client.rb
98
111
  - lib/jrpc/version.rb
99
112
  homepage: https://github.com/senid231/jrpc
@@ -1,36 +0,0 @@
1
- require 'socket'
2
- require 'netstring'
3
- module JRPC
4
- class NetstringTcpSocket < ::TCPSocket
5
- def send_string(request)
6
- send Netstring.dump(request.to_s), 0
7
- end
8
-
9
- def receive_string
10
- length = get_msg_length
11
- response = recv(length)
12
- raise ClientError.new('invalid response. missed comma as terminator') if response[-1] != ','
13
- response.chomp(',')
14
- end
15
-
16
- def set_timeout(timeout)
17
- seconds = Integer(timeout)
18
- microseconds = Integer((timeout-seconds)*1_000_000)
19
- packed_structure = [seconds, microseconds].pack('l_2') # structure with the number of seconds and microseconds
20
- setsockopt(Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, packed_structure)
21
- end
22
-
23
- private
24
-
25
- def get_msg_length
26
- length = ''
27
- while true do
28
- character = recv(1)
29
- break if character == ':'
30
- length += character
31
- end
32
-
33
- Integer(length)+1
34
- end
35
- end
36
- end