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 +4 -4
- data/jrpc.gemspec +1 -0
- data/lib/jrpc.rb +0 -1
- data/lib/jrpc/base_client.rb +15 -3
- data/lib/jrpc/tcp_client.rb +39 -15
- data/lib/jrpc/version.rb +1 -1
- metadata +16 -3
- data/lib/jrpc/netstring_tcp_socket.rb +0 -36
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 121af4aaa6f193b8f5a4fb4a0a9251cf1483e425
|
4
|
+
data.tar.gz: 4e2a49c53d7100843ecefabbcffc15e35292e881
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ad04bf864632f4ab4856f237dc98b4df3c8773291527cfebadee4b2ebc842aeacbd342ff8ec5e156606198896f91df5dfed9d2500f29c6eb8d803e5dd42dadc6
|
7
|
+
data.tar.gz: f652f6d410f9eb68baf0fb2937880306443b6f475713c066ca7875d892fef86b8fc57f957a87adce51b3181abdcdf377e33720a8f501db553598ff0ed38114af
|
data/jrpc.gemspec
CHANGED
data/lib/jrpc.rb
CHANGED
data/lib/jrpc/base_client.rb
CHANGED
@@ -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 =
|
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
|
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
|
-
|
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)
|
data/lib/jrpc/tcp_client.rb
CHANGED
@@ -1,34 +1,58 @@
|
|
1
|
+
require 'net/tcp_client'
|
2
|
+
require 'netstring'
|
1
3
|
module JRPC
|
2
4
|
class TcpClient < BaseClient
|
3
|
-
attr_reader :
|
5
|
+
attr_reader :namespace
|
6
|
+
def_delegators :@socket, :logger, :logger=, :close, :alive?
|
4
7
|
|
5
|
-
def initialize(options = {})
|
6
|
-
|
7
|
-
@port = options.delete(:port)
|
8
|
+
def initialize(uri, options = {})
|
9
|
+
super
|
8
10
|
@namespace = options.delete(:namespace).to_s
|
9
|
-
|
10
|
-
|
11
|
-
@socket.
|
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
|
-
|
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
|
-
|
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.
|
27
|
-
@socket.receive_string
|
37
|
+
@socket.send Netstring.dump(request.to_s), 0
|
28
38
|
end
|
29
39
|
|
30
|
-
def
|
31
|
-
|
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
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.
|
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-
|
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
|