deepstream 0.1.3 → 0.1.4
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/deepstream.gemspec +1 -1
- data/lib/deepstream.rb +116 -30
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dd6d503c71516f071673b0c63d6ed0c3ecd0e055
|
4
|
+
data.tar.gz: 4e5087ecdc7b0420b0bccac544a6e1c0a7aa91d0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 88de53ede59b95a78f1f596d2aac53a86e43a789745bf42fd97f24351e0ec4d73d39077b49198931728d34b7721a2faed4c48e50b18b79685acc4b8286452bec
|
7
|
+
data.tar.gz: 1580071ce6dbbf29a2a7993348c243b69fea9da758b5c5e3f6aab705fdcb0574f2c2cbd093841e16210899f26e5d463c5c6e88290fbef92673f3ed46aae76751
|
data/deepstream.gemspec
CHANGED
data/lib/deepstream.rb
CHANGED
@@ -28,11 +28,16 @@ class Deepstream::Record
|
|
28
28
|
|
29
29
|
def set(*args)
|
30
30
|
if args.size == 1
|
31
|
-
@client._write('R', 'U', @name, (@version += 1), JSON.dump(args[0]))
|
32
|
-
|
31
|
+
if @client._write('R', 'U', @name, (@version += 1), JSON.dump(args[0]))
|
32
|
+
@data = OpenStruct.new(args[0])
|
33
|
+
end
|
33
34
|
else
|
34
35
|
@client._write('R', 'P', @name, (@version += 1), args[0][0..-2], @client._typed(args[1]))
|
36
|
+
@data[args[0][0..-2]] = args[1]
|
35
37
|
end
|
38
|
+
rescue => e
|
39
|
+
print "unable to set\n"
|
40
|
+
print "Error: ", e.message, "\n" if @client.verbose
|
36
41
|
end
|
37
42
|
|
38
43
|
def _patch(version, field, value)
|
@@ -48,19 +53,22 @@ class Deepstream::Record
|
|
48
53
|
def method_missing(name, *args)
|
49
54
|
unless @data.is_a?(Array)
|
50
55
|
set(name, *args) if name[-1] == '='
|
51
|
-
@data
|
56
|
+
@data[name] || @data[name[-1]]
|
52
57
|
end
|
53
58
|
end
|
54
59
|
end
|
55
60
|
|
56
61
|
class Deepstream::List < Deepstream::Record
|
57
62
|
def add(record_name)
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
@
|
63
|
+
@data = [] unless @data.is_a?(Array)
|
64
|
+
unless @data.include? record_name
|
65
|
+
@data.push record_name
|
66
|
+
@client._write('R', 'U', @name, (@version += 1), JSON.dump(@data))
|
62
67
|
end
|
63
|
-
@
|
68
|
+
@data
|
69
|
+
rescue => e
|
70
|
+
print "unable to add ", @data.pop, "\n"
|
71
|
+
print "Error: ", e.message, "\n" if @client.verbose
|
64
72
|
@data
|
65
73
|
end
|
66
74
|
|
@@ -68,6 +76,11 @@ class Deepstream::List < Deepstream::Record
|
|
68
76
|
@data.delete_if { |x| x == record_name }
|
69
77
|
@client._write('R', 'U', @name, (@version += 1), JSON.dump(@data))
|
70
78
|
@data
|
79
|
+
rescue => e
|
80
|
+
print "unable to remove ", record_name, "\n"
|
81
|
+
@data.push record_name
|
82
|
+
print "Error: ", e.message, "\n" if @client.verbose
|
83
|
+
@data
|
71
84
|
end
|
72
85
|
|
73
86
|
def all
|
@@ -84,14 +97,74 @@ class Deepstream::List < Deepstream::Record
|
|
84
97
|
end
|
85
98
|
|
86
99
|
class Deepstream::Client
|
87
|
-
def initialize(address, port = 6021)
|
88
|
-
@address, @port, @unread_msg, @event_callbacks, @records = address, port, nil, {}, {}
|
100
|
+
def initialize(address, port = 6021, credentials = {})
|
101
|
+
@address, @port, @unread_msg, @event_callbacks, @records, @max_timeout, @timeout = address, port, nil, {}, {}, 60, 1
|
102
|
+
connect(credentials)
|
103
|
+
end
|
104
|
+
|
105
|
+
attr_accessor :verbose, :max_timeout
|
106
|
+
attr_reader :connected
|
107
|
+
|
108
|
+
def _login(credentials)
|
109
|
+
_write("A", "REQ", credentials.to_json)
|
110
|
+
raise unless _read_socket == %w{A A}
|
111
|
+
end
|
112
|
+
|
113
|
+
def _read_socket(timeout: nil)
|
114
|
+
Timeout.timeout(timeout) do
|
115
|
+
@socket.gets(30.chr).tap { |m| break m.chomp(30.chr).split(31.chr) if m }
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def connect(credentials)
|
120
|
+
return self if @connected
|
121
|
+
Thread.start do
|
122
|
+
Thread.current[:name] = "reader#{object_id}"
|
123
|
+
loop do
|
124
|
+
break if @connected # ensures only one thread remains after reconnection
|
125
|
+
begin
|
126
|
+
Timeout.timeout(2) { @socket = TCPSocket.new(@address, @port) }
|
127
|
+
_login(credentials)
|
128
|
+
@connected = true
|
129
|
+
print Time.now.to_s[/.+ .+ /], "Connected\n" if @verbose
|
130
|
+
Thread.start do
|
131
|
+
_sync_records
|
132
|
+
_resubscribe_events
|
133
|
+
end
|
134
|
+
loop do
|
135
|
+
@timeout = 1
|
136
|
+
begin
|
137
|
+
_process_msg(_read_socket(timeout: 10))
|
138
|
+
rescue TimeoutError
|
139
|
+
_write("heartbeat") # send anything to check if deepstream responds
|
140
|
+
_process_msg(_read_socket(timeout: 10))
|
141
|
+
end
|
142
|
+
end
|
143
|
+
rescue => e
|
144
|
+
@connected = false
|
145
|
+
@socket.close rescue nil
|
146
|
+
print Time.now.to_s[/.+ .+ /], "Can't connect to deepstream server\n" if @verbose
|
147
|
+
print "Error: ", e.message, "\n" if @verbose
|
148
|
+
sleep @timeout
|
149
|
+
@timeout = [@timeout * 1.2, @max_timeout].min
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
sleep 0.5
|
154
|
+
self
|
155
|
+
end
|
156
|
+
|
157
|
+
def disconnect
|
158
|
+
@connected = false
|
159
|
+
@socket.close rescue nil
|
160
|
+
Thread.list.find { |x| x[:name] == "reader#{object_id}" }.kill
|
161
|
+
self
|
89
162
|
end
|
90
163
|
|
91
164
|
def emit(event, value = nil, opts = { timeout: nil })
|
92
165
|
result = nil
|
93
166
|
Timeout::timeout(opts[:timeout]) do
|
94
|
-
sleep 1 until (result = _write('E', 'EVT', event, _typed(value))) || opts[:timeout]
|
167
|
+
sleep 1 until (result = _write('E', 'EVT', event, _typed(value)) rescue false) || opts[:timeout].nil?
|
95
168
|
end
|
96
169
|
result
|
97
170
|
end
|
@@ -99,6 +172,9 @@ class Deepstream::Client
|
|
99
172
|
def on(event, &block)
|
100
173
|
_write_and_read('E', 'S', event)
|
101
174
|
@event_callbacks[event] = block
|
175
|
+
rescue => e
|
176
|
+
print "Error: ", e.message, "\n" if @verbose
|
177
|
+
@event_callbacks[event] = block
|
102
178
|
end
|
103
179
|
|
104
180
|
def get(record_name)
|
@@ -107,16 +183,19 @@ class Deepstream::Client
|
|
107
183
|
|
108
184
|
def get_record(record_name, list: nil)
|
109
185
|
name = list ? "#{list}/#{record_name}" : record_name
|
186
|
+
if list
|
187
|
+
@records[list] ||= get_list(list)
|
188
|
+
@records[list].add(name)
|
189
|
+
end
|
110
190
|
@records[name] ||= (
|
111
191
|
_write_and_read('R', 'CR', name)
|
112
192
|
msg = _read
|
113
193
|
Deepstream::Record.new(self, name, _parse_data(msg[4]), msg[3].to_i)
|
114
194
|
)
|
115
|
-
if list
|
116
|
-
@records[list] ||= get_list(list)
|
117
|
-
@records[list].add(name)
|
118
|
-
end
|
119
195
|
@records[name]
|
196
|
+
rescue => e
|
197
|
+
print "Error: ", e.message, "\n" if @verbose
|
198
|
+
@records[name] = Deepstream::Record.new(self, name, OpenStruct.new, 0)
|
120
199
|
end
|
121
200
|
|
122
201
|
def get_list(list_name)
|
@@ -125,6 +204,9 @@ class Deepstream::Client
|
|
125
204
|
msg = _read
|
126
205
|
Deepstream::List.new(self, list_name, _parse_data(msg[4]), msg[3].to_i)
|
127
206
|
)
|
207
|
+
rescue => e
|
208
|
+
print "Error: ", e.message, "\n" if @verbose
|
209
|
+
@records[list_name] = Deepstream::List.new(self, list_name, [], 0)
|
128
210
|
end
|
129
211
|
|
130
212
|
def delete(record_name)
|
@@ -133,22 +215,23 @@ class Deepstream::Client
|
|
133
215
|
tmp.remove(record_name)
|
134
216
|
end
|
135
217
|
_write('R', 'D', record_name)
|
218
|
+
rescue => e
|
219
|
+
print "Error: ", e.message, "\n" if @verbose
|
220
|
+
false
|
136
221
|
end
|
137
222
|
|
138
|
-
def
|
139
|
-
|
140
|
-
|
141
|
-
loop { _process_msg(@socket.gets(30.chr).tap { |m| break m.chomp(30.chr).split(31.chr) if m }) }
|
223
|
+
def _resubscribe_events
|
224
|
+
@event_callbacks.keys.each do |event|
|
225
|
+
_write_and_read('E', 'S', event)
|
142
226
|
end
|
143
|
-
rescue
|
144
|
-
print Time.now.to_s[/.+ .+ /], "Can't connect to deepstream server\n"
|
145
|
-
raise
|
146
227
|
end
|
147
228
|
|
148
|
-
def
|
149
|
-
|
150
|
-
|
151
|
-
|
229
|
+
def _sync_records
|
230
|
+
@records.each do |name, record|
|
231
|
+
_write_and_read('R', 'CR', name)
|
232
|
+
msg = _read
|
233
|
+
@records[name]._update(msg[3].to_i, _parse_data(msg[4]))
|
234
|
+
end
|
152
235
|
end
|
153
236
|
|
154
237
|
def _write_and_read(*args)
|
@@ -158,10 +241,10 @@ class Deepstream::Client
|
|
158
241
|
end
|
159
242
|
|
160
243
|
def _write(*args)
|
161
|
-
_connect unless @connected
|
162
244
|
@socket.write(args.join(31.chr) + 30.chr)
|
163
|
-
rescue
|
164
|
-
|
245
|
+
rescue => e
|
246
|
+
raise "not connected" unless @connected
|
247
|
+
raise e
|
165
248
|
end
|
166
249
|
|
167
250
|
def _process_msg(msg)
|
@@ -171,7 +254,10 @@ class Deepstream::Client
|
|
171
254
|
when %w{R U} then @records[msg[2]]._update(msg[3], _parse_data(msg[4]))
|
172
255
|
when %w{R A} then @records.delete(msg[3]) if msg[2] == 'D'
|
173
256
|
when %w{E A} then nil
|
174
|
-
|
257
|
+
when %w{X E} then nil
|
258
|
+
when [] then nil
|
259
|
+
else
|
260
|
+
@unread_msg = msg
|
175
261
|
end
|
176
262
|
end
|
177
263
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: deepstream
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Currency-One S.A.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-06-13 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Basic ruby client for the deepstream.io server
|
14
14
|
email:
|