nats-pure 2.4.0 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
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 -3
  5. data/lib/nats/io/client.rb +303 -280
  6. data/lib/nats/io/errors.rb +2 -0
  7. data/lib/nats/io/jetstream/api.rb +53 -50
  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 +103 -101
  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 +102 -106
  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.4.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-11-22 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.