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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7f7364428c78b79e180bfa73ef7d9478e0ddb806
4
- data.tar.gz: 2b8aec0e3f32c6abbb1cdb04a8a630a07b38c698
3
+ metadata.gz: 8a2fbbcbaa6f58227bed8ad11499cce4d6568fa8
4
+ data.tar.gz: a491e1e3deb1286f88ff47939695963455930a20
5
5
  SHA512:
6
- metadata.gz: 4d0e1473c2ee4477195cd91383656ae2b4111f3108f75791d8d3cdb16d7319836698bcb109327265ab33b1a3dfb2294155e16d2d140aa8ba1fa463337118c260
7
- data.tar.gz: 6cacf5cede39228c208c181a1324c30be6abd8e795c1e37a30133a788bb6155f5fc83d76210c20f81af70a6ce69ef948635eb99a7ed443ced237cabc47fd0936
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
@@ -1,3 +1,3 @@
1
1
  module Seapig
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3"
3
3
  end
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.2
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-16 00:00:00.000000000 Z
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
@@ -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
-