deepstream 1.0.3 → 1.0.8

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
  SHA256:
3
- metadata.gz: a8cafac8651bd0cb90746e47c290919eb51acb2058e24fd345759ffa0a459996
4
- data.tar.gz: 29d4d74d4e417afd703e0ad190b138b7145cf8699cd5bb1c90ca0d006b95b83a
3
+ metadata.gz: 9fff30aea0355fa344202c8b0d7fc50eb68dc6dcc32d2f5da474f9bca70ef068
4
+ data.tar.gz: c0f4cef7341b68a0378444aa020f3483a6e68fc44dd7c0abb6e7777f94ac6395
5
5
  SHA512:
6
- metadata.gz: f6f1f0bec2528e8fc4694b3febf05a036551fed454277bb3e9d655453805d4e938d51d6bc2a6765ee254739c36d7d6634c03f599659dad25c08ee3907085bafc
7
- data.tar.gz: 968a2b71039dda4367e1152acb96f5ff164c5c14f4736774ee408cc7daa8c32f3d7661473f1eb63f9f745e5e7bd1cd024a2917a6f2281662a7e39251d5444e79
6
+ metadata.gz: c6248cae180ef82f9f1efaecea3366ec2d30c8fc24cf89a395a32e62ac1b75573c2b01a3486f8c30e8584b05dae4ac679318041348148174e8f7fc6367afc396
7
+ data.tar.gz: 82cf0ed01406e8c9e62e91bacf75e4a3005bef50ea9087d87dd73a4f21ba4f2b51b52949676c612a02e9140b6865e39000fcd2eee227b18935eafc04118a5673
data/README.md CHANGED
@@ -79,6 +79,9 @@ foo.data
79
79
  foo.keys
80
80
  # get records from the list
81
81
  foo.all
82
+ # callbacks
83
+ foo.on(:added) { |record| }
84
+ foo.on(:removed) { |record| }
82
85
  ```
83
86
 
84
87
 
data/deepstream.gemspec CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "deepstream"
7
- spec.version = "1.0.3"
7
+ spec.version = "1.0.8"
8
8
  spec.authors = ["Currency-One S.A."]
9
9
  spec.email = ["ruby@currency-one.com"]
10
10
 
@@ -17,12 +17,12 @@ Gem::Specification.new do |spec|
17
17
  spec.bindir = "exe"
18
18
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
19
  spec.require_paths = ["lib"]
20
- spec.required_ruby_version = '>= 2.3.0'
20
+ spec.required_ruby_version = '>= 2.5.0'
21
21
  spec.license = "Apache-2.0"
22
- spec.add_runtime_dependency 'async', '~> 1.25.0'
23
- spec.add_runtime_dependency 'async-io', '~> 1.29.0'
24
- spec.add_runtime_dependency 'async-http', '~> 0.52.1'
25
- spec.add_runtime_dependency 'async-websocket', '~> 0.14.0'
22
+ spec.add_runtime_dependency 'async', '~> 1.28.9'
23
+ spec.add_runtime_dependency 'async-io', '~> 1.30.2'
24
+ spec.add_runtime_dependency 'async-http', '~> 0.54.1'
25
+ spec.add_runtime_dependency 'async-websocket', '~> 0.17.0'
26
26
  spec.add_development_dependency 'cucumber'
27
27
  spec.add_development_dependency 'reel'
28
28
  spec.add_development_dependency 'pry'
@@ -3,22 +3,10 @@ module Async
3
3
  class Client < ::Protocol::HTTP::Middleware
4
4
  include ::Protocol::WebSocket::Headers
5
5
 
6
- def self.open(endpoint, *args, &block)
7
- client = self.new(HTTP::Client.new(endpoint, *args), mask: true)
8
-
9
- return client unless block_given?
10
-
11
- begin
12
- yield client
13
- ensure
14
- client.close
15
- end
16
- end
17
-
18
6
  def self.connect(endpoint, *args, **options, &block)
19
7
  self.open(endpoint, *args) do |client|
20
- connection = client.connect(endpoint.path, **options)
21
-
8
+ connection = client.connect(endpoint.authority, endpoint.path, **options)
9
+
22
10
  return connection unless block_given?
23
11
 
24
12
  begin
@@ -44,14 +32,3 @@ module Async
44
32
  end
45
33
  end
46
34
  end
47
-
48
- module Protocol
49
- module WebSocket
50
- class TextFrame
51
-
52
- def unpack
53
- encoded_readed_string = super.encode(Encoding::UTF_8)
54
- end
55
- end
56
- end
57
- end
@@ -1,4 +1,5 @@
1
1
  module Deepstream
2
2
  class UnknownTopic < StandardError; end
3
3
  class UnknownAction < StandardError; end
4
+ class UnknownListCallback < StandardError; end
4
5
  end
@@ -1,16 +1,21 @@
1
1
  require_relative './record'
2
+ require_relative './exceptions'
2
3
 
3
4
  module Deepstream
4
5
  class List < Record
6
+ LIST_CALLBACKS = %i{added removed}
7
+
5
8
  def initialize(*args)
6
9
  super
7
10
  @data = []
11
+ @handlers = {}
8
12
  end
9
13
 
10
14
  def add(record_name)
11
15
  unless @data.include?(record_name)
12
16
  @data << record_name
13
17
  set
18
+ notify_listeners(:removed, record_name)
14
19
  end
15
20
  rescue => e
16
21
  @client.on_exception(e)
@@ -20,13 +25,14 @@ module Deepstream
20
25
  @version = version.to_i
21
26
  data = JSON.parse(data)
22
27
  if data.is_a?(Array)
23
- @data.concat(data).uniq!
28
+ set_new_data (@data + data).uniq
24
29
  set if @data.size > data.size
25
30
  end
26
31
  end
27
32
 
28
33
  def remove(record_name)
29
34
  set if @data.delete(record_name)
35
+ notify_listeners(:removed, record_name)
30
36
  end
31
37
 
32
38
  def keys
@@ -43,10 +49,53 @@ module Deepstream
43
49
  @is_reinitializing = false
44
50
  end
45
51
 
52
+ def update(version, data)
53
+ @version = version.to_i
54
+ set_new_data JSON.parse(data)
55
+ rescue => e
56
+ @client.on_exception(e)
57
+ end
58
+
59
+ def on(cb_name, &block)
60
+ unless LIST_CALLBACKS.include?(cb_name)
61
+ raise(UnknownListCallback, "Uknown callback name: #{cb_name}. Must be one of: #{LIST_CALLBACKS}")
62
+ end
63
+ (@handlers[cb_name] ||= []).push(block)
64
+ nil
65
+ end
66
+
67
+ def off(cb_name, &block)
68
+ if block_given?
69
+ @handlers[cb_name].delete block
70
+ elsif cb_name
71
+ @handlers[cb_name] = []
72
+ else
73
+ @handlers = {}
74
+ end
75
+ nil
76
+ end
77
+
46
78
  private
47
79
 
48
80
  def set
49
81
  @client.send_message(TOPIC::RECORD, ACTION::UPDATE, @name, (@version += 1), @data.to_json) if @version
50
82
  end
83
+
84
+ def set_new_data(new_data)
85
+ (@data - new_data).each { |uid| notify_listeners(:removed, uid) }
86
+ (new_data - @data).each { |uid| notify_listeners(:added, uid) }
87
+ @data = new_data
88
+ end
89
+
90
+ def notify_listeners(cb_name, uid)
91
+ (@handlers[cb_name] || []).each do |proc|
92
+ record = @client.get(uid)
93
+ if record.__version
94
+ proc.call(record)
95
+ else
96
+ record.when_ready(&proc)
97
+ end
98
+ end
99
+ end
51
100
  end
52
101
  end
@@ -4,6 +4,8 @@ require_relative './helpers'
4
4
 
5
5
  module Deepstream
6
6
  class Record
7
+ attr_reader :data
8
+
7
9
  def initialize(client, name)
8
10
  @client = client
9
11
  @name = name
@@ -12,6 +14,15 @@ module Deepstream
12
14
  @is_reinitializing = false
13
15
  @data_cache = {}
14
16
  @client.send_message(TOPIC::RECORD, ACTION::CREATEORREAD, @name)
17
+ @ready_callback = nil
18
+ end
19
+
20
+ def __version
21
+ @version
22
+ end
23
+
24
+ def __name
25
+ @name
15
26
  end
16
27
 
17
28
  def reset_version
@@ -60,8 +71,16 @@ module Deepstream
60
71
  @client.on_exception(e)
61
72
  end
62
73
 
74
+ def when_ready(&block)
75
+ @ready_callback = block
76
+ end
77
+
63
78
  def read(version, data)
64
79
  update(version, data)
80
+ if @ready_callback
81
+ @ready_callback.call(self)
82
+ @ready_callback = nil
83
+ end
65
84
  end
66
85
 
67
86
  def patch(version, path, value)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deepstream
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Currency-One S.A.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-01-20 00:00:00.000000000 Z
11
+ date: 2021-02-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async
@@ -16,56 +16,56 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.25.0
19
+ version: 1.28.9
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.25.0
26
+ version: 1.28.9
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: async-io
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.29.0
33
+ version: 1.30.2
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 1.29.0
40
+ version: 1.30.2
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: async-http
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 0.52.1
47
+ version: 0.54.1
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 0.52.1
54
+ version: 0.54.1
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: async-websocket
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 0.14.0
61
+ version: 0.17.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 0.14.0
68
+ version: 0.17.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: cucumber
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -175,7 +175,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
175
175
  requirements:
176
176
  - - ">="
177
177
  - !ruby/object:Gem::Version
178
- version: 2.3.0
178
+ version: 2.5.0
179
179
  required_rubygems_version: !ruby/object:Gem::Requirement
180
180
  requirements:
181
181
  - - ">="