jrpc 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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