iproto 0.3.14 → 0.3.15
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.
- data/iproto.gemspec +2 -2
- data/lib/iproto/connection_api.rb +6 -0
- data/lib/iproto/core-ext.rb +8 -0
- data/lib/iproto/em.rb +43 -4
- data/lib/iproto.rb +1 -1
- metadata +2 -2
data/iproto.gemspec
CHANGED
@@ -1,9 +1,12 @@
|
|
1
1
|
require 'bin_utils'
|
2
|
+
require 'iproto/core-ext'
|
2
3
|
module IProto
|
3
4
|
module ConnectionAPI
|
4
5
|
DEFAULT_RECONNECT = 0.1
|
5
6
|
HEADER_SIZE = 12
|
6
7
|
|
8
|
+
EMPTY_STR = ''.b.freeze
|
9
|
+
|
7
10
|
def next_request_id
|
8
11
|
@next_request_id = ((@next_request_id ||= 0) + 1) & 0x7fffffff
|
9
12
|
end
|
@@ -17,5 +20,8 @@ module IProto
|
|
17
20
|
data = ::BinUtils.append_int32_le!(nil, request_type, body.bytesize, request_id)
|
18
21
|
::BinUtils.append_string!(data, body)
|
19
22
|
end
|
23
|
+
|
24
|
+
PING = 0xff00
|
25
|
+
PING_ID = 0xffffffff
|
20
26
|
end
|
21
27
|
end
|
data/lib/iproto/core-ext.rb
CHANGED
data/lib/iproto/em.rb
CHANGED
@@ -10,14 +10,14 @@ module IProto
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def receive_data(data)
|
13
|
-
@buffer ||= ''
|
13
|
+
@buffer ||= ''.b
|
14
14
|
offset = 0
|
15
|
-
while (chunk = data
|
15
|
+
while (chunk = data.byteslice(offset, _needed_size - @buffer.bytesize)).size > 0
|
16
16
|
@buffer << chunk
|
17
17
|
offset += chunk.size
|
18
18
|
if @buffer.size == _needed_size
|
19
19
|
chunk = @buffer
|
20
|
-
@buffer = ''
|
20
|
+
@buffer = ''.b
|
21
21
|
receive_chunk chunk
|
22
22
|
end
|
23
23
|
end
|
@@ -26,6 +26,10 @@ module IProto
|
|
26
26
|
def receive_chunk(chunk)
|
27
27
|
# for override
|
28
28
|
end
|
29
|
+
|
30
|
+
def buffer_reset
|
31
|
+
@buffer = ''.b
|
32
|
+
end
|
29
33
|
end
|
30
34
|
|
31
35
|
include IProto::ConnectionAPI
|
@@ -39,14 +43,36 @@ module IProto
|
|
39
43
|
@reconnect_timeout = Numeric === reconnect ? reconnect : DEFAULT_RECONNECT
|
40
44
|
@should_reconnect = !!reconnect
|
41
45
|
@reconnect_timer = nil
|
46
|
+
@ping_timer = nil
|
42
47
|
@connected = :init_waiting
|
43
48
|
@waiting_requests = {}
|
44
49
|
@waiting_for_connect = []
|
45
|
-
init_protocol
|
46
50
|
@shutdown_hook = false
|
51
|
+
@inactivity_timeout = 0
|
52
|
+
init_protocol
|
47
53
|
shutdown_hook
|
48
54
|
end
|
49
55
|
|
56
|
+
def _start_pinger
|
57
|
+
if @connected == true && (cit = comm_inactivity_timeout) != 0 && @ping_timer == nil
|
58
|
+
@ping_timer = EM.add_periodic_timer([1, cit / 4.0].min, method(:_ping))
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def _stop_pinger
|
63
|
+
if @ping_timer
|
64
|
+
@ping_timer.cancel
|
65
|
+
@ping_timer = nil
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def comm_inactivity_timeout=(t)
|
70
|
+
_stop_pinger
|
71
|
+
@inactivity_timeout = t
|
72
|
+
super
|
73
|
+
_start_pinger
|
74
|
+
end
|
75
|
+
|
50
76
|
def connected?
|
51
77
|
@connected == true
|
52
78
|
end
|
@@ -72,6 +98,8 @@ module IProto
|
|
72
98
|
def connection_completed
|
73
99
|
@reconnect_timer = nil
|
74
100
|
@connected = true
|
101
|
+
init_protocol
|
102
|
+
self.comm_inactivity_timeout= @inactivity_timeout
|
75
103
|
_perform_waiting_for_connect(true)
|
76
104
|
end
|
77
105
|
|
@@ -79,6 +107,11 @@ module IProto
|
|
79
107
|
def init_protocol
|
80
108
|
@_needed_size = HEADER_SIZE
|
81
109
|
@_state = :receive_header
|
110
|
+
buffer_reset
|
111
|
+
end
|
112
|
+
|
113
|
+
def _ping
|
114
|
+
send_data pack_request(PING, PING_ID, EMPTY_STR)
|
82
115
|
end
|
83
116
|
|
84
117
|
def receive_chunk(chunk)
|
@@ -93,6 +126,11 @@ module IProto
|
|
93
126
|
chunk = ''
|
94
127
|
end
|
95
128
|
end
|
129
|
+
if @request_id == PING_ID
|
130
|
+
@_needed_size = HEADER_SIZE
|
131
|
+
@_state = :receive_header
|
132
|
+
return
|
133
|
+
end
|
96
134
|
request = @waiting_requests.delete @request_id
|
97
135
|
raise IProto::UnexpectedResponse.new("For request id #{@request_id}") unless request
|
98
136
|
@_needed_size = HEADER_SIZE
|
@@ -187,6 +225,7 @@ module IProto
|
|
187
225
|
end
|
188
226
|
|
189
227
|
def unbind
|
228
|
+
_stop_pinger
|
190
229
|
prev_connected = @connected
|
191
230
|
@connected = false
|
192
231
|
discard_requests
|
data/lib/iproto.rb
CHANGED
metadata
CHANGED
@@ -2,14 +2,14 @@
|
|
2
2
|
name: iproto
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.3.
|
5
|
+
version: 0.3.15
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Andrew Rudenko
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-10-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
type: :runtime
|