seapig-client 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 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