anycable-core 1.1.0.pre1 → 1.1.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +2 -2
- data/lib/anycable.rb +1 -0
- data/lib/anycable/cli.rb +18 -0
- data/lib/anycable/grpc.rb +0 -8
- data/lib/anycable/grpc/handler.rb +6 -6
- data/lib/anycable/middleware.rb +1 -1
- data/lib/anycable/middleware_chain.rb +7 -7
- data/lib/anycable/middlewares/check_version.rb +31 -0
- data/lib/anycable/middlewares/exceptions.rb +3 -3
- data/lib/anycable/rpc/handler.rb +2 -2
- data/lib/anycable/version.rb +1 -1
- data/sig/anycable/cli.rbs +1 -0
- data/sig/anycable/middleware.rbs +1 -1
- data/sig/anycable/middleware_chain.rbs +3 -3
- data/sig/anycable/rpc.rbs +10 -0
- metadata +4 -3
- data/lib/anycable/grpc/check_version.rb +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c11526237ea5ddebe636470d76c0bc736b4033bfa82eb11213768d7907cd9e29
|
4
|
+
data.tar.gz: c9c14c21b7e05ae5e48683270139a219e65879dc96424886ff4f38d0c5e4e4d6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 35ddc978f4af9c962dfd08ce3c91d7baaa9396aaaf6305bf0b53c09b9bdebe66d3ee6c574d4c634b76100b853aa1e69256abadd1eb00e15bc28c113a02c02cd4
|
7
|
+
data.tar.gz: 3e44584b899e7a4041caf345a4a96b6791a52aad83af18f6c59ae11b450446d5bb40d816d917d6791d110c045c894302db9e9668c6f25252269eaf258e5d5231
|
data/CHANGELOG.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
## master
|
4
4
|
|
5
|
-
## 1.1.0
|
5
|
+
## 1.1.0.rc1
|
6
6
|
|
7
7
|
- **BREAKING** Move middlewares from gRPC interceptors to custom implementation. ([@palkan][])
|
8
8
|
|
@@ -12,7 +12,7 @@ The API changed a bit:
|
|
12
12
|
```diff
|
13
13
|
class SomeMiddleware < AnyCable::Middleware
|
14
14
|
- def call(request, rpc_call, rpc_handler)
|
15
|
-
+ def call(rpc_method_name, request)
|
15
|
+
+ def call(rpc_method_name, request, metadata)
|
16
16
|
yield
|
17
17
|
end
|
18
18
|
end
|
data/lib/anycable.rb
CHANGED
data/lib/anycable/cli.rb
CHANGED
@@ -19,6 +19,14 @@ module AnyCable
|
|
19
19
|
# Wait for external process termination (s)
|
20
20
|
WAIT_PROCESS = 2
|
21
21
|
|
22
|
+
# Run CLI inside the current process and shutdown at exit
|
23
|
+
def self.embed!(args = [])
|
24
|
+
new(embedded: true).tap do |cli|
|
25
|
+
cli.run(args)
|
26
|
+
at_exit { cli.shutdown }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
22
30
|
attr_reader :server, :health_server, :embedded
|
23
31
|
alias_method :embedded?, :embedded
|
24
32
|
|
@@ -55,6 +63,8 @@ module AnyCable
|
|
55
63
|
|
56
64
|
verify_server_builder!
|
57
65
|
|
66
|
+
check_version!
|
67
|
+
|
58
68
|
@server = AnyCable.server_builder.call(config)
|
59
69
|
|
60
70
|
# Make sure middlewares are not adding after server has started
|
@@ -247,6 +257,14 @@ module AnyCable
|
|
247
257
|
exit(1)
|
248
258
|
end
|
249
259
|
|
260
|
+
def check_version!
|
261
|
+
return unless config.version_check_enabled?
|
262
|
+
|
263
|
+
AnyCable.middleware.use(
|
264
|
+
AnyCable::Middlewares::CheckVersion.new(AnyCable::PROTO_VERSION)
|
265
|
+
)
|
266
|
+
end
|
267
|
+
|
250
268
|
def parse_gem_options!(args)
|
251
269
|
config.parse_options!(args)
|
252
270
|
rescue OptionParser::InvalidOption => e
|
data/lib/anycable/grpc.rb
CHANGED
@@ -9,22 +9,14 @@ end
|
|
9
9
|
|
10
10
|
require "anycable/grpc/config"
|
11
11
|
require "anycable/grpc/server"
|
12
|
-
require "anycable/grpc/check_version"
|
13
12
|
|
14
13
|
AnyCable.server_builder = ->(config) {
|
15
14
|
AnyCable.logger.info "gRPC version: #{::GRPC::VERSION}"
|
16
15
|
|
17
16
|
::GRPC.define_singleton_method(:logger) { AnyCable.logger } if config.log_grpc?
|
18
17
|
|
19
|
-
interceptors = []
|
20
|
-
|
21
|
-
if config.version_check_enabled?
|
22
|
-
interceptors << AnyCable::GRPC::CheckVersion.new(AnyCable::PROTO_VERSION)
|
23
|
-
end
|
24
|
-
|
25
18
|
params = config.to_grpc_params
|
26
19
|
params[:host] = config.rpc_host
|
27
|
-
params[:interceptors] = interceptors
|
28
20
|
|
29
21
|
AnyCable::GRPC::Server.new(**params)
|
30
22
|
}
|
@@ -9,16 +9,16 @@ module AnyCable
|
|
9
9
|
# RPC service handler
|
10
10
|
class Handler < AnyCable::GRPC::Service
|
11
11
|
# Handle connection request from WebSocket server
|
12
|
-
def connect(request,
|
13
|
-
AnyCable.rpc_handler.handle(:connect, request)
|
12
|
+
def connect(request, call)
|
13
|
+
AnyCable.rpc_handler.handle(:connect, request, call.metadata)
|
14
14
|
end
|
15
15
|
|
16
|
-
def disconnect(request,
|
17
|
-
AnyCable.rpc_handler.handle(:disconnect, request)
|
16
|
+
def disconnect(request, call)
|
17
|
+
AnyCable.rpc_handler.handle(:disconnect, request, call.metadata)
|
18
18
|
end
|
19
19
|
|
20
|
-
def command(request,
|
21
|
-
AnyCable.rpc_handler.handle(:command, request)
|
20
|
+
def command(request, call)
|
21
|
+
AnyCable.rpc_handler.handle(:command, request, call.metadata)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
data/lib/anycable/middleware.rb
CHANGED
@@ -30,19 +30,19 @@ module AnyCable
|
|
30
30
|
registry
|
31
31
|
end
|
32
32
|
|
33
|
-
def call(method_name, request, &block)
|
34
|
-
return yield(method_name, request) if registry.none?
|
33
|
+
def call(method_name, request, meta = {}, &block)
|
34
|
+
return yield(method_name, request, meta) if registry.none?
|
35
35
|
|
36
|
-
execute_next_middleware(0, method_name, request, block)
|
36
|
+
execute_next_middleware(0, method_name, request, meta, block)
|
37
37
|
end
|
38
38
|
|
39
39
|
private
|
40
40
|
|
41
|
-
def execute_next_middleware(ind, method_name, request, block)
|
42
|
-
return block.call(method_name, request) if ind >= registry.size
|
41
|
+
def execute_next_middleware(ind, method_name, request, meta, block)
|
42
|
+
return block.call(method_name, request, meta) if ind >= registry.size
|
43
43
|
|
44
|
-
registry[ind].call(method_name, request) do
|
45
|
-
execute_next_middleware(ind + 1, method_name, request, block)
|
44
|
+
registry[ind].call(method_name, request, meta) do
|
45
|
+
execute_next_middleware(ind + 1, method_name, request, meta, block)
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AnyCable
|
4
|
+
module Middlewares
|
5
|
+
# Checks that RPC client version is compatible with
|
6
|
+
# the current RPC proto version
|
7
|
+
class CheckVersion < AnyCable::Middleware
|
8
|
+
attr_reader :version
|
9
|
+
|
10
|
+
def initialize(version)
|
11
|
+
@version = version
|
12
|
+
end
|
13
|
+
|
14
|
+
def call(_method, _request, meta)
|
15
|
+
check_version(meta) do
|
16
|
+
yield
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def check_version(metadata)
|
23
|
+
supported_versions = metadata["protov"]&.split(",")
|
24
|
+
return yield if supported_versions&.include?(version)
|
25
|
+
|
26
|
+
raise "Incompatible AnyCable RPC client.\nCurrent server version: #{version}.\n" \
|
27
|
+
"Client supported versions: #{metadata["protov"] || "unknown"}."
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module AnyCable
|
4
4
|
module Middlewares
|
5
5
|
class Exceptions < AnyCable::Middleware
|
6
|
-
def call(method_name, request)
|
6
|
+
def call(method_name, request, _meta)
|
7
7
|
yield
|
8
8
|
rescue => exp
|
9
9
|
notify_exception(exp, method_name, request)
|
@@ -16,8 +16,8 @@ module AnyCable
|
|
16
16
|
|
17
17
|
private
|
18
18
|
|
19
|
-
def notify_exception(exp, method_name,
|
20
|
-
AnyCable::ExceptionsHandling.notify(exp, method_name.to_s,
|
19
|
+
def notify_exception(exp, method_name, request)
|
20
|
+
AnyCable::ExceptionsHandling.notify(exp, method_name.to_s, request.to_h)
|
21
21
|
end
|
22
22
|
|
23
23
|
def response_class(method_name)
|
data/lib/anycable/rpc/handler.rb
CHANGED
data/lib/anycable/version.rb
CHANGED
data/sig/anycable/cli.rbs
CHANGED
data/sig/anycable/middleware.rbs
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
module AnyCable
|
2
2
|
class MiddlewareChain
|
3
|
-
type rpcHandlerBlock = ^(Symbol, rpcRequest) -> rpcResponse
|
3
|
+
type rpcHandlerBlock = ^(Symbol, rpcRequest, rpcMetadata) -> rpcResponse
|
4
4
|
|
5
5
|
def initialize: () -> void
|
6
6
|
def use: (singleton(Middleware) | Middleware middleware) -> void
|
7
7
|
def freeze: () -> void
|
8
8
|
def to_a: () -> Array[Middleware]
|
9
|
-
def call: (Symbol, rpcRequest) { (Symbol, rpcRequest) -> rpcResponse } -> rpcResponse
|
9
|
+
def call: (Symbol, rpcRequest, ?rpcMetadata) { (Symbol, rpcRequest, rpcMetadata) -> rpcResponse } -> rpcResponse
|
10
10
|
|
11
11
|
private
|
12
12
|
|
13
|
-
def execute_next_middleware: (Integer ind, Symbol, rpcRequest, rpcHandlerBlock block) -> rpcResponse
|
13
|
+
def execute_next_middleware: (Integer ind, Symbol, rpcRequest, rpcMetadata, rpcHandlerBlock block) -> rpcResponse
|
14
14
|
|
15
15
|
attr_reader mu: untyped
|
16
16
|
attr_reader registry: Array[Middleware]
|
data/sig/anycable/rpc.rbs
CHANGED
@@ -4,6 +4,7 @@ module AnyCable
|
|
4
4
|
|
5
5
|
type rpcStatus = 0 | 1 | 2
|
6
6
|
type protoMap = Hash[String, String]
|
7
|
+
type rpcMetadata = Hash[String, String]
|
7
8
|
|
8
9
|
interface _WithEnvState
|
9
10
|
def cstate: () -> protoMap?
|
@@ -60,6 +61,7 @@ module AnyCable
|
|
60
61
|
include _WithEnv
|
61
62
|
|
62
63
|
def initialize: (?env: Env) -> void
|
64
|
+
def to_h: () -> Hash[String, untyped]
|
63
65
|
end
|
64
66
|
|
65
67
|
class ConnectionResponse
|
@@ -78,6 +80,8 @@ module AnyCable
|
|
78
80
|
?error_msg: String,
|
79
81
|
?env: EnvResponse
|
80
82
|
) -> void
|
83
|
+
|
84
|
+
def to_h: () -> Hash[String, untyped]
|
81
85
|
end
|
82
86
|
|
83
87
|
class CommandMessage
|
@@ -94,6 +98,8 @@ module AnyCable
|
|
94
98
|
?connection_identifiers: String,
|
95
99
|
?env: Env
|
96
100
|
) -> void
|
101
|
+
|
102
|
+
def to_h: () -> Hash[String, untyped]
|
97
103
|
end
|
98
104
|
|
99
105
|
class CommandResponse
|
@@ -118,6 +124,8 @@ module AnyCable
|
|
118
124
|
?error_msg: String,
|
119
125
|
?env: EnvResponse
|
120
126
|
) -> void
|
127
|
+
|
128
|
+
def to_h: () -> Hash[String, untyped]
|
121
129
|
end
|
122
130
|
|
123
131
|
class DisconnectRequest
|
@@ -127,6 +135,7 @@ module AnyCable
|
|
127
135
|
attr_accessor subscriptions: Array[String]
|
128
136
|
|
129
137
|
def initialize: (identifiers: String, ?subscriptions: Array[String], ?env: Env) -> void
|
138
|
+
def to_h: () -> Hash[String, untyped]
|
130
139
|
end
|
131
140
|
|
132
141
|
class DisconnectResponse
|
@@ -136,6 +145,7 @@ module AnyCable
|
|
136
145
|
attr_accessor error_msg: String?
|
137
146
|
|
138
147
|
def initialize: (status: rpcStatus, ?error_msg: String) -> void
|
148
|
+
def to_h: () -> Hash[String, untyped]
|
139
149
|
end
|
140
150
|
|
141
151
|
type rpcRequest = ConnectionRequest | DisconnectRequest | CommandMessage
|
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.1.0.
|
4
|
+
version: 1.1.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- palkan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-05-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: anyway_config
|
@@ -176,7 +176,6 @@ files:
|
|
176
176
|
- lib/anycable/config.rb
|
177
177
|
- lib/anycable/exceptions_handling.rb
|
178
178
|
- lib/anycable/grpc.rb
|
179
|
-
- lib/anycable/grpc/check_version.rb
|
180
179
|
- lib/anycable/grpc/config.rb
|
181
180
|
- lib/anycable/grpc/handler.rb
|
182
181
|
- lib/anycable/grpc/rpc_services_pb.rb
|
@@ -184,6 +183,7 @@ files:
|
|
184
183
|
- lib/anycable/health_server.rb
|
185
184
|
- lib/anycable/middleware.rb
|
186
185
|
- lib/anycable/middleware_chain.rb
|
186
|
+
- lib/anycable/middlewares/check_version.rb
|
187
187
|
- lib/anycable/middlewares/exceptions.rb
|
188
188
|
- lib/anycable/protos/rpc_pb.rb
|
189
189
|
- lib/anycable/rpc.rb
|
@@ -215,6 +215,7 @@ metadata:
|
|
215
215
|
documentation_uri: https://docs.anycable.io/
|
216
216
|
homepage_uri: https://anycable.io/
|
217
217
|
source_code_uri: http://github.com/anycable/anycable
|
218
|
+
funding_uri: https://github.com/sponsors/anycable
|
218
219
|
post_install_message:
|
219
220
|
rdoc_options: []
|
220
221
|
require_paths:
|
@@ -1,33 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module AnyCable
|
4
|
-
module GRPC
|
5
|
-
# Checks that gRPC client version is compatible with
|
6
|
-
# the current RPC proto version
|
7
|
-
class CheckVersion < ::GRPC::ServerInterceptor
|
8
|
-
attr_reader :version
|
9
|
-
|
10
|
-
def initialize(version)
|
11
|
-
@version = version
|
12
|
-
end
|
13
|
-
|
14
|
-
def request_response(request: nil, call: nil, method: nil)
|
15
|
-
# Call only for AnyCable service
|
16
|
-
return yield unless method.receiver.is_a?(AnyCable::GRPC::Handler)
|
17
|
-
|
18
|
-
check_version(call) do
|
19
|
-
yield
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def check_version(call)
|
24
|
-
supported_versions = call.metadata["protov"]&.split(",")
|
25
|
-
return yield if supported_versions&.include?(version)
|
26
|
-
|
27
|
-
raise ::GRPC::Internal,
|
28
|
-
"Incompatible AnyCable RPC client.\nCurrent server version: #{version}.\n" \
|
29
|
-
"Client supported versions: #{call.metadata["protov"] || "unknown"}."
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|