deepstream 1.0.0 → 1.0.5

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: bc30a0e0a97440b9c2cde61f862e835cad8f56fbe90c273f00c600b1ae9e947b
4
- data.tar.gz: 4e0fb0d6fed3e2df75bb62711c3c0ac3498a4ffe2f1ce52a6c3b4b9d536f1186
3
+ metadata.gz: e0167226999cb5c1382b9d396aa2e8ce699fae587de39a970e9bdd64427a9e2a
4
+ data.tar.gz: 4b703477f808e422b964a0bbe0d23c7d0eef50d6bd815c109a334a59f98163e3
5
5
  SHA512:
6
- metadata.gz: ff69e6bfd97ec1491c84c1b34e0635bad8c38547afa29c6276dfd164f1ba0c08866f01c1e81f90572c3b802dd7300b7910a73691c9e4c1c5719d237dde73cd73
7
- data.tar.gz: 86c5c00074bc6581ffe5e6c9c396aee7180a4dae71473e7caab36f00f272c7b44adbef8783720e0899c0665df5e4ef0297ce25ba445ee315ba0008d1ab92dd0b
6
+ metadata.gz: 7b8c909ac4d4dc9117749a63e077d423f995ac340ca6bd843286c6dee0bc7eda4285ff69efb98a7285924ba83335832e45165ad265cecf356dbdf4f71ca44837
7
+ data.tar.gz: 642ded8ef97cc5429331accc0d86405e5938b8fe660a3dfc36bc1d2690799df882002d6bb4d4f3769cafac8bb1ca70ff6d341a7a64c31b90c31f3c5a1443dda3
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,9 +4,9 @@ $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.0"
7
+ spec.version = "1.0.5"
8
8
  spec.authors = ["Currency-One S.A."]
9
- spec.email = ["piotr.szczudlak@currency-one.com"]
9
+ spec.email = ["ruby@currency-one.com"]
10
10
 
11
11
  spec.summary = %q{deepstream.io ruby client}
12
12
  spec.description = %q{Basic ruby client for the deepstream.io server}
@@ -20,10 +20,9 @@ Gem::Specification.new do |spec|
20
20
  spec.required_ruby_version = '>= 2.3.0'
21
21
  spec.license = "Apache-2.0"
22
22
  spec.add_runtime_dependency 'async', '~> 1.25.0'
23
- spec.add_runtime_dependency 'async/io/stream', '~> 1.29.0'
24
- spec.add_runtime_dependency 'async/http/endpoint', '~> 0.52.1'
25
- spec.add_runtime_dependency 'async/websocket/client', '~> 0.14.0'
26
- spec.add_runtime_dependency 'async/logger'
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'
27
26
  spec.add_development_dependency 'cucumber'
28
27
  spec.add_development_dependency 'reel'
29
28
  spec.add_development_dependency 'pry'
data/lib/deepstream.rb CHANGED
@@ -11,4 +11,4 @@
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
13
 
14
- require 'deepstream/client'
14
+ require_relative './deepstream/client'
@@ -3,6 +3,18 @@ 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
+
6
18
  def self.connect(endpoint, *args, **options, &block)
7
19
  self.open(endpoint, *args) do |client|
8
20
  connection = client.connect(endpoint.path, **options)
@@ -32,14 +44,3 @@ module Async
32
44
  end
33
45
  end
34
46
  end
35
-
36
- module Protocol
37
- module WebSocket
38
- class TextFrame
39
-
40
- def unpack
41
- encoded_readed_string = super.encode(Encoding::UTF_8)
42
- end
43
- end
44
- end
45
- end
@@ -4,14 +4,14 @@ require 'async/io/stream'
4
4
  require 'async/http/endpoint'
5
5
  require 'async/websocket/client'
6
6
  require 'async/logger'
7
- require 'deepstream/constants'
8
- require 'deepstream/error_handler'
9
- require 'deepstream/event_handler'
10
- require 'deepstream/record_handler'
11
- require 'deepstream/helpers'
12
- require 'deepstream/message'
13
- require 'deepstream/exceptions'
14
- require 'deepstream/async_patch'
7
+ require_relative './constants'
8
+ require_relative './error_handler'
9
+ require_relative './event_handler'
10
+ require_relative './record_handler'
11
+ require_relative './helpers'
12
+ require_relative './message'
13
+ require_relative './exceptions'
14
+ require_relative './async_patch'
15
15
 
16
16
  module Deepstream
17
17
  class Client
@@ -227,7 +227,7 @@ module Deepstream
227
227
  break if ( connection.closed? || @deliberate_close )
228
228
  while !@message_buffer.empty? && (logged_in? || !@message_buffer[0].needs_authentication?)
229
229
  msg = @message_buffer.shift
230
- next if message.expired?
230
+ next if msg.expired?
231
231
  encoded_msg = msg.to_s.encode(Encoding::UTF_8)
232
232
  @log.info "Sending msg = #{msg.inspect}" if @verbose
233
233
  connection.write(encoded_msg)
@@ -1,6 +1,6 @@
1
- require 'deepstream/constants'
2
- require 'deepstream/helpers'
3
- require 'deepstream/message'
1
+ require_relative './constants'
2
+ require_relative './helpers'
3
+ require_relative './message'
4
4
 
5
5
  module Deepstream
6
6
  class ErrorHandler
@@ -1,7 +1,7 @@
1
- require 'deepstream/ack_timeout_registry'
2
- require 'deepstream/constants'
3
- require 'deepstream/exceptions'
4
- require 'deepstream/helpers'
1
+ require_relative './ack_timeout_registry'
2
+ require_relative './constants'
3
+ require_relative './exceptions'
4
+ require_relative './helpers'
5
5
 
6
6
  module Deepstream
7
7
  class EventHandler
@@ -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
@@ -46,7 +46,7 @@ module Deepstream
46
46
  url.tap do |url|
47
47
  url.prepend(SCHEME) unless url.start_with?(/ws(s|)\:\/\//)
48
48
  url.concat(":#{DEFAULT_PORT}") unless url[/\:\d+/]
49
- url.concat("/#{DEFAULT_PATH}") unless url[/\/\w+$/]
49
+ url.concat("/#{DEFAULT_PATH}") unless url[/:\d+\/\S+$/]
50
50
  end
51
51
  end
52
52
 
@@ -1,16 +1,21 @@
1
- require 'deepstream/record'
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()
95
+ else
96
+ record.when_ready(&proc)
97
+ end
98
+ end
99
+ end
51
100
  end
52
101
  end
@@ -1,5 +1,5 @@
1
1
  require 'json'
2
- require 'deepstream/constants'
2
+ require_relative './constants'
3
3
 
4
4
  module Deepstream
5
5
  class Message
@@ -1,9 +1,11 @@
1
1
  require 'json'
2
- require 'deepstream/constants'
3
- require 'deepstream/helpers'
2
+ require_relative './constants'
3
+ 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,7 @@ 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
15
18
  end
16
19
 
17
20
  def reset_version
@@ -60,8 +63,16 @@ module Deepstream
60
63
  @client.on_exception(e)
61
64
  end
62
65
 
66
+ def when_ready(&block)
67
+ @ready_callback = block
68
+ end
69
+
63
70
  def read(version, data)
64
71
  update(version, data)
72
+ if @ready_callback
73
+ @ready_callback.call(self)
74
+ @ready_callback = nil
75
+ end
65
76
  end
66
77
 
67
78
  def patch(version, path, value)
@@ -1,7 +1,7 @@
1
- require 'deepstream/constants'
2
- require 'deepstream/exceptions'
3
- require 'deepstream/list'
4
- require 'deepstream/record'
1
+ require_relative './constants'
2
+ require_relative './exceptions'
3
+ require_relative './list'
4
+ require_relative './record'
5
5
 
6
6
  module Deepstream
7
7
  class RecordHandler
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.0
4
+ version: 1.0.5
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-19 00:00:00.000000000 Z
11
+ date: 2021-02-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: 1.25.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: async/io/stream
28
+ name: async-io
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: 1.29.0
41
41
  - !ruby/object:Gem::Dependency
42
- name: async/http/endpoint
42
+ name: async-http
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: 0.52.1
55
55
  - !ruby/object:Gem::Dependency
56
- name: async/websocket/client
56
+ name: async-websocket
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
@@ -66,20 +66,6 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: 0.14.0
69
- - !ruby/object:Gem::Dependency
70
- name: async/logger
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :runtime
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: cucumber
85
71
  requirement: !ruby/object:Gem::Requirement
@@ -152,7 +138,7 @@ dependencies:
152
138
  version: '0'
153
139
  description: Basic ruby client for the deepstream.io server
154
140
  email:
155
- - piotr.szczudlak@currency-one.com
141
+ - ruby@currency-one.com
156
142
  executables: []
157
143
  extensions: []
158
144
  extra_rdoc_files: []