anycable-core 1.5.0.rc.1 → 1.5.1

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: b3469966952c29b422b3177acbb3402fc9bf500786d55774f9b3311b904548bb
4
- data.tar.gz: 7e5a7302b61c07af90f61b11878212a464ba1eac0f7d6b664f91b8dcbd3fe9e6
3
+ metadata.gz: e580fb7244e7eb0d8ad4d749ec3eaec19e5490152c39c1f30f42b53249185536
4
+ data.tar.gz: 7da10692cea6e5d1d9ced38075c649077eed8ed5a5c49cdaac446cb7dbe686ff
5
5
  SHA512:
6
- metadata.gz: 57e7aafe42eeddf359db963a688cf89acf9b109935f4561ba2eb4cb9c994e3a47d44b721b24f717be41630d4b8234d5f77a12d91246b0033e2385772287c43af
7
- data.tar.gz: 53785ae7eaf8c86d1f164a89dbfeaee2063be1c4180f2a263cb2f47ca3ca41bc528f545ba65c1232c691fa6515bd4be39e9f6200b903b9b2bb8af02f09f37ccc
6
+ metadata.gz: 196239a321ae0f634b2cbe61b81d83e454b3be116b0748ca80b07405ecc1e333258735b9195f7e6b927c30dc0677101805f0dbad267b15beb96b17ca20823b7a
7
+ data.tar.gz: 6430837a566150c68611488d82ccf1e0955953f1ef4ecf32df3b00ace5c255dc5755f051e4ee3fb3ab18d0c286e1e214ec759b6fc4fea6a698e34a51e80ad03c
data/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 1.5.1 (2024-06-14) 🇪🇺 ⚽️
6
+
7
+ - Fixed compatibility with Rack 3.1 ([@earlopain][])
8
+
9
+ ## 1.5.0 (2024-04-01)
10
+
11
+ - Fixed gRPC keepalive settings to align with the Go server client. ([@palkan][])
12
+
5
13
  - Added JWT utils. ([@palkan][])
6
14
 
7
15
  You can now generate and verify AnyCable JWT tokens without using additional dependencies:
@@ -207,3 +215,4 @@ See [Changelog](https://github.com/anycable/anycable/blob/0-6-stable/CHANGELOG.m
207
215
  [@smasry]: https://github.com/smasry
208
216
  [@Envek]: https://github.com/Envek
209
217
  [@cylon-v]: https://github.com/cylon-v
218
+ [@earlopain]: https://github.com/earlopain
@@ -35,7 +35,15 @@ module AnyCable
35
35
  poll_period: rpc_poll_period,
36
36
  pool_keep_alive: rpc_pool_keep_alive,
37
37
  tls_credentials: tls_credentials,
38
- server_args: enhance_grpc_server_args(normalized_grpc_server_args)
38
+ server_args: enhance_grpc_server_args(normalized_grpc_server_args).tap do |sargs|
39
+ # Provide keepalive defaults unless explicitly set.
40
+ # They must MATCH the corresponding Go client defaults:
41
+ # https://github.com/anycable/anycable-go/blob/62e77e7f759aa9253c2bd23812dd59ec8471db86/rpc/rpc.go#L512-L515
42
+ #
43
+ # See also https://github.com/grpc/grpc/blob/master/doc/keepalive.md and https://grpc.github.io/grpc/core/group__grpc__arg__keys.html
44
+ sargs["grpc.keepalive_permit_without_calls"] ||= 1
45
+ sargs["grpc.http2.min_recv_ping_interval_without_data_ms"] ||= 10_000
46
+ end
39
47
  }
40
48
  end
41
49
 
@@ -27,8 +27,9 @@ module AnyCable
27
27
  return [404, {}, ["Not found"]] unless AnyCable.rpc_handler.supported?(rpc_command)
28
28
 
29
29
  # read request body and it's empty, return 422
30
- request_body = env["rack.input"].read
31
- return [422, {}, ["Empty request body"]] if request_body.empty?
30
+ # rack.input is optional starting in Rack 3.1
31
+ request_body = env["rack.input"]&.read
32
+ return [422, {}, ["Empty request body"]] if request_body.nil? || request_body.empty?
32
33
 
33
34
  payload =
34
35
  case rpc_command
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AnyCable
4
+ WHISPER_KEY = "$w"
5
+
4
6
  # Socket mock to be used with application connection
5
7
  class Socket
6
8
  # Represents the per-connection store
@@ -59,10 +61,21 @@ module AnyCable
59
61
 
60
62
  def unsubscribe(_channel, broadcasting)
61
63
  streams[:stop] << broadcasting
64
+
65
+ if istate.read(WHISPER_KEY) == broadcasting
66
+ istate.write(WHISPER_KEY, "")
67
+ end
68
+ end
69
+
70
+ def whisper(_channel, broadcasting)
71
+ istate.write(WHISPER_KEY, broadcasting)
62
72
  end
63
73
 
64
74
  def unsubscribe_from_all(_channel)
65
75
  @stop_all_streams = true
76
+ if istate.read(WHISPER_KEY)
77
+ istate.write(WHISPER_KEY, "")
78
+ end
66
79
  end
67
80
 
68
81
  def streams
@@ -141,22 +154,30 @@ module AnyCable
141
154
  # (not all of them though, just those enough for Action Cable to work)
142
155
  # See https://rubydoc.info/github/rack/rack/master/file/SPEC
143
156
  # and https://github.com/rack/rack/blob/master/lib/rack/lint.rb
144
- {
157
+ env = {
145
158
  "REQUEST_METHOD" => "GET",
146
159
  "SCRIPT_NAME" => "",
147
160
  "PATH_INFO" => "/",
148
161
  "QUERY_STRING" => "",
149
162
  "SERVER_NAME" => "",
150
163
  "SERVER_PORT" => "80",
164
+ "SERVER_PROTOCOL" => "HTTP/1.1",
151
165
  "rack.url_scheme" => "http",
152
166
  "rack.input" => StringIO.new("", "r").tap { |io| io.set_encoding(Encoding::ASCII_8BIT) },
153
- "rack.version" => ::Rack::VERSION,
154
167
  "rack.errors" => StringIO.new("").tap { |io| io.set_encoding(Encoding::ASCII_8BIT) },
155
168
  "rack.multithread" => true,
156
169
  "rack.multiprocess" => false,
157
170
  "rack.run_once" => false,
158
171
  "rack.hijack?" => false
159
172
  }
173
+
174
+ # Rack 3.1 removes `Rack::VERSION`. rack.version is optional (deprecated) since Rack 3.0
175
+ if ::Rack::RELEASE < "3.0"
176
+ rversion = ::Rack::VERSION
177
+ # @type var rversion : String
178
+ env["rack.version"] = rversion
179
+ end
180
+ env
160
181
  end
161
182
 
162
183
  def build_headers(headers)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AnyCable
4
- VERSION = "1.5.0.rc.1"
4
+ VERSION = "1.5.1"
5
5
  end
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.5.0.rc.1
4
+ version: 1.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - palkan
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-03-13 00:00:00.000000000 Z
11
+ date: 2024-06-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: anyway_config
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: google-protobuf
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '3.13'
33
+ version: '3.25'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '3.13'
40
+ version: '3.25'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: redis
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -100,14 +100,14 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '2.0'
103
+ version: '3.0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '2.0'
110
+ version: '3.0'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: rspec
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -277,7 +277,7 @@ metadata:
277
277
  homepage_uri: https://anycable.io/
278
278
  source_code_uri: http://github.com/anycable/anycable
279
279
  funding_uri: https://github.com/sponsors/anycable
280
- post_install_message:
280
+ post_install_message:
281
281
  rdoc_options: []
282
282
  require_paths:
283
283
  - lib
@@ -288,12 +288,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
288
288
  version: 2.7.0
289
289
  required_rubygems_version: !ruby/object:Gem::Requirement
290
290
  requirements:
291
- - - ">"
291
+ - - ">="
292
292
  - !ruby/object:Gem::Version
293
- version: 1.3.1
293
+ version: '0'
294
294
  requirements: []
295
- rubygems_version: 3.4.20
296
- signing_key:
295
+ rubygems_version: 3.4.19
296
+ signing_key:
297
297
  specification_version: 4
298
298
  summary: AnyCable core RPC implementation
299
299
  test_files: []