seapig-client 0.1.2 → 0.1.3
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/lib/seapig/client.rb +0 -1
- data/lib/seapig/version.rb +1 -1
- metadata +2 -3
- data/lib/seapig/#client.rb# +0 -251
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8a2fbbcbaa6f58227bed8ad11499cce4d6568fa8
|
4
|
+
data.tar.gz: a491e1e3deb1286f88ff47939695963455930a20
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 85a50080420cefbbb952596abcaa633c60e91b48f7dbcb8fbd635eeaed28b21178529b4e96e5ba029f7375fa55334c3a9662cae985fc712a602293f71f37e3c7
|
7
|
+
data.tar.gz: 37ce453bea6c88a70de678fea4c8f9b88bdcb425b5cb3299b042f89ecd7c369fd0ca4e52d877a1a9335661cae905c1a79e2c98f9a32d9b81c75d9c142b77a4b3
|
data/lib/seapig/client.rb
CHANGED
@@ -143,7 +143,6 @@ class SeapigServer
|
|
143
143
|
|
144
144
|
def master(object_id)
|
145
145
|
object = SeapigObject.new(self, object_id)
|
146
|
-
object.version = nil
|
147
146
|
@socket.send JSON.dump(action: 'object-producer-register', pattern: object_id) if @connected
|
148
147
|
@master_objects[object_id] = object
|
149
148
|
end
|
data/lib/seapig/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: seapig-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yunta
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-10-
|
11
|
+
date: 2016-10-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: websocket-eventmachine-client
|
@@ -81,7 +81,6 @@ files:
|
|
81
81
|
- bin/seapig-observer
|
82
82
|
- bin/seapig-worker
|
83
83
|
- lib/seapig-client.rb
|
84
|
-
- lib/seapig/#client.rb#
|
85
84
|
- lib/seapig/client.rb
|
86
85
|
- lib/seapig/version.rb
|
87
86
|
- test/integration/navigation_test.rb
|
data/lib/seapig/#client.rb#
DELETED
@@ -1,251 +0,0 @@
|
|
1
|
-
require 'websocket-eventmachine-client'
|
2
|
-
require 'json'
|
3
|
-
require 'jsondiff'
|
4
|
-
require 'hana'
|
5
|
-
|
6
|
-
class SeapigServer
|
7
|
-
|
8
|
-
attr_reader :socket
|
9
|
-
|
10
|
-
def initialize(uri, options={})
|
11
|
-
@connected = false
|
12
|
-
@uri = uri
|
13
|
-
@options = options
|
14
|
-
@slave_objects = {}
|
15
|
-
@master_objects = {}
|
16
|
-
|
17
|
-
connect
|
18
|
-
end
|
19
|
-
|
20
|
-
|
21
|
-
def connect
|
22
|
-
|
23
|
-
if @socket
|
24
|
-
@socket.onclose {}
|
25
|
-
@socket.close
|
26
|
-
end
|
27
|
-
|
28
|
-
@timeout_timer ||= EM.add_periodic_timer(10) {
|
29
|
-
next if not @socket
|
30
|
-
next if Time.new.to_f - @last_communication_at < 20
|
31
|
-
puts "Seapig ping timeout, reconnecting"
|
32
|
-
connect
|
33
|
-
}
|
34
|
-
|
35
|
-
@connected = false
|
36
|
-
|
37
|
-
@last_communication_at = Time.new.to_f
|
38
|
-
@socket = WebSocket::EventMachine::Client.connect(uri: @uri)
|
39
|
-
|
40
|
-
@socket.onopen {
|
41
|
-
@connected = true
|
42
|
-
@socket.send JSON.dump(action: 'client-options-set', options: @options)
|
43
|
-
@slave_objects.each_pair { |object_id, object|
|
44
|
-
@socket.send JSON.dump(action: 'object-consumer-register', id: object_id, latest_known_version: object.version)
|
45
|
-
}
|
46
|
-
@master_objects.each_pair { |object_id, object|
|
47
|
-
@socket.send JSON.dump(action: 'object-producer-register', pattern: object_id)
|
48
|
-
}
|
49
|
-
@last_communication_at = Time.new.to_f
|
50
|
-
}
|
51
|
-
|
52
|
-
@socket.onmessage { |message|
|
53
|
-
message = JSON.load message
|
54
|
-
#p message['action'], message['id'], message['patch']
|
55
|
-
case message['action']
|
56
|
-
when 'object-update'
|
57
|
-
@slave_objects.values.each { |object|
|
58
|
-
object.patch(message) if object.matches?(message['id'])
|
59
|
-
}
|
60
|
-
when 'object-destroy'
|
61
|
-
@slave_objects.values.each { |object|
|
62
|
-
object.destroy(message) if object.matches?(message['id'])
|
63
|
-
}
|
64
|
-
when 'object-produce'
|
65
|
-
handler = @master_objects.keys.find { |key| key.include?('*') and (message['id'] =~ Regexp.new(Regexp.escape(key).gsub('\*','.*?'))) or (message['id'] == key) }
|
66
|
-
@master_objects[handler].onproduce_proc.call(message['id']) if @master_objects[handler].onproduce_proc
|
67
|
-
@master_objects[handler].upload(0,{},message['id']) if @master_objects[handler]
|
68
|
-
else
|
69
|
-
p :wtf, message
|
70
|
-
end
|
71
|
-
@last_communication_at = Time.new.to_f
|
72
|
-
}
|
73
|
-
|
74
|
-
@socket.onclose { |code, reason|
|
75
|
-
puts 'Seapig connection died unexpectedly (code:'+code.inspect+', reason:'+reason.inspect+'), reconnecting in 1s'
|
76
|
-
EM.add_timer(1) {
|
77
|
-
connect
|
78
|
-
}
|
79
|
-
}
|
80
|
-
|
81
|
-
@socket.onerror { |error|
|
82
|
-
puts 'Seapig error: '+error.inspect
|
83
|
-
}
|
84
|
-
|
85
|
-
@socket.onping {
|
86
|
-
@last_communication_at = Time.new.to_f
|
87
|
-
}
|
88
|
-
|
89
|
-
end
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
def disconnect(detach_fd = false)
|
94
|
-
@connected = false
|
95
|
-
if @timeout_timer
|
96
|
-
@timeout_timer.cancel
|
97
|
-
@timeout_timer = nil
|
98
|
-
end
|
99
|
-
if @socket
|
100
|
-
@socket.onclose {}
|
101
|
-
if detach_fd
|
102
|
-
IO.new(@socket.detach).close
|
103
|
-
else
|
104
|
-
@socket.close
|
105
|
-
end
|
106
|
-
@socket = nil
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
|
111
|
-
def detach_fd
|
112
|
-
disconnect(true)
|
113
|
-
end
|
114
|
-
|
115
|
-
|
116
|
-
def slave(object_id)
|
117
|
-
object = if object_id.include?('*') then SeapigWildcardObject.new(self, object_id) else SeapigObject.new(self, object_id) end
|
118
|
-
@socket.send JSON.dump(action: 'object-consumer-register', id: object_id, latest_known_version: object.version) if @connected
|
119
|
-
@slave_objects[object_id] = object
|
120
|
-
end
|
121
|
-
|
122
|
-
|
123
|
-
def master(object_id)
|
124
|
-
object = SeapigObject.new(self, object_id)
|
125
|
-
object.version = Time.new.to_f
|
126
|
-
@socket.send JSON.dump(action: 'object-producer-register', pattern: object_id) if @connected
|
127
|
-
@master_objects[object_id] = object
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
|
132
|
-
class SeapigObject < Hash
|
133
|
-
|
134
|
-
attr_accessor :version, :object_id, :valid, :onproduce_proc, :stall, :parent, :destroyed
|
135
|
-
|
136
|
-
|
137
|
-
def matches?(id)
|
138
|
-
id =~ Regexp.new(Regexp.escape(@object_id).gsub('\*','.*?'))
|
139
|
-
end
|
140
|
-
|
141
|
-
|
142
|
-
def initialize(server, object_id, parent = nil)
|
143
|
-
@server = server
|
144
|
-
@object_id = object_id
|
145
|
-
@version = 0
|
146
|
-
@onchange_proc = nil
|
147
|
-
@onproduce_proc = nil
|
148
|
-
@valid = false
|
149
|
-
@shadow = JSON.load(JSON.dump(self))
|
150
|
-
@stall = false
|
151
|
-
@parent = parent
|
152
|
-
@destroyed = false
|
153
|
-
end
|
154
|
-
|
155
|
-
|
156
|
-
def onchange(&block)
|
157
|
-
@onchange_proc = block
|
158
|
-
end
|
159
|
-
|
160
|
-
|
161
|
-
def onproduce(&block)
|
162
|
-
@onproduce_proc = block
|
163
|
-
end
|
164
|
-
|
165
|
-
|
166
|
-
def patch(message)
|
167
|
-
if not message['old_version']
|
168
|
-
self.clear
|
169
|
-
elsif message['old_version'] == 0
|
170
|
-
self.clear
|
171
|
-
elsif not @version == message['old_version']
|
172
|
-
p @version, message
|
173
|
-
puts "Seapig lost some updates, this should never happen"
|
174
|
-
exit 2
|
175
|
-
end
|
176
|
-
Hana::Patch.new(message['patch']).apply(self)
|
177
|
-
@version = message['new_version']
|
178
|
-
@valid = true
|
179
|
-
@onchange_proc.call(self) if @onchange_proc
|
180
|
-
end
|
181
|
-
|
182
|
-
|
183
|
-
def set(data, version)
|
184
|
-
if data
|
185
|
-
@stall = false
|
186
|
-
self.clear
|
187
|
-
self.merge!(data)
|
188
|
-
@shadow = sanitized
|
189
|
-
else
|
190
|
-
@stall = true
|
191
|
-
end
|
192
|
-
@version = version
|
193
|
-
end
|
194
|
-
|
195
|
-
|
196
|
-
def changed
|
197
|
-
old_version = @version
|
198
|
-
old_object = @shadow
|
199
|
-
@version += 1
|
200
|
-
@shadow = sanitized
|
201
|
-
upload(old_version, old_object, @object_id)
|
202
|
-
end
|
203
|
-
|
204
|
-
|
205
|
-
def sanitized
|
206
|
-
JSON.load(JSON.dump(self))
|
207
|
-
end
|
208
|
-
|
209
|
-
|
210
|
-
def upload(old_version, old_object, object_id)
|
211
|
-
message = {
|
212
|
-
id: object_id,
|
213
|
-
action: 'object-patch',
|
214
|
-
old_version: old_version,
|
215
|
-
new_version: @version,
|
216
|
-
}
|
217
|
-
if old_version == 0 or @stall
|
218
|
-
message.merge!(value: (if @stall then false else @shadow end))
|
219
|
-
else
|
220
|
-
message.merge!(patch: JsonDiff.generate(old_object, @shadow))
|
221
|
-
end
|
222
|
-
@server.socket.send JSON.dump(message)
|
223
|
-
end
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
end
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
class SeapigWildcardObject < SeapigObject
|
232
|
-
|
233
|
-
|
234
|
-
def patch(message)
|
235
|
-
self[message['id']] ||= SeapigObject.new(@server, message['id'], self)
|
236
|
-
self[message['id']].patch(message)
|
237
|
-
# puts JSON.dump(self)
|
238
|
-
@onchange_proc.call(self[message['id']]) if @onchange_proc
|
239
|
-
end
|
240
|
-
|
241
|
-
|
242
|
-
def destroy(message)
|
243
|
-
if destroyed = self.delete(message['id'])
|
244
|
-
destroyed.destroyed = true
|
245
|
-
@onchange_proc.call(destroyed) if @onchange_proc
|
246
|
-
end
|
247
|
-
end
|
248
|
-
|
249
|
-
end
|
250
|
-
|
251
|
-
|