seapig-server 0.1.0 → 0.1.1

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: c92d464df0fe01cbc76a752b14954adb3382f2c7
4
- data.tar.gz: 5e3523365c94ab376bbe71f45eddff0dccafd519
3
+ metadata.gz: 5e65c3f295cd0df66fa6eb84b5f378f5bdaf154c
4
+ data.tar.gz: bc08a91525e10c22b8b43f53229c88730fc9cb87
5
5
  SHA512:
6
- metadata.gz: d61241a434eea5aa514014603e9ee54fecb35486e0eeae099479fdd0924fdfbd2875d2b878a0d77c40355c34663cabe0cbd27301ca1d77e3347d1319958b1ea2
7
- data.tar.gz: a270181bcef678e4742cb03074dc629fe6509e98602b93b7dac0c6ca5201d2c22e5b1c90da3683dc1f5a88c6a48db67da3081e6e66aa19eb4db75eb013c5120a
6
+ metadata.gz: d45ae2a851d939a90e515d2fb1f77f45cec89448d66f5e4e57e9817b964814fcb97a7f49335d45c9c488176426236c45cd8b829e99ed26d138f6310183ed2bf2
7
+ data.tar.gz: 955bcee21a5a417cbaa682562336c618a10380f9c7c8261f8a72f70c35f5a95f2eb8efe5635494bb5689d2db07825dbddafef4ac551c7cb11e9ebab7360089c6
@@ -4,7 +4,7 @@
4
4
  require 'websocket-eventmachine-server'
5
5
  require 'narray'
6
6
  require 'oj'
7
- require 'json-diff'
7
+ require 'jsondiff'
8
8
  require 'hana'
9
9
  require 'set'
10
10
 
@@ -18,7 +18,7 @@ OBJECT_CACHE_SIZE = 1
18
18
 
19
19
  $stdout.sync = true
20
20
 
21
- Oj.default_options = { mode: :strict }
21
+ Oj.default_options = { mode: :compat }
22
22
 
23
23
 
24
24
  module WebSocket
@@ -141,6 +141,11 @@ module SeapigObjectStore
141
141
  end
142
142
 
143
143
 
144
+ # data can be one of:
145
+ # - Hash => given version corresponds to given data
146
+ # - false => given version has no data (aka. stall)
147
+ # - true => given version exists (data unknown)
148
+ # - nil => given version could not be generated (data unknown)
144
149
  def self.version_set(client,id,version,data,requested_version)
145
150
  raise "Update of pattern doesn't make sense" if id.starexp?
146
151
 
@@ -165,7 +170,7 @@ module SeapigObjectStore
165
170
  end
166
171
  }
167
172
  if version.kind_of? Hash
168
- object.version_needed = {} if not object.version_needed
173
+ object.version_needed = {} if (not object.version_needed) or object.version_needed.kind_of?(Integer)
169
174
  old_dependencies = (@@dependencies[id] or Set.new)
170
175
  new_dependencies = (@@dependencies[id] = Set.new(version.keys))
171
176
  (new_dependencies - old_dependencies).each { |added_dependency|
@@ -237,7 +242,9 @@ private
237
242
 
238
243
  def version_set(data,version,requested_version)
239
244
  return false if data == nil
240
- return false if not version_newer?(version)
245
+ return false if not SeapigObject.version_newer?(version_latest, version)
246
+ @version_needed = version if data == true and ((not @version_needed) or SeapigObject.version_newer?(@version_needed, version))
247
+ return false if data == true
241
248
  @versions << [version,data]
242
249
  (Set.new(@wildcard_consumers.keys)+@direct_consumers).each { |client| client.object_update(@id, version, data) } if data
243
250
  versions_with_valid_data = 0
@@ -257,8 +264,7 @@ private
257
264
  end
258
265
 
259
266
 
260
- def version_newer?(vb)
261
- latest = version_latest
267
+ def self.version_newer?(latest,vb)
262
268
  return latest <=> vb if (not latest.kind_of?(Hash)) and (not vb.kind_of?(Hash))
263
269
  return -1 if (not latest.kind_of?(Hash)) and ( vb.kind_of?(Hash))
264
270
  return 1 if ( latest.kind_of?(Hash)) and (not vb.kind_of?(Hash))
@@ -390,7 +396,7 @@ private
390
396
  def self.dequeue(client,object)
391
397
  object = @@queue.find { |candidate_object| candidate_object.direct_producers.include?(client) or candidate_object.wildcard_producers.has_key?(client) } if not object
392
398
  return false if not @@queue.include?(object)
393
- version_snapshot = (object.version_needed == nil ? nil : object.version_needed.clone)
399
+ version_snapshot = (object.version_needed == nil ? nil : (object.version_needed.kind_of?(Fixnum) ? object.version_needed : object.version_needed.clone))
394
400
  client.object_produce(object.id, version_snapshot)
395
401
  @@queue.delete(object)
396
402
  @@producing[client] = object
@@ -480,9 +486,10 @@ class Client
480
486
  end
481
487
 
482
488
 
483
- def producer_register(pattern)
489
+ def producer_register(pattern, known_version)
484
490
  @produces.add(pattern)
485
491
  SeapigObjectStore.producer_register(pattern, self)
492
+ SeapigObjectStore.version_set(self, pattern, known_version, true, false) if known_version and not pattern.starexp?
486
493
  end
487
494
 
488
495
 
@@ -497,9 +504,11 @@ class Client
497
504
  end
498
505
 
499
506
 
500
- def consumer_register(pattern)
507
+ def consumer_register(pattern, known_version)
501
508
  @consumes.add(pattern)
509
+ @versions[pattern] = known_version if not pattern.starexp?
502
510
  SeapigObjectStore.consumer_register(pattern, self)
511
+ gc_versions
503
512
  end
504
513
 
505
514
 
@@ -527,7 +536,7 @@ class Client
527
536
  { "value" => object_data }
528
537
  else
529
538
  diff = SeapigObjectStore.cache_get(object_id,[:diff,old_version,object_version])
530
- diff = SeapigObjectStore.cache_set(object_id,[:diff,old_version,object_version],JsonDiff.diff(old_data, object_data)) if not diff
539
+ diff = SeapigObjectStore.cache_set(object_id,[:diff,old_version,object_version],JsonDiff.generate(old_data, object_data)) if not diff
531
540
  { "patch" => diff }
532
541
  end
533
542
 
@@ -607,7 +616,7 @@ class Client
607
616
 
608
617
 
609
618
  def self.send_heartbeats
610
- @@clients_by_socket.each_pair { |socket,client| socket.send Oj.dump(action: 'heartbeat') if client.options['heartbeat'] }
619
+ @@clients_by_socket.each_pair { |socket,client| socket.send Oj.dump('action' => 'heartbeat') if client.options['heartbeat'] }
611
620
  end
612
621
 
613
622
 
@@ -664,7 +673,7 @@ EM.run {
664
673
  case message['action']
665
674
  when 'object-producer-register'
666
675
  fail unless message['pattern']
667
- client.producer_register(message['pattern'])
676
+ client.producer_register(message['pattern'],message['known-version'])
668
677
  when 'object-producer-unregister'
669
678
  fail unless message['pattern']
670
679
  client.producer_unregister(message['pattern'])
@@ -673,7 +682,7 @@ EM.run {
673
682
  client.object_patch(object_id,message['patch'], message['value'], message['old_version'], message['new_version'])
674
683
  when 'object-consumer-register'
675
684
  fail unless message['id']
676
- client.consumer_register(object_id)
685
+ client.consumer_register(object_id,message['known-version'])
677
686
  when 'object-consumer-unregister'
678
687
  fail unless message['id']
679
688
  client.consumer_unregister(object_id)
@@ -1,3 +1,3 @@
1
1
  module Seapig
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: seapig-server
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - yunta
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-11 00:00:00.000000000 Z
11
+ date: 2016-10-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: websocket-eventmachine-server
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: json-diff
42
+ name: jsondiff
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="