seapig-client 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
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
-