seapig-client 0.1.3 → 0.1.4

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: 8a2fbbcbaa6f58227bed8ad11499cce4d6568fa8
4
- data.tar.gz: a491e1e3deb1286f88ff47939695963455930a20
3
+ metadata.gz: 8e6d7c793fd0adf28e9241bfa324a89cd5469ba8
4
+ data.tar.gz: 9fa8f737be79b15bcefe0e130bccf3c47d134f7d
5
5
  SHA512:
6
- metadata.gz: 85a50080420cefbbb952596abcaa633c60e91b48f7dbcb8fbd635eeaed28b21178529b4e96e5ba029f7375fa55334c3a9662cae985fc712a602293f71f37e3c7
7
- data.tar.gz: 37ce453bea6c88a70de678fea4c8f9b88bdcb425b5cb3299b042f89ecd7c369fd0ca4e52d877a1a9335661cae905c1a79e2c98f9a32d9b81c75d9c142b77a4b3
6
+ metadata.gz: da0d27c4a875d53657bdade99201b3e2bf48c6bc081856e9c080fb0d096deb5f1e418ecdfb2cf4b4ed27dc79bb74b7fc1ef77acbeb141dd3a364fb4709a56887
7
+ data.tar.gz: 1feeb44ee9179a5f5800038c6983f0dd5caf46da671513ff1ec2c8a46f06847579cb4bd9e8d9bc43c379ab94eed3246aa20db41a20b0afef0ae78c61f6e28023
data/bin/seapig-worker CHANGED
@@ -9,11 +9,11 @@ class Producer
9
9
  class << self
10
10
  attr_reader :patterns
11
11
  end
12
-
12
+
13
13
  def self.all
14
14
  @producers ||= ObjectSpace.each_object(Class).select { |klass| klass < Producer }
15
15
  end
16
-
16
+
17
17
  end
18
18
 
19
19
  ($LOAD_PATH+['./lib']).each { |load_path|
@@ -30,12 +30,12 @@ EM.run {
30
30
  Producer.all.each { |producer|
31
31
  producer.patterns.each { |pattern|
32
32
  object = server.master(pattern)
33
- object.onproduce { |object_id|
33
+ object.onproduce { |child|
34
34
  start = Time.new
35
- print 'Generated %-30s '%[object_id]
36
- data,version = producer.produce(object_id)
37
- object.set(data, version)
38
- puts 'in %5.2fs'%[(Time.new-start).to_f]
35
+ print 'Sent %-30s '%[child.object_id]
36
+ data, version = producer.produce(child.object_id)
37
+ child.reset.set(data).send(version)
38
+ puts 'in %5.2fs - %s'%[(Time.new-start).to_f,version.inspect]
39
39
  }
40
40
  }
41
41
  }
data/lib/seapig/client.rb CHANGED
@@ -85,8 +85,8 @@ class SeapigServer
85
85
  }
86
86
  when 'object-produce'
87
87
  handler = @master_objects.keys.find { |key| key.include?('*') and (message['id'] =~ Regexp.new(Regexp.escape(key).gsub('\*','.*?'))) or (message['id'] == key) }
88
- @master_objects[handler].onproduce_proc.call(message['id']) if @master_objects[handler].onproduce_proc
89
- @master_objects[handler].upload(0,{},message['id']) if @master_objects[handler]
88
+ raise "Stupid produce" if not @master_objects[handler]
89
+ @master_objects[handler].produce(message['id'],message['version'])
90
90
  else
91
91
  p :wtf, message
92
92
  end
@@ -142,7 +142,8 @@ class SeapigServer
142
142
 
143
143
 
144
144
  def master(object_id)
145
- object = SeapigObject.new(self, object_id)
145
+ object = if object_id.include?('*') then SeapigWildcardObject.new(self, object_id) else SeapigObject.new(self, object_id) end
146
+ object.version = nil
146
147
  @socket.send JSON.dump(action: 'object-producer-register', pattern: object_id) if @connected
147
148
  @master_objects[object_id] = object
148
149
  end
@@ -160,7 +161,8 @@ end
160
161
 
161
162
  class SeapigObject < Hash
162
163
 
163
- attr_accessor :version, :object_id, :valid, :onproduce_proc, :stall, :parent, :destroyed
164
+ attr_accessor :version, :object_id, :stall, :parent, :destroyed, :version_requested
165
+ attr_reader :received_at
164
166
 
165
167
 
166
168
  def matches?(id)
@@ -193,6 +195,8 @@ class SeapigObject < Hash
193
195
 
194
196
 
195
197
  def patch(message)
198
+ @received_at = Time.new
199
+ old_data = @shadow
196
200
  if (not message['old_version']) or (message['old_version'] == 0) or (message['value'])
197
201
  self.clear
198
202
  elsif not @version == message['old_version']
@@ -207,24 +211,31 @@ class SeapigObject < Hash
207
211
  end
208
212
  @version = message['new_version']
209
213
  @valid = true
210
- @onchange_proc.call(self) if @onchange_proc
214
+ @shadow = JSON.load(JSON.dump(self))
215
+ @onchange_proc.call(self) if @onchange_proc and old_data != @shadow
216
+ end
217
+
218
+
219
+ def reset()
220
+ @version = 0
221
+ @shadow = {}
222
+ self
211
223
  end
212
224
 
213
225
 
214
- def set(data, version)
226
+ def set(data)
215
227
  if data
216
228
  @stall = false
217
229
  self.clear
218
230
  self.merge!(data)
219
- @shadow = sanitized
220
231
  else
221
232
  @stall = true
222
233
  end
223
- @version = version
234
+ self
224
235
  end
225
236
 
226
237
 
227
- def changed(new_version=nil)
238
+ def send(new_version=nil)
228
239
  old_version = @version
229
240
  old_object = @shadow
230
241
  @version = (new_version or (Time.new.to_f*1000000).to_i)
@@ -257,6 +268,22 @@ class SeapigObject < Hash
257
268
  end
258
269
  end
259
270
  @server.socket.send JSON.dump(message)
271
+ self
272
+ end
273
+
274
+
275
+ def produce(object_id, version)
276
+ @version_requested = version
277
+ if @onproduce_proc
278
+ @onproduce_proc.call(self)
279
+ else
280
+ self.upload(0,{},object_id)
281
+ end
282
+ end
283
+
284
+
285
+ def valid?
286
+ @valid
260
287
  end
261
288
 
262
289
  end
@@ -265,11 +292,15 @@ end
265
292
 
266
293
  class SeapigWildcardObject < SeapigObject
267
294
 
295
+ def initialize(*args)
296
+ super(*args)
297
+ @children = ObjectSpace::WeakMap.new
298
+ end
299
+
268
300
 
269
301
  def patch(message)
270
302
  self[message['id']] ||= SeapigObject.new(@server, message['id'], self)
271
303
  self[message['id']].patch(message)
272
- # puts JSON.dump(self)
273
304
  @onchange_proc.call(self[message['id']]) if @onchange_proc
274
305
  end
275
306
 
@@ -281,6 +312,16 @@ class SeapigWildcardObject < SeapigObject
281
312
  end
282
313
  end
283
314
 
284
- end
285
315
 
316
+ def produce(object_id, version)
317
+ key = @children.keys.find { |key| key == object_id }
318
+ child = (@children[(key or object_id)] ||= SeapigObject.new(@server, object_id, self))
319
+ child.version_requested = version
320
+ if @onproduce_proc
321
+ @onproduce_proc.call(child)
322
+ else
323
+ child.upload(0,{},object_id)
324
+ end
325
+ end
286
326
 
327
+ end
@@ -1,3 +1,3 @@
1
1
  module Seapig
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
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.3
4
+ version: 0.1.4
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-18 00:00:00.000000000 Z
11
+ date: 2016-11-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: websocket-eventmachine-client