seapig-server 0.1.0 → 0.1.1

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: 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
  - - ">="