nats-pure 2.3.0 → 2.5.0

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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -0
  3. data/README.md +10 -3
  4. data/lib/nats/client.rb +7 -2
  5. data/lib/nats/io/client.rb +304 -282
  6. data/lib/nats/io/errors.rb +2 -0
  7. data/lib/nats/io/jetstream/api.rb +54 -47
  8. data/lib/nats/io/jetstream/errors.rb +30 -14
  9. data/lib/nats/io/jetstream/js/config.rb +9 -3
  10. data/lib/nats/io/jetstream/js/header.rb +15 -9
  11. data/lib/nats/io/jetstream/js/status.rb +11 -5
  12. data/lib/nats/io/jetstream/js/sub.rb +4 -2
  13. data/lib/nats/io/jetstream/js.rb +10 -8
  14. data/lib/nats/io/jetstream/manager.rb +104 -83
  15. data/lib/nats/io/jetstream/msg/ack.rb +15 -9
  16. data/lib/nats/io/jetstream/msg/ack_methods.rb +24 -22
  17. data/lib/nats/io/jetstream/msg/metadata.rb +9 -7
  18. data/lib/nats/io/jetstream/msg.rb +11 -4
  19. data/lib/nats/io/jetstream/pull_subscription.rb +21 -10
  20. data/lib/nats/io/jetstream/push_subscription.rb +3 -1
  21. data/lib/nats/io/jetstream.rb +125 -54
  22. data/lib/nats/io/kv/api.rb +7 -3
  23. data/lib/nats/io/kv/bucket_status.rb +7 -5
  24. data/lib/nats/io/kv/errors.rb +25 -2
  25. data/lib/nats/io/kv/manager.rb +19 -10
  26. data/lib/nats/io/kv.rb +359 -22
  27. data/lib/nats/io/msg.rb +19 -19
  28. data/lib/nats/io/parser.rb +23 -23
  29. data/lib/nats/io/rails.rb +2 -0
  30. data/lib/nats/io/subscription.rb +25 -22
  31. data/lib/nats/io/version.rb +4 -2
  32. data/lib/nats/io/websocket.rb +10 -8
  33. data/lib/nats/nuid.rb +33 -22
  34. data/lib/nats/service/callbacks.rb +22 -0
  35. data/lib/nats/service/endpoint.rb +155 -0
  36. data/lib/nats/service/errors.rb +44 -0
  37. data/lib/nats/service/group.rb +37 -0
  38. data/lib/nats/service/monitoring.rb +108 -0
  39. data/lib/nats/service/stats.rb +52 -0
  40. data/lib/nats/service/status.rb +66 -0
  41. data/lib/nats/service/validator.rb +31 -0
  42. data/lib/nats/service.rb +121 -0
  43. data/lib/nats/utils/list.rb +26 -0
  44. data/lib/nats-pure.rb +5 -0
  45. data/lib/nats.rb +10 -6
  46. metadata +176 -5
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NATS
4
+ class Service
5
+ class Status
6
+ attr_reader :service, :started_at
7
+
8
+ def initialize(service)
9
+ @service = service
10
+ @started_at = Time.now
11
+ end
12
+
13
+ def basic
14
+ {
15
+ name: service.name,
16
+ id: service.id,
17
+ version: service.version,
18
+ metadata: service.metadata
19
+ }
20
+ end
21
+
22
+ def info
23
+ {
24
+ **basic,
25
+ description: service.description,
26
+ endpoints: service.endpoints.map do |endpoint|
27
+ {
28
+ name: endpoint.name,
29
+ subject: endpoint.subject,
30
+ queue_group: endpoint.queue,
31
+ metadata: endpoint.metadata
32
+ }
33
+ end
34
+ }
35
+ end
36
+
37
+ def stats
38
+ {
39
+ **basic,
40
+ started: started_at.utc.iso8601,
41
+ endpoints: service.endpoints.map do |endpoint|
42
+ endpoint_stats(endpoint)
43
+ end
44
+ }
45
+ end
46
+
47
+ private
48
+
49
+ def endpoint_stats(endpoint)
50
+ endpoint.stats.synchronize do
51
+ {
52
+ name: endpoint.name,
53
+ subject: endpoint.subject,
54
+ queue_group: endpoint.queue,
55
+ num_requests: endpoint.stats.num_requests,
56
+ processing_time: endpoint.stats.processing_time,
57
+ average_processing_time: endpoint.stats.average_processing_time,
58
+ num_errors: endpoint.stats.num_errors,
59
+ last_error: endpoint.stats.last_error,
60
+ data: service.callbacks.call(:stats, endpoint)
61
+ }
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NATS
4
+ class Service
5
+ module Validator
6
+ REGEX = {
7
+ name: /[A-Za-z0-9\-_]+$/,
8
+ version: /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/,
9
+ subject: /^[^ >]*[>]?$/,
10
+ queue: /^[^ >]*[>]?$/
11
+ }.freeze
12
+
13
+ class << self
14
+ def validate(values)
15
+ raise InvalidNameError unless valid?(values, :name)
16
+ raise InvalidVersionError unless valid?(values, :version)
17
+ raise InvalidSubjectError unless valid?(values, :subject) || nil?(values, :subject)
18
+ raise InvalidQueueError unless valid?(values, :queue) || nil?(values, :queue)
19
+ end
20
+
21
+ def valid?(values, key)
22
+ !values.has_key?(key) || values[key] =~ REGEX[key]
23
+ end
24
+
25
+ def nil?(values, key)
26
+ values.has_key?(key) && values[key].nil?
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "monitor"
4
+
5
+ require_relative "service/group"
6
+ require_relative "service/endpoint"
7
+ require_relative "service/errors"
8
+
9
+ require_relative "service/validator"
10
+ require_relative "service/callbacks"
11
+ require_relative "service/monitoring"
12
+ require_relative "service/status"
13
+ require_relative "service/stats"
14
+
15
+ module NATS
16
+ class Service
17
+ include MonitorMixin
18
+
19
+ DEFAULT_QUEUE = "q"
20
+
21
+ attr_reader :client, :name, :id, :version, :description, :metadata, :queue
22
+ attr_reader :monitoring, :status, :callbacks, :groups, :endpoints
23
+
24
+ def initialize(client, options)
25
+ super()
26
+ validate(options)
27
+
28
+ setup_options(options)
29
+ setup_internals(client)
30
+ end
31
+
32
+ def on_stats(&block)
33
+ callbacks.register(:stats, &block)
34
+ end
35
+
36
+ def on_stop(&block)
37
+ callbacks.register(:stop, &block)
38
+ end
39
+
40
+ def stopped?
41
+ !!@stopped
42
+ end
43
+
44
+ def stop(error = nil)
45
+ return if stopped?
46
+
47
+ synchronize do
48
+ monitoring&.stop
49
+ endpoints&.each(&:stop)
50
+
51
+ callbacks&.call(:stop, error)
52
+ end
53
+ ensure
54
+ synchronize { @stopped = true }
55
+ end
56
+
57
+ def reset
58
+ endpoints.each(&:reset)
59
+ end
60
+
61
+ def info
62
+ status.info
63
+ end
64
+
65
+ def stats
66
+ status.stats
67
+ end
68
+
69
+ def service
70
+ self
71
+ end
72
+
73
+ def subject
74
+ nil
75
+ end
76
+
77
+ private
78
+
79
+ def validate(options)
80
+ Validator.validate(options.slice(:name, :version, :queue))
81
+ end
82
+
83
+ def setup_options(options)
84
+ @name = options[:name]
85
+ @version = options[:version]
86
+ @description = options[:description]
87
+ @metadata = options[:metadata].freeze
88
+ @queue = options[:queue] || DEFAULT_QUEUE
89
+ end
90
+
91
+ def setup_internals(client)
92
+ @client = client
93
+ @id = NATS::NUID.next
94
+
95
+ @monitoring = Monitoring.new(self)
96
+ @status = Status.new(self)
97
+ @callbacks = Callbacks.new(self)
98
+
99
+ @groups = Groups.new(self)
100
+ @endpoints = Endpoints.new(self)
101
+ end
102
+ end
103
+
104
+ class Services < NATS::Utils::List
105
+ attr_reader :client
106
+
107
+ def initialize(client)
108
+ @client = client
109
+ super
110
+ end
111
+
112
+ def add(options)
113
+ client.synchronize do
114
+ service = NATS::Service.new(client, options)
115
+ insert(service)
116
+
117
+ service
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NATS
4
+ class Utils
5
+ class List
6
+ include Enumerable
7
+
8
+ attr_reader :parent
9
+
10
+ def initialize(parent)
11
+ @parent = parent
12
+ @items = Set.new
13
+ end
14
+
15
+ def each
16
+ @items.each do |item|
17
+ yield item
18
+ end
19
+ end
20
+
21
+ def insert(item)
22
+ @items << item
23
+ end
24
+ end
25
+ end
26
+ end
data/lib/nats-pure.rb ADDED
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "nats/io/client"
4
+ require "nats/utils/list"
5
+ require "nats/service"
data/lib/nats.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright 2021 The NATS Authors
2
4
  # Licensed under the Apache License, Version 2.0 (the "License");
3
5
  # you may not use this file except in compliance with the License.
@@ -12,8 +14,10 @@
12
14
  # limitations under the License.
13
15
  #
14
16
 
15
- require 'nats/io/client'
16
- require 'nats/nuid'
17
+ require "nats/utils/list"
18
+ require "nats/io/client"
19
+ require "nats/service"
20
+ require "nats/nuid"
17
21
 
18
22
  # A thread safe Ruby client for the NATS messaging system (https://nats.io).
19
23
  #
@@ -25,15 +29,15 @@ require 'nats/nuid'
25
29
  #
26
30
  # resp = nc.request("foo")
27
31
  # puts "Received: #{msg.data}"
28
- #
29
- #
32
+ #
33
+ #
30
34
  # @example Stream example
31
35
  # nc = NATS.connect("demo.nats.io")
32
36
  # sub = nc.subscribe("foo")
33
- #
37
+ #
34
38
  # nc.publish("foo")
35
39
  # msg = sub.next_msg
36
40
  # puts "Received: #{msg.data}"
37
- #
41
+ #
38
42
  module NATS
39
43
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nats-pure
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Waldemar Quevedo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-09 00:00:00.000000000 Z
11
+ date: 2025-02-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -24,6 +24,160 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: uri
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: securerandom
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: json
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: base64
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
+ - !ruby/object:Gem::Dependency
84
+ name: nkeys
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: websocket
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: bundler
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '1'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '1'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rake
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '13.0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '13.0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rspec
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '3.5'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '3.5'
153
+ - !ruby/object:Gem::Dependency
154
+ name: timecop
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: resolv-replace
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
27
181
  description: NATS is an open-source, high-performance, lightweight cloud messaging
28
182
  system.
29
183
  email:
@@ -32,8 +186,10 @@ executables: []
32
186
  extensions: []
33
187
  extra_rdoc_files: []
34
188
  files:
189
+ - CHANGELOG.md
35
190
  - LICENSE
36
191
  - README.md
192
+ - lib/nats-pure.rb
37
193
  - lib/nats.rb
38
194
  - lib/nats/client.rb
39
195
  - lib/nats/io/client.rb
@@ -65,6 +221,16 @@ files:
65
221
  - lib/nats/io/version.rb
66
222
  - lib/nats/io/websocket.rb
67
223
  - lib/nats/nuid.rb
224
+ - lib/nats/service.rb
225
+ - lib/nats/service/callbacks.rb
226
+ - lib/nats/service/endpoint.rb
227
+ - lib/nats/service/errors.rb
228
+ - lib/nats/service/group.rb
229
+ - lib/nats/service/monitoring.rb
230
+ - lib/nats/service/stats.rb
231
+ - lib/nats/service/status.rb
232
+ - lib/nats/service/validator.rb
233
+ - lib/nats/utils/list.rb
68
234
  - sig/nats/io/client.rbs
69
235
  - sig/nats/io/errors.rbs
70
236
  - sig/nats/io/jetstream.rbs
@@ -95,7 +261,12 @@ files:
95
261
  homepage: https://nats.io
96
262
  licenses:
97
263
  - Apache-2.0
98
- metadata: {}
264
+ metadata:
265
+ bug_tracker_uri: https://github.com/nats-io/nats-pure.rb/issues
266
+ changelog_uri: https://github.com/nats-io/nats-pure.rb/blob/main/CHANGELOG.md
267
+ documentation_uri: https://github.com/nats-io/nats-pure.rb
268
+ homepage_uri: https://github.com/nats-io/nats-pure.rb
269
+ source_code_uri: https://github.com/nats-io/nats-pure.rb
99
270
  post_install_message:
100
271
  rdoc_options: []
101
272
  require_paths:
@@ -104,14 +275,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
104
275
  requirements:
105
276
  - - ">="
106
277
  - !ruby/object:Gem::Version
107
- version: '0'
278
+ version: '3.0'
108
279
  required_rubygems_version: !ruby/object:Gem::Requirement
109
280
  requirements:
110
281
  - - ">="
111
282
  - !ruby/object:Gem::Version
112
283
  version: '0'
113
284
  requirements: []
114
- rubygems_version: 3.4.1
285
+ rubygems_version: 3.5.11
115
286
  signing_key:
116
287
  specification_version: 4
117
288
  summary: NATS is an open-source, high-performance, lightweight cloud messaging system.