deepstream 1.0.3 → 1.0.8

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