deepstream 1.0.0 → 1.0.5

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: 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: []