nats-pure 2.3.0 → 2.4.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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/nats/client.rb +1 -0
- data/lib/nats/io/client.rb +1 -2
- data/lib/nats/io/jetstream/api.rb +4 -0
- data/lib/nats/io/jetstream/manager.rb +21 -2
- data/lib/nats/io/jetstream.rb +82 -7
- data/lib/nats/io/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6a89824c45aafc2a28dbdfe35762fb3172c9210a54097456e8480630910cb741
|
4
|
+
data.tar.gz: b2f99e1fee310ffc0a689f3bb956133ad694230bed23a6c9ad987c4634db6008
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4b2c9b1b010e7701fbafa7e161d1dd915ee24830d72df6ef5455ad87a8d07e2493442c3986121d5556f19e91a2f55ec837938831da61917c7974187b7e8fcea1
|
7
|
+
data.tar.gz: a914e41f74342ab9010f0728351fb1ac37992f71cd60b35448b1542b4818d12580a2792db9fd3ad63a00a08b0acaceff44c1c39f6f6acb7e0e764d40a26afd08
|
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
A thread safe [Ruby](http://ruby-lang.org) client for the [NATS messaging system](https://nats.io) written in pure Ruby.
|
4
4
|
|
5
|
-
[](https://www.apache.org/licenses/LICENSE-2.0)[](http://travis-ci.org/nats-io/nats-pure.rb)[](https://www.apache.org/licenses/LICENSE-2.0)[](http://travis-ci.org/nats-io/nats-pure.rb)[](https://rubygems.org/gems/nats-pure/versions/2.4.0)
|
6
6
|
|
7
7
|
## Getting Started
|
8
8
|
|
data/lib/nats/client.rb
CHANGED
data/lib/nats/io/client.rb
CHANGED
@@ -18,7 +18,6 @@ require_relative 'errors'
|
|
18
18
|
require_relative 'msg'
|
19
19
|
require_relative 'subscription'
|
20
20
|
require_relative 'jetstream'
|
21
|
-
require_relative "rails" if defined?(::Rails::Engine)
|
22
21
|
|
23
22
|
require 'nats/nuid'
|
24
23
|
require 'thread'
|
@@ -1825,7 +1824,7 @@ module NATS
|
|
1825
1824
|
|
1826
1825
|
# Host and Port
|
1827
1826
|
uri_object.hostname ||= "localhost"
|
1828
|
-
uri_object.port ||= DEFAULT_PORT.fetch(
|
1827
|
+
uri_object.port ||= DEFAULT_PORT.fetch(uri_object.scheme.to_sym, DEFAULT_PORT[:nats])
|
1829
1828
|
|
1830
1829
|
uri_object
|
1831
1830
|
end
|
@@ -119,6 +119,9 @@ module NATS
|
|
119
119
|
:num_replicas,
|
120
120
|
# Force memory storage
|
121
121
|
:mem_storage,
|
122
|
+
|
123
|
+
# NATS v2.10 features
|
124
|
+
:metadata, :filter_subjects, :max_bytes,
|
122
125
|
keyword_init: true) do
|
123
126
|
def initialize(opts={})
|
124
127
|
# Filter unrecognized fields just in case.
|
@@ -192,6 +195,7 @@ module NATS
|
|
192
195
|
:republish,
|
193
196
|
:allow_direct,
|
194
197
|
:mirror_direct,
|
198
|
+
:metadata,
|
195
199
|
keyword_init: true) do
|
196
200
|
def initialize(opts={})
|
197
201
|
# Filter unrecognized fields just in case.
|
@@ -106,18 +106,37 @@ module NATS
|
|
106
106
|
else
|
107
107
|
config
|
108
108
|
end
|
109
|
-
|
109
|
+
config[:name] ||= config[:durable_name]
|
110
110
|
req_subject = case
|
111
111
|
when config[:name]
|
112
|
-
|
112
|
+
###############################################################################
|
113
|
+
# #
|
114
|
+
# Using names is the supported way of creating consumers (NATS +v2.9.0. #
|
115
|
+
# #
|
116
|
+
###############################################################################
|
113
117
|
if config[:filter_subject] && config[:filter_subject] != ">"
|
114
118
|
"#{@prefix}.CONSUMER.CREATE.#{stream}.#{config[:name]}.#{config[:filter_subject]}"
|
115
119
|
else
|
120
|
+
##############################################################################
|
121
|
+
# #
|
122
|
+
# Endpoint to support creating ANY consumer with multi-filters (NATS +v2.10) #
|
123
|
+
# #
|
124
|
+
##############################################################################
|
116
125
|
"#{@prefix}.CONSUMER.CREATE.#{stream}.#{config[:name]}"
|
117
126
|
end
|
118
127
|
when config[:durable_name]
|
128
|
+
###############################################################################
|
129
|
+
# #
|
130
|
+
# Endpoint to support creating DURABLES before NATS v2.9.0. #
|
131
|
+
# #
|
132
|
+
###############################################################################
|
119
133
|
"#{@prefix}.CONSUMER.DURABLE.CREATE.#{stream}.#{config[:durable_name]}"
|
120
134
|
else
|
135
|
+
###############################################################################
|
136
|
+
# #
|
137
|
+
# Endpoint to support creating EPHEMERALS before NATS v2.9.0. #
|
138
|
+
# #
|
139
|
+
###############################################################################
|
121
140
|
"#{@prefix}.CONSUMER.CREATE.#{stream}"
|
122
141
|
end
|
123
142
|
|
data/lib/nats/io/jetstream.rb
CHANGED
@@ -105,16 +105,50 @@ module NATS
|
|
105
105
|
|
106
106
|
# subscribe binds or creates a push subscription to a JetStream pull consumer.
|
107
107
|
#
|
108
|
-
# @param subject [String] Subject from which the messages will be fetched.
|
108
|
+
# @param subject [String, Array] Subject(s) from which the messages will be fetched.
|
109
109
|
# @param params [Hash] Options to customize the PushSubscription.
|
110
110
|
# @option params [String] :stream Name of the Stream to which the consumer belongs.
|
111
111
|
# @option params [String] :consumer Name of the Consumer to which the PushSubscription will be bound.
|
112
|
+
# @option params [String] :name Name of the Consumer to which the PushSubscription will be bound.
|
112
113
|
# @option params [String] :durable Consumer durable name from where the messages will be fetched.
|
113
114
|
# @option params [Hash] :config Configuration for the consumer.
|
114
115
|
# @return [NATS::JetStream::PushSubscription]
|
115
116
|
def subscribe(subject, params={}, &cb)
|
116
117
|
params[:consumer] ||= params[:durable]
|
117
|
-
|
118
|
+
params[:consumer] ||= params[:name]
|
119
|
+
multi_filter = case
|
120
|
+
when (subject.is_a?(Array) and subject.size == 1)
|
121
|
+
subject = subject.first
|
122
|
+
false
|
123
|
+
when (subject.is_a?(Array) and subject.size > 1)
|
124
|
+
true
|
125
|
+
end
|
126
|
+
|
127
|
+
#
|
128
|
+
stream = if params[:stream].nil?
|
129
|
+
if multi_filter
|
130
|
+
# Use the first subject to try to find the stream.
|
131
|
+
streams = subject.map do |s|
|
132
|
+
begin
|
133
|
+
find_stream_name_by_subject(s)
|
134
|
+
rescue NATS::JetStream::Error::NotFound
|
135
|
+
raise NATS::JetStream::Error.new("nats: could not find stream matching filter subject '#{s}'")
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
# Ensure that the filter subjects are not ambiguous.
|
140
|
+
streams.uniq!
|
141
|
+
if streams.count > 1
|
142
|
+
raise NATS::JetStream::Error.new("nats: multiple streams matched filter subjects: #{streams}")
|
143
|
+
end
|
144
|
+
|
145
|
+
streams.first
|
146
|
+
else
|
147
|
+
find_stream_name_by_subject(subject)
|
148
|
+
end
|
149
|
+
else
|
150
|
+
params[:stream]
|
151
|
+
end
|
118
152
|
|
119
153
|
queue = params[:queue]
|
120
154
|
durable = params[:durable]
|
@@ -183,7 +217,11 @@ module NATS
|
|
183
217
|
config.deliver_subject = deliver
|
184
218
|
|
185
219
|
# Auto created consumers use the filter subject.
|
186
|
-
|
220
|
+
if multi_filter
|
221
|
+
config[:filter_subjects] ||= subject
|
222
|
+
else
|
223
|
+
config[:filter_subject] ||= subject
|
224
|
+
end
|
187
225
|
|
188
226
|
# Heartbeats / FlowControl
|
189
227
|
config.flow_control = flow_control
|
@@ -219,25 +257,57 @@ module NATS
|
|
219
257
|
|
220
258
|
# pull_subscribe binds or creates a subscription to a JetStream pull consumer.
|
221
259
|
#
|
222
|
-
# @param subject [String] Subject from which the messages will be fetched.
|
260
|
+
# @param subject [String, Array] Subject or subjects from which the messages will be fetched.
|
223
261
|
# @param durable [String] Consumer durable name from where the messages will be fetched.
|
224
262
|
# @param params [Hash] Options to customize the PullSubscription.
|
225
263
|
# @option params [String] :stream Name of the Stream to which the consumer belongs.
|
226
264
|
# @option params [String] :consumer Name of the Consumer to which the PullSubscription will be bound.
|
265
|
+
# @option params [String] :name Name of the Consumer to which the PullSubscription will be bound.
|
227
266
|
# @option params [Hash] :config Configuration for the consumer.
|
228
267
|
# @return [NATS::JetStream::PullSubscription]
|
229
268
|
def pull_subscribe(subject, durable, params={})
|
230
|
-
if durable.empty? && !params[:consumer]
|
269
|
+
if (!durable or durable.empty?) && !(params[:consumer] or params[:name])
|
231
270
|
raise JetStream::Error::InvalidDurableName.new("nats: invalid durable name")
|
232
271
|
end
|
272
|
+
multi_filter = case
|
273
|
+
when (subject.is_a?(Array) and subject.size == 1)
|
274
|
+
subject = subject.first
|
275
|
+
false
|
276
|
+
when (subject.is_a?(Array) and subject.size > 1)
|
277
|
+
true
|
278
|
+
end
|
279
|
+
|
233
280
|
params[:consumer] ||= durable
|
234
|
-
|
281
|
+
params[:consumer] ||= params[:name]
|
282
|
+
stream = if params[:stream].nil?
|
283
|
+
if multi_filter
|
284
|
+
# Use the first subject to try to find the stream.
|
285
|
+
streams = subject.map do |s|
|
286
|
+
begin
|
287
|
+
find_stream_name_by_subject(s)
|
288
|
+
rescue NATS::JetStream::Error::NotFound
|
289
|
+
raise NATS::JetStream::Error.new("nats: could not find stream matching filter subject '#{s}'")
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
# Ensure that the filter subjects are not ambiguous.
|
294
|
+
streams.uniq!
|
295
|
+
if streams.count > 1
|
296
|
+
raise NATS::JetStream::Error.new("nats: multiple streams matched filter subjects: #{streams}")
|
297
|
+
end
|
235
298
|
|
299
|
+
streams.first
|
300
|
+
else
|
301
|
+
find_stream_name_by_subject(subject)
|
302
|
+
end
|
303
|
+
else
|
304
|
+
params[:stream]
|
305
|
+
end
|
236
306
|
begin
|
237
307
|
consumer_info(stream, params[:consumer])
|
238
308
|
rescue NATS::JetStream::Error::NotFound => e
|
239
309
|
# If attempting to bind, then this is a hard error.
|
240
|
-
raise e if params[:stream]
|
310
|
+
raise e if params[:stream] and !multi_filter
|
241
311
|
|
242
312
|
config = if not params[:config]
|
243
313
|
JetStream::API::ConsumerConfig.new
|
@@ -248,6 +318,11 @@ module NATS
|
|
248
318
|
end
|
249
319
|
config[:durable_name] = durable
|
250
320
|
config[:ack_policy] ||= JS::Config::AckExplicit
|
321
|
+
if multi_filter
|
322
|
+
config[:filter_subjects] ||= subject
|
323
|
+
else
|
324
|
+
config[:filter_subject] ||= subject
|
325
|
+
end
|
251
326
|
add_consumer(stream, config)
|
252
327
|
end
|
253
328
|
|
data/lib/nats/io/version.rb
CHANGED
@@ -15,7 +15,7 @@
|
|
15
15
|
module NATS
|
16
16
|
module IO
|
17
17
|
# VERSION is the version of the client announced on CONNECT to the server.
|
18
|
-
VERSION = "2.
|
18
|
+
VERSION = "2.4.0".freeze
|
19
19
|
|
20
20
|
# LANG is the lang runtime of the client announced on CONNECT to the server.
|
21
21
|
LANG = "#{RUBY_ENGINE}#{RUBY_VERSION}".freeze
|
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
|
+
version: 2.4.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
|
+
date: 2023-11-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|