anycable-core 1.2.3 → 1.2.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: 3ae8ddced1365e350a744545ed12da6e42fffbaa3f58d40b0f9d83598077a88a
4
- data.tar.gz: 6637778d168c99c19a760a635455496ee121dfbbe0fd2472a3a29c4311ce3f7d
3
+ metadata.gz: 5e9ba8037b7cbd766d021b4e88d49101b6dc3e9a5a6b355929bf9aaa8494f33a
4
+ data.tar.gz: 71cd40b2380601f322a335d774cfb41e39f8de6ac29f4b5201a825119bff1031
5
5
  SHA512:
6
- metadata.gz: 3446218216fc8c7b76a0ddd249a8976afe8f9ddf83cdd4714bc29a94a2037caa066c5cae02bcb4a8109fd64555f80b871a4c718d059ec6382e814e9b7cc11ff0
7
- data.tar.gz: 3711df758ce8d1963f158371f5c80a06757ffd3b392acf28cbec79652abe6d61e821800ddd6f2054310d2082a651263bcbe56bfb56a5af11dfc1bbdbe40044e8
6
+ metadata.gz: f1a372e6d70eb1db64054aeafcc3baccd674d679652309526fbcfe9329799383b671d532cd16a52dd53b00b4a1658100d000f4564f2cbaac00502e02da00b668
7
+ data.tar.gz: 5d9434268c8d7b3903544ab357caadcb69150be82d921c2de2916f4191b1280c0c3b981de285425d969bd1693b02974be4a844447576e3975ed0280c877be3c0
data/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 1.2.5 (2022-12-01)
6
+
7
+ - Add `ANYCABLE_REDIS_TLS_VERIFY` setting to disable validation of Redis server TLS certificate. ([@Envek][])
8
+
9
+ ## 1.2.4 (2022-08-10)
10
+
11
+ - Add NATS pub/sub adapter. ([@palkan][])
12
+
13
+ - Setting the redis adapter to use the ruby driver. ([@smasry][])
14
+
5
15
  ## 1.2.3 (2022-04-20)
6
16
 
7
17
  - Pass unique connection id (_session id_) in the `anycable.sid` Rack env field. ([@palkan][])
@@ -124,3 +134,5 @@ See [Changelog](https://github.com/anycable/anycable/blob/0-6-stable/CHANGELOG.m
124
134
  [@palkan]: https://github.com/palkan
125
135
  [@sponomarev]: https://github.com/sponomarev
126
136
  [@bibendi]: https://github.com/bibendi
137
+ [@smasry]: https://github.com/smasry
138
+ [@Envek]: https://github.com/Envek
@@ -10,7 +10,7 @@ module AnyCable
10
10
  #
11
11
  # Example:
12
12
  #
13
- # AnyCable.broadast_adapter = :http
13
+ # AnyCable.broadcast_adapter = :http
14
14
  #
15
15
  # It uses configuration from global AnyCable config
16
16
  # by default.
@@ -118,7 +118,10 @@ module AnyCable
118
118
  yield http
119
119
  rescue Timeout::Error, *RECOVERABLE_EXCEPTIONS => e
120
120
  retry_count += 1
121
- return logger.error("Broadcast request failed: #{e.message}") if MAX_ATTEMPTS < retry_count
121
+ if MAX_ATTEMPTS < retry_count
122
+ logger.error("Broadcast request failed: #{e.message}")
123
+ return
124
+ end
122
125
 
123
126
  sleep((DELAY**retry_count).to_int * retry_count)
124
127
  retry
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ begin
4
+ require "nats/client"
5
+ rescue LoadError
6
+ raise "Please, install the nats-pure gem to use NATS broadcast adapter"
7
+ end
8
+
9
+ require "json"
10
+
11
+ module AnyCable
12
+ module BroadcastAdapters
13
+ # NATS adapter for broadcasting.
14
+ #
15
+ # Example:
16
+ #
17
+ # AnyCable.broadcast_adapter = :nats
18
+ #
19
+ # It uses NATS configuration from global AnyCable config
20
+ # by default.
21
+ #
22
+ # You can override these params:
23
+ #
24
+ # AnyCable.broadcast_adapter = :nats, servers: "nats://my_nats:4242", channel: "_any_cable_"
25
+ class Nats < Base
26
+ attr_reader :nats_conn, :channel
27
+
28
+ def initialize(
29
+ channel: AnyCable.config.nats_channel,
30
+ **options
31
+ )
32
+ options = AnyCable.config.to_nats_params.merge(options)
33
+ @nats_conn = ::NATS.connect(nil, options)
34
+ @channel = channel
35
+ end
36
+
37
+ def raw_broadcast(payload)
38
+ nats_conn.publish(channel, payload)
39
+ end
40
+
41
+ def announce!
42
+ logger.info "Broadcasting NATS channel: #{channel}"
43
+ end
44
+ end
45
+ end
46
+ end
@@ -3,7 +3,7 @@
3
3
  begin
4
4
  require "redis"
5
5
  rescue LoadError
6
- raise "Please, install redis gem to use Redis broadcast adapter"
6
+ raise "Please, install the redis gem to use Redis broadcast adapter"
7
7
  end
8
8
 
9
9
  require "json"
@@ -14,7 +14,7 @@ module AnyCable
14
14
  #
15
15
  # Example:
16
16
  #
17
- # AnyCable.broadast_adapter = :redis
17
+ # AnyCable.broadcast_adapter = :redis
18
18
  #
19
19
  # It uses Redis configuration from global AnyCable config
20
20
  # by default.
@@ -30,6 +30,7 @@ module AnyCable
30
30
  **options
31
31
  )
32
32
  options = AnyCable.config.to_redis_params.merge(options)
33
+ options[:driver] = :ruby
33
34
  @redis_conn = ::Redis.new(**options)
34
35
  @channel = channel
35
36
  end
data/lib/anycable/cli.rb CHANGED
@@ -121,7 +121,7 @@ module AnyCable
121
121
  def wait_till_terminated
122
122
  self_read = setup_signals
123
123
 
124
- while readable_io = IO.select([self_read]) # rubocop:disable Lint/AssignmentInCondition,Lint/IncompatibleIoSelectWithFiberScheduler
124
+ while readable_io = IO.select([self_read]) # rubocop:disable Lint/AssignmentInCondition
125
125
  signal = readable_io.first[0].gets.strip
126
126
  raise Interrupt, "SIG#{signal} received"
127
127
  end
@@ -28,6 +28,13 @@ module AnyCable
28
28
  redis_url: ENV.fetch("REDIS_URL", "redis://localhost:6379/5"),
29
29
  redis_sentinels: nil,
30
30
  redis_channel: "__anycable__",
31
+ redis_tls_verify: false,
32
+
33
+ ### NATS options
34
+ nats_servers: "nats://localhost:4222",
35
+ nats_channel: "__anycable__",
36
+ nats_dont_randomize_servers: false,
37
+ nats_options: {},
31
38
 
32
39
  ### HTTP broadcasting options
33
40
  http_broadcast_url: "http://localhost:8090/_broadcast",
@@ -48,10 +55,18 @@ module AnyCable
48
55
  )
49
56
 
50
57
  if respond_to?(:coerce_types)
51
- coerce_types redis_sentinels: {type: nil, array: true}, debug: :boolean, version_check_enabled: :boolean
58
+ coerce_types(
59
+ redis_sentinels: {type: nil, array: true},
60
+ nats_servers: {type: nil, array: true},
61
+ redis_tls_verify: :boolean,
62
+ nats_dont_randomize_servers: :boolean,
63
+ debug: :boolean,
64
+ version_check_enabled: :boolean
65
+ )
52
66
  end
53
67
 
54
- flag_options :debug
68
+ flag_options :debug, :nats_dont_randomize_servers
69
+ ignore_options :nats_options
55
70
 
56
71
  on_load do
57
72
  # @type self : AnyCable::Config
@@ -81,6 +96,12 @@ module AnyCable
81
96
  --redis-url=url Redis URL for pub/sub, default: REDIS_URL or "redis://localhost:6379/5"
82
97
  --redis-channel=name Redis channel for broadcasting, default: "__anycable__"
83
98
  --redis-sentinels=<...hosts> Redis Sentinel followers addresses (as a comma-separated list), default: nil
99
+ --redis-tls-verify=yes|no Whether to perform server certificate check in case of rediss:// protocol. Default: yes
100
+
101
+ NATS PUB/SUB
102
+ --nats-servers=<...addresses> NATS servers for pub/sub, default: "nats://localhost:4222"
103
+ --nats-channel=name NATS channel for broadcasting, default: "__anycable__"
104
+ --nats-dont-randomize-servers Pass this option to disable NATS servers randomization during (re-)connect
84
105
 
85
106
  HTTP PUB/SUB
86
107
  --http-broadcast-url HTTP pub/sub endpoint URL, default: "http://localhost:8090/_broadcast"
@@ -101,12 +122,20 @@ module AnyCable
101
122
 
102
123
  params[:sentinels] = sentinels.map { |sentinel| parse_sentinel(sentinel) }
103
124
  end.tap do |params|
104
- next unless redis_url.match?(/rediss:\/\//)
125
+ next unless redis_url.match?(/rediss:\/\//) && !redis_tls_verify?
105
126
 
106
127
  params[:ssl_params] = {verify_mode: OpenSSL::SSL::VERIFY_NONE}
107
128
  end
108
129
  end
109
130
 
131
+ # Build options for NATS.connect
132
+ def to_nats_params
133
+ {
134
+ servers: Array(nats_servers),
135
+ dont_randomize_servers: nats_dont_randomize_servers
136
+ }.merge(nats_options)
137
+ end
138
+
110
139
  # Build HTTP health server parameters
111
140
  def to_http_health_params
112
141
  {
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AnyCable
4
- VERSION = "1.2.3"
4
+ VERSION = "1.2.5"
5
5
  end
@@ -0,0 +1,10 @@
1
+ module AnyCable
2
+ module BroadcastAdapters
3
+ class Nats < Base
4
+ attr_reader nats_conn: untyped
5
+ attr_reader channel: String
6
+
7
+ def initialize: (?channel: String channel, **untyped options) -> void
8
+ end
9
+ end
10
+ end
@@ -8,6 +8,17 @@ module AnyCable
8
8
  def redis_sentinels=: (Array[String]) -> void
9
9
  def redis_channel: () -> String
10
10
  def redis_channel=: (String) -> void
11
+ def redis_tls_verify: () -> bool
12
+ def redis_tls_verify?: () -> bool
13
+ def redis_tls_verify=: (bool) -> void
14
+ def nats_servers: () -> Array[String]
15
+ def nats_servers=: (Array[String]) -> void
16
+ def nats_channel: () -> String
17
+ def nats_channel=: (String) -> void
18
+ def nats_dont_randomize_servers: () -> bool
19
+ def nats_dont_randomize_servers=: (bool) -> void
20
+ def nats_options: () -> Hash[untyped, untyped]
21
+ def nats_options=: (Hash[untyped, untyped]) -> void
11
22
  def http_broadcast_url: () -> String
12
23
  def http_broadcast_url=: (String) -> void
13
24
  def http_broadcast_secret: () -> String?
@@ -38,6 +49,7 @@ module AnyCable
38
49
  def http_health_port_provided?: () -> bool
39
50
  def to_redis_params: () -> { url: String, sentinels: Array[untyped]?, ssl_params: Hash[Symbol, untyped]? }
40
51
  def to_http_health_params: () -> { port: Integer?, path: String }
52
+ def to_nats_params: () -> Hash[Symbol, untyped]
41
53
 
42
54
  private
43
55
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: anycable-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.3
4
+ version: 1.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - palkan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-20 00:00:00.000000000 Z
11
+ date: 2022-12-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: anyway_config
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '4.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: nats-pure
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: bundler
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -157,6 +171,7 @@ files:
157
171
  - lib/anycable/broadcast_adapters.rb
158
172
  - lib/anycable/broadcast_adapters/base.rb
159
173
  - lib/anycable/broadcast_adapters/http.rb
174
+ - lib/anycable/broadcast_adapters/nats.rb
160
175
  - lib/anycable/broadcast_adapters/redis.rb
161
176
  - lib/anycable/cli.rb
162
177
  - lib/anycable/config.rb
@@ -186,6 +201,7 @@ files:
186
201
  - sig/anycable/broadcast_adapters.rbs
187
202
  - sig/anycable/broadcast_adapters/base.rbs
188
203
  - sig/anycable/broadcast_adapters/http.rbs
204
+ - sig/anycable/broadcast_adapters/nats.rbs
189
205
  - sig/anycable/broadcast_adapters/redis.rbs
190
206
  - sig/anycable/cli.rbs
191
207
  - sig/anycable/config.rbs
@@ -232,7 +248,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
232
248
  - !ruby/object:Gem::Version
233
249
  version: '0'
234
250
  requirements: []
235
- rubygems_version: 3.3.7
251
+ rubygems_version: 3.3.11
236
252
  signing_key:
237
253
  specification_version: 4
238
254
  summary: AnyCable core RPC implementation