nats-pure 2.0.0.pre.rc2 → 2.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/nats/io/client.rb +14 -26
- data/lib/nats/io/js.rb +77 -20
- data/lib/nats/io/version.rb +2 -2
- data/lib/nats/nuid.rb +3 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 154ce22f3fa8a4256d0a0bc45fd3356286956c6f774f8332e5892c0be6af45d8
|
4
|
+
data.tar.gz: de9022e08deff77f48c3ef8dd4e538d307ddc44eea57ac884b862893df354750
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 92f10f12b63062c756a5b041e1e2f604d23f7b372d9c3a22425d91e0cb2e6d0ff09f805722cdbe30eb6599566ec3715006127a144c2e9df92724dd307dc2d8b7
|
7
|
+
data.tar.gz: 3ec16e14c8ecfc15d9d8f00c2af4413c7ca35f372ac5ca38d7577df9629ca0b22a7885b0abd7c9665e9004b8c1592823ce23bb37285b3609a320c086efc98be9
|
data/lib/nats/io/client.rb
CHANGED
@@ -227,6 +227,7 @@ module NATS
|
|
227
227
|
opts[:pedantic] = false if opts[:pedantic].nil?
|
228
228
|
opts[:reconnect] = true if opts[:reconnect].nil?
|
229
229
|
opts[:old_style_request] = false if opts[:old_style_request].nil?
|
230
|
+
opts[:ignore_discovered_urls] = false if opts[:ignore_discovered_urls].nil?
|
230
231
|
opts[:reconnect_time_wait] = NATS::IO::RECONNECT_TIME_WAIT if opts[:reconnect_time_wait].nil?
|
231
232
|
opts[:max_reconnect_attempts] = NATS::IO::MAX_RECONNECT_ATTEMPTS if opts[:max_reconnect_attempts].nil?
|
232
233
|
opts[:ping_interval] = NATS::IO::DEFAULT_PING_INTERVAL if opts[:ping_interval].nil?
|
@@ -237,6 +238,7 @@ module NATS
|
|
237
238
|
opts[:pedantic] = ENV['NATS_PEDANTIC'].downcase == 'true' unless ENV['NATS_PEDANTIC'].nil?
|
238
239
|
opts[:reconnect] = ENV['NATS_RECONNECT'].downcase == 'true' unless ENV['NATS_RECONNECT'].nil?
|
239
240
|
opts[:reconnect_time_wait] = ENV['NATS_RECONNECT_TIME_WAIT'].to_i unless ENV['NATS_RECONNECT_TIME_WAIT'].nil?
|
241
|
+
opts[:ignore_discovered_urls] = ENV['NATS_IGNORE_DISCOVERED_URLS'].downcase == 'true' unless ENV['NATS_IGNORE_DISCOVERED_URLS'].nil?
|
240
242
|
opts[:max_reconnect_attempts] = ENV['NATS_MAX_RECONNECT_ATTEMPTS'].to_i unless ENV['NATS_MAX_RECONNECT_ATTEMPTS'].nil?
|
241
243
|
opts[:ping_interval] = ENV['NATS_PING_INTERVAL'].to_i unless ENV['NATS_PING_INTERVAL'].nil?
|
242
244
|
opts[:max_outstanding_pings] = ENV['NATS_MAX_OUTSTANDING_PINGS'].to_i unless ENV['NATS_MAX_OUTSTANDING_PINGS'].nil?
|
@@ -256,7 +258,7 @@ module NATS
|
|
256
258
|
end
|
257
259
|
@server_pool << {
|
258
260
|
:uri => nats_uri,
|
259
|
-
:hostname => nats_uri.
|
261
|
+
:hostname => nats_uri.hostname
|
260
262
|
}
|
261
263
|
end
|
262
264
|
|
@@ -807,17 +809,17 @@ module NATS
|
|
807
809
|
|
808
810
|
# Detect any announced server that we might not be aware of...
|
809
811
|
connect_urls = @server_info[:connect_urls]
|
810
|
-
if connect_urls
|
812
|
+
if !@options[:ignore_discovered_urls] && connect_urls
|
811
813
|
srvs = []
|
812
814
|
connect_urls.each do |url|
|
813
815
|
scheme = client_using_secure_connection? ? "tls" : "nats"
|
814
816
|
u = URI.parse("#{scheme}://#{url}")
|
815
817
|
|
816
818
|
# Skip in case it is the current server which we already know
|
817
|
-
next if @uri.
|
819
|
+
next if @uri.hostname == u.hostname && @uri.port == u.port
|
818
820
|
|
819
821
|
present = server_pool.detect do |srv|
|
820
|
-
srv[:uri].
|
822
|
+
srv[:uri].hostname == u.hostname && srv[:uri].port == u.port
|
821
823
|
end
|
822
824
|
|
823
825
|
if not present
|
@@ -832,7 +834,7 @@ module NATS
|
|
832
834
|
end
|
833
835
|
|
834
836
|
# NOTE: Auto discovery won't work here when TLS host verification is enabled.
|
835
|
-
srv = { :uri => u, :reconnect_attempts => 0, :discovered => true, :hostname => u.
|
837
|
+
srv = { :uri => u, :reconnect_attempts => 0, :discovered => true, :hostname => u.hostname }
|
836
838
|
srvs << srv
|
837
839
|
end
|
838
840
|
end
|
@@ -1758,34 +1760,20 @@ module NATS
|
|
1758
1760
|
end
|
1759
1761
|
|
1760
1762
|
def process_uri(uris)
|
1761
|
-
|
1762
|
-
uris.split(',').each do |uri|
|
1763
|
+
uris.split(',').map do |uri|
|
1763
1764
|
opts = {}
|
1764
1765
|
|
1765
1766
|
# Scheme
|
1766
|
-
if uri.include?("://")
|
1767
|
-
scheme, uri = uri.split("://")
|
1768
|
-
opts[:scheme] = scheme
|
1769
|
-
else
|
1770
|
-
opts[:scheme] = 'nats'
|
1771
|
-
end
|
1767
|
+
uri = "nats://#{uri}" if !uri.include?("://")
|
1772
1768
|
|
1773
|
-
|
1774
|
-
if uri.include?("@")
|
1775
|
-
userinfo, endpoint = uri.split("@")
|
1776
|
-
host, port = endpoint.split(":")
|
1777
|
-
opts[:userinfo] = userinfo
|
1778
|
-
else
|
1779
|
-
host, port = uri.split(":")
|
1780
|
-
end
|
1769
|
+
uri_object = URI(uri)
|
1781
1770
|
|
1782
1771
|
# Host and Port
|
1783
|
-
|
1784
|
-
|
1772
|
+
uri_object.hostname ||= "localhost"
|
1773
|
+
uri_object.port ||= DEFAULT_PORT
|
1785
1774
|
|
1786
|
-
|
1775
|
+
uri_object
|
1787
1776
|
end
|
1788
|
-
connect_uris
|
1789
1777
|
end
|
1790
1778
|
end
|
1791
1779
|
|
@@ -1834,7 +1822,7 @@ module NATS
|
|
1834
1822
|
end
|
1835
1823
|
|
1836
1824
|
def connect
|
1837
|
-
addrinfo = ::Socket.getaddrinfo(@uri.
|
1825
|
+
addrinfo = ::Socket.getaddrinfo(@uri.hostname, nil, ::Socket::AF_UNSPEC, ::Socket::SOCK_STREAM)
|
1838
1826
|
addrinfo.each_with_index do |ai, i|
|
1839
1827
|
begin
|
1840
1828
|
@socket = connect_addrinfo(ai, @uri.port, @connect_timeout)
|
data/lib/nats/io/js.rb
CHANGED
@@ -118,6 +118,7 @@ module NATS
|
|
118
118
|
manual_ack = params[:manual_ack]
|
119
119
|
idle_heartbeat = params[:idle_heartbeat]
|
120
120
|
flow_control = params[:flow_control]
|
121
|
+
config = params[:config]
|
121
122
|
|
122
123
|
if queue
|
123
124
|
if durable and durable != queue
|
@@ -284,6 +285,7 @@ module NATS
|
|
284
285
|
end
|
285
286
|
stream = config[:name]
|
286
287
|
raise ArgumentError.new(":name is required to create streams") unless stream
|
288
|
+
raise ArgumentError.new("Spaces, tabs, period (.), greater than (>) or asterisk (*) are prohibited in stream names") if stream =~ /(\s|\.|\>|\*)/
|
287
289
|
req_subject = "#{@prefix}.STREAM.CREATE.#{stream}"
|
288
290
|
result = api_request(req_subject, config.to_json, params)
|
289
291
|
JetStream::API::StreamCreateResponse.new(result)
|
@@ -345,6 +347,7 @@ module NATS
|
|
345
347
|
stream_name: stream,
|
346
348
|
config: config
|
347
349
|
}
|
350
|
+
|
348
351
|
result = api_request(req_subject, req.to_json, params)
|
349
352
|
JetStream::API::ConsumerInfo.new(result).freeze
|
350
353
|
end
|
@@ -502,11 +505,14 @@ module NATS
|
|
502
505
|
synchronize do
|
503
506
|
unless @pending_queue.empty?
|
504
507
|
msg = @pending_queue.pop
|
508
|
+
@pending_size -= msg.data.size
|
505
509
|
# Check for a no msgs response status.
|
506
510
|
if JS.is_status_msg(msg)
|
507
511
|
case msg.header["Status"]
|
508
512
|
when JS::Status::NoMsgs
|
509
513
|
msg = nil
|
514
|
+
when JS::Status::RequestTimeout
|
515
|
+
# Skip
|
510
516
|
else
|
511
517
|
raise JS.from_msg(msg)
|
512
518
|
end
|
@@ -525,7 +531,12 @@ module NATS
|
|
525
531
|
# Wait for result of fetch or timeout.
|
526
532
|
synchronize { wait_for_msgs_cond.wait(timeout) }
|
527
533
|
|
528
|
-
|
534
|
+
unless @pending_queue.empty?
|
535
|
+
msg = @pending_queue.pop
|
536
|
+
@pending_size -= msg.data.size
|
537
|
+
|
538
|
+
msgs << msg
|
539
|
+
end
|
529
540
|
|
530
541
|
duration = MonotonicTime.since(t)
|
531
542
|
if duration > timeout
|
@@ -535,7 +546,13 @@ module NATS
|
|
535
546
|
# Should have received at least a message at this point,
|
536
547
|
# if that is not the case then error already.
|
537
548
|
if JS.is_status_msg(msgs.first)
|
538
|
-
|
549
|
+
msg = msgs.first
|
550
|
+
case msg.header[JS::Header::Status]
|
551
|
+
when JS::Status::RequestTimeout
|
552
|
+
raise NATS::Timeout.new("nats: fetch request timeout")
|
553
|
+
else
|
554
|
+
raise JS.from_msg(msgs.first)
|
555
|
+
end
|
539
556
|
end
|
540
557
|
end
|
541
558
|
when batch > 1
|
@@ -546,7 +563,23 @@ module NATS
|
|
546
563
|
# Check if there already enough in the pending buffer.
|
547
564
|
synchronize do
|
548
565
|
if batch <= @pending_queue.size
|
549
|
-
batch.times
|
566
|
+
batch.times do
|
567
|
+
msg = @pending_queue.pop
|
568
|
+
@pending_size -= msg.data.size
|
569
|
+
|
570
|
+
# Check for a no msgs response status.
|
571
|
+
if JS.is_status_msg(msg)
|
572
|
+
case msg.header[JS::Header::Status]
|
573
|
+
when JS::Status::NoMsgs, JS::Status::RequestTimeout
|
574
|
+
# Skip these
|
575
|
+
next
|
576
|
+
else
|
577
|
+
raise JS.from_msg(msg)
|
578
|
+
end
|
579
|
+
else
|
580
|
+
msgs << msg
|
581
|
+
end
|
582
|
+
end
|
550
583
|
|
551
584
|
return msgs
|
552
585
|
end
|
@@ -559,10 +592,15 @@ module NATS
|
|
559
592
|
# Not receiving even one is a timeout.
|
560
593
|
start_time = MonotonicTime.now
|
561
594
|
msg = nil
|
562
|
-
|
595
|
+
|
596
|
+
synchronize do
|
563
597
|
wait_for_msgs_cond.wait(timeout)
|
564
|
-
|
565
|
-
|
598
|
+
|
599
|
+
unless @pending_queue.empty?
|
600
|
+
msg = @pending_queue.pop
|
601
|
+
@pending_size -= msg.data.size
|
602
|
+
end
|
603
|
+
end
|
566
604
|
|
567
605
|
# Check if the first message was a response saying that
|
568
606
|
# there are no messages.
|
@@ -574,11 +612,13 @@ module NATS
|
|
574
612
|
next_req.delete(:no_wait)
|
575
613
|
|
576
614
|
@nc.publish(@jsi.nms, JS.next_req_to_json(next_req), @subject)
|
615
|
+
when JS::Status::RequestTimeout
|
616
|
+
raise NATS::Timeout.new("nats: fetch request timeout")
|
577
617
|
else
|
578
618
|
raise JS.from_msg(msg)
|
579
619
|
end
|
580
620
|
else
|
581
|
-
msgs << msg
|
621
|
+
msgs << msg unless msg.nil?
|
582
622
|
end
|
583
623
|
|
584
624
|
# Check if have not received yet a single message.
|
@@ -605,23 +645,27 @@ module NATS
|
|
605
645
|
end
|
606
646
|
else
|
607
647
|
msg = @pending_queue.pop
|
648
|
+
@pending_size -= msg.data.size
|
608
649
|
|
609
650
|
if JS.is_status_msg(msg)
|
610
|
-
case msg.header[
|
651
|
+
case msg.header[JS::Header::Status]
|
611
652
|
when JS::Status::NoMsgs, JS::Status::RequestTimeout
|
612
653
|
duration = MonotonicTime.since(start_time)
|
613
654
|
|
614
|
-
|
615
|
-
|
616
|
-
|
655
|
+
if duration > timeout
|
656
|
+
# Only received a subset of the messages.
|
657
|
+
if !msgs.empty?
|
658
|
+
return msgs
|
659
|
+
else
|
660
|
+
raise NATS::Timeout.new("nats: fetch timeout")
|
661
|
+
end
|
617
662
|
end
|
618
|
-
|
619
|
-
# Likely only received a subset of the messages.
|
620
|
-
return msgs
|
621
663
|
else
|
622
664
|
raise JS.from_msg(msg)
|
623
665
|
end
|
666
|
+
|
624
667
|
else
|
668
|
+
# Add to the set of messages that will be returned.
|
625
669
|
msgs << msg
|
626
670
|
needed -= 1
|
627
671
|
end
|
@@ -1092,12 +1136,24 @@ module NATS
|
|
1092
1136
|
# @return [Integer]
|
1093
1137
|
# @!attribute max_ack_pending
|
1094
1138
|
# @return [Integer]
|
1095
|
-
ConsumerConfig = Struct.new(:durable_name, :description,
|
1096
|
-
:
|
1097
|
-
:
|
1139
|
+
ConsumerConfig = Struct.new(:durable_name, :description,
|
1140
|
+
:deliver_policy, :opt_start_seq, :opt_start_time,
|
1141
|
+
:ack_policy, :ack_wait, :max_deliver, :backoff,
|
1098
1142
|
:filter_subject, :replay_policy, :rate_limit_bps,
|
1099
1143
|
:sample_freq, :max_waiting, :max_ack_pending,
|
1100
1144
|
:flow_control, :idle_heartbeat, :headers_only,
|
1145
|
+
|
1146
|
+
# Pull based options
|
1147
|
+
:max_batch, :max_expires,
|
1148
|
+
# Push based consumers
|
1149
|
+
:deliver_subject, :deliver_group,
|
1150
|
+
# Ephemeral inactivity threshold
|
1151
|
+
:inactive_threshold,
|
1152
|
+
# Generally inherited by parent stream and other markers,
|
1153
|
+
# now can be configured directly.
|
1154
|
+
:num_replicas,
|
1155
|
+
# Force memory storage
|
1156
|
+
:memory_storage,
|
1101
1157
|
keyword_init: true) do
|
1102
1158
|
def initialize(opts={})
|
1103
1159
|
# Filter unrecognized fields just in case.
|
@@ -1151,10 +1207,11 @@ module NATS
|
|
1151
1207
|
# @return [Integer]
|
1152
1208
|
# @!attribute duplicate_window
|
1153
1209
|
# @return [Integer]
|
1154
|
-
StreamConfig = Struct.new(:name, :subjects, :retention, :max_consumers,
|
1155
|
-
:max_msgs, :max_bytes, :max_age,
|
1210
|
+
StreamConfig = Struct.new(:name, :description, :subjects, :retention, :max_consumers,
|
1211
|
+
:max_msgs, :max_bytes, :discard, :max_age,
|
1156
1212
|
:max_msgs_per_subject, :max_msg_size,
|
1157
|
-
:
|
1213
|
+
:storage, :num_replicas, :no_ack, :duplicate_window,
|
1214
|
+
:placement, :allow_direct,
|
1158
1215
|
keyword_init: true) do
|
1159
1216
|
def initialize(opts={})
|
1160
1217
|
# Filter unrecognized fields just in case.
|
data/lib/nats/io/version.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2016-
|
1
|
+
# Copyright 2016-2022 The NATS Authors
|
2
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
3
3
|
# you may not use this file except in compliance with the License.
|
4
4
|
# You may obtain a copy of the License at
|
@@ -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.1.2".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
|
data/lib/nats/nuid.rb
CHANGED
@@ -15,7 +15,7 @@ require 'securerandom'
|
|
15
15
|
|
16
16
|
module NATS
|
17
17
|
class NUID
|
18
|
-
DIGITS
|
18
|
+
DIGITS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')
|
19
19
|
BASE = 62
|
20
20
|
PREFIX_LENGTH = 12
|
21
21
|
SEQ_LENGTH = 10
|
@@ -25,6 +25,8 @@ module NATS
|
|
25
25
|
MAX_INC = 333
|
26
26
|
INC = MAX_INC - MIN_INC
|
27
27
|
|
28
|
+
Ractor.make_shareable(DIGITS) if defined?(Ractor)
|
29
|
+
|
28
30
|
def initialize
|
29
31
|
@prand = Random.new
|
30
32
|
@seq = @prand.rand(MAX_SEQ)
|
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.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Waldemar Quevedo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-07-29 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: NATS is an open-source, high-performance, lightweight cloud messaging
|
14
14
|
system.
|
@@ -44,11 +44,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
44
44
|
version: '0'
|
45
45
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
|
-
- - "
|
47
|
+
- - ">="
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version:
|
49
|
+
version: '0'
|
50
50
|
requirements: []
|
51
|
-
rubygems_version: 3.
|
51
|
+
rubygems_version: 3.3.3
|
52
52
|
signing_key:
|
53
53
|
specification_version: 4
|
54
54
|
summary: NATS is an open-source, high-performance, lightweight cloud messaging system.
|