gruf 2.0.3 → 2.1.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/CHANGELOG.md +8 -0
- data/README.md +6 -1
- data/lib/gruf/controllers/request.rb +17 -0
- data/lib/gruf/interceptors/registry.rb +30 -5
- data/lib/gruf/server.rb +56 -2
- data/lib/gruf/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0c2a05e3aed4e246d1e0de691d1b9ee25fe33efd
|
4
|
+
data.tar.gz: a829923c5dd79579525e2034e6b3dabc995f1b20
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ada2953033d6ca5850c35f5f63a59e86489d1c55bd909e72c73d155c7348f32bffc3168531bcc00f548c06f3f75ea480616b5a20370fb3f3708c12d3f5cb5b9e
|
7
|
+
data.tar.gz: 317a912622dc017fc6568bb66aeace92a620175f2cb6e99047f320777b4b9b7f805ef1ce39039650d6b0074a105b0da460c354b5a22f33a6c9eb2cf97bb13e02
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,14 @@ Changelog for the gruf gem. This includes internal history before the gem was ma
|
|
2
2
|
|
3
3
|
### Pending release
|
4
4
|
|
5
|
+
### 2.1.0
|
6
|
+
|
7
|
+
- Add ability to list, clear, insert before, insert after, and remove to a server's interceptor
|
8
|
+
registry
|
9
|
+
- Ensure interceptors and services cannot be adjusted on the server after it starts to
|
10
|
+
prevent threading issues
|
11
|
+
- [#36], [#37] Adds `response_class`, `request_class`, and `service` accessors to controller request
|
12
|
+
|
5
13
|
### 2.0.3
|
6
14
|
|
7
15
|
- Fix regression [#35] where gruf was not able to be loaded outside of a Rails application
|
data/README.md
CHANGED
@@ -17,7 +17,7 @@ up fast and efficiently at scale. Some of its features include:
|
|
17
17
|
still preserving gRPC BadStatus codes
|
18
18
|
* Server and client execution timings in responses
|
19
19
|
|
20
|
-
gruf currently has active support for gRPC 1.4.x-1.
|
20
|
+
gruf currently has active support for gRPC 1.4.x-1.8.x. gruf is compatible and tested with Ruby 2.2,
|
21
21
|
2.3, and 2.4. gruf is also not [Rails](https://github.com/rails/rails)-specific, and can be used in any
|
22
22
|
Ruby framework (such as [Grape](https://github.com/ruby-grape/grape), for instance).
|
23
23
|
|
@@ -239,6 +239,10 @@ Gruf.configure do |c|
|
|
239
239
|
end
|
240
240
|
```
|
241
241
|
|
242
|
+
By default, the ActiveRecord Connection Reset interceptor and Output Metadata Timing interceptor
|
243
|
+
are loaded into gruf unless explicitly told not to via the `use_default_interceptors` configuration
|
244
|
+
parameter.
|
245
|
+
|
242
246
|
## Instrumentation
|
243
247
|
|
244
248
|
gruf comes out of the box with a couple of instrumentation interceptors packed in:
|
@@ -323,6 +327,7 @@ view and clone that shows how to integrate Gruf into an existing Rails applicati
|
|
323
327
|
### Gruf 3.0
|
324
328
|
|
325
329
|
* Utilize the new core Ruby interceptors in gRPC 1.7
|
330
|
+
* Support client interceptors
|
326
331
|
* Change configuration to an injectable object to ensure thread safety on chained server/client interactions
|
327
332
|
* Move all references to `Gruf.` configuration into injectable parameters
|
328
333
|
* Redo server configuration to be fully injectable
|
@@ -27,6 +27,8 @@ module Gruf
|
|
27
27
|
attr_reader :method_key
|
28
28
|
# @var [Gruf::Controllers::Request::Type] type
|
29
29
|
attr_reader :type
|
30
|
+
# @var [Class] service
|
31
|
+
attr_reader :service
|
30
32
|
|
31
33
|
delegate :metadata, to: :active_call
|
32
34
|
delegate :messages, :client_streamer?, :server_streamer?, :bidi_streamer?, :request_response?, to: :type
|
@@ -54,6 +56,7 @@ module Gruf
|
|
54
56
|
@service = service
|
55
57
|
@active_call = active_call
|
56
58
|
@message = message
|
59
|
+
@rpc_desc = rpc_desc
|
57
60
|
@type = Type.new(rpc_desc)
|
58
61
|
end
|
59
62
|
|
@@ -67,6 +70,20 @@ module Gruf
|
|
67
70
|
@service.name.underscore.tr('/', '.').gsub('.service', '')
|
68
71
|
end
|
69
72
|
|
73
|
+
##
|
74
|
+
# @return [Class]
|
75
|
+
#
|
76
|
+
def response_class
|
77
|
+
@rpc_desc.output
|
78
|
+
end
|
79
|
+
|
80
|
+
##
|
81
|
+
# @return [Class]
|
82
|
+
#
|
83
|
+
def request_class
|
84
|
+
@rpc_desc.input
|
85
|
+
end
|
86
|
+
|
70
87
|
##
|
71
88
|
# Parse the method signature into a service.method name format
|
72
89
|
#
|
@@ -28,7 +28,7 @@ module Gruf
|
|
28
28
|
##
|
29
29
|
# Add an interceptor to the registry
|
30
30
|
#
|
31
|
-
# @param [
|
31
|
+
# @param [Class] interceptor_class The class of the interceptor to add
|
32
32
|
# @param [Hash] options A hash of options to pass into the interceptor during initialization
|
33
33
|
#
|
34
34
|
def use(interceptor_class, options = {})
|
@@ -40,12 +40,25 @@ module Gruf
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
+
##
|
44
|
+
# Remove an interceptor from the registry
|
45
|
+
#
|
46
|
+
# @param [Class] interceptor_class The interceptor class to remove
|
47
|
+
# @raise [InterceptorNotFoundError] if the interceptor is not found
|
48
|
+
#
|
49
|
+
def remove(interceptor_class)
|
50
|
+
pos = @registry.find_index { |opts| opts.fetch(:klass, '') == interceptor_class }
|
51
|
+
raise InterceptorNotFoundError if pos.nil?
|
52
|
+
@registry.delete_at(pos)
|
53
|
+
end
|
54
|
+
|
43
55
|
##
|
44
56
|
# Insert an interceptor before another specified interceptor
|
45
57
|
#
|
46
|
-
# @param [
|
47
|
-
# @param [
|
58
|
+
# @param [Class] before_class The interceptor to insert before
|
59
|
+
# @param [Class] interceptor_class The class of the interceptor to add
|
48
60
|
# @param [Hash] options A hash of options to pass into the interceptor during initialization
|
61
|
+
# @raise [InterceptorNotFoundError] if the before interceptor is not found
|
49
62
|
#
|
50
63
|
def insert_before(before_class, interceptor_class, options = {})
|
51
64
|
interceptors_mutex do
|
@@ -62,9 +75,10 @@ module Gruf
|
|
62
75
|
##
|
63
76
|
# Insert an interceptor after another specified interceptor
|
64
77
|
#
|
65
|
-
# @param [
|
66
|
-
# @param [
|
78
|
+
# @param [Class] after_class The interceptor to insert after
|
79
|
+
# @param [Class] interceptor_class The class of the interceptor to add
|
67
80
|
# @param [Hash] options A hash of options to pass into the interceptor during initialization
|
81
|
+
# @raise [InterceptorNotFoundError] if the after interceptor is not found
|
68
82
|
#
|
69
83
|
def insert_after(after_class, interceptor_class, options = {})
|
70
84
|
interceptors_mutex do
|
@@ -78,6 +92,17 @@ module Gruf
|
|
78
92
|
end
|
79
93
|
end
|
80
94
|
|
95
|
+
##
|
96
|
+
# Return a list of the interceptor classes in the registry in their execution order
|
97
|
+
#
|
98
|
+
# @return [Array<Class>]
|
99
|
+
#
|
100
|
+
def list
|
101
|
+
interceptors_mutex do
|
102
|
+
@registry.map { |h| h[:klass] }
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
81
106
|
##
|
82
107
|
# Load and return all interceptors for the given request
|
83
108
|
#
|
data/lib/gruf/server.rb
CHANGED
@@ -19,6 +19,8 @@ module Gruf
|
|
19
19
|
# based on configuration values.
|
20
20
|
#
|
21
21
|
class Server
|
22
|
+
class ServerAlreadyStartedError < StandardError; end
|
23
|
+
|
22
24
|
include Gruf::Loggable
|
23
25
|
|
24
26
|
# @return [Integer] The port the server is bound to
|
@@ -36,6 +38,7 @@ module Gruf
|
|
36
38
|
@interceptors = options.fetch(:interceptor_registry, Gruf.interceptors)
|
37
39
|
@interceptors = Gruf::Interceptors::Registry.new unless @interceptors.is_a?(Gruf::Interceptors::Registry)
|
38
40
|
@services = []
|
41
|
+
@started = false
|
39
42
|
setup!
|
40
43
|
end
|
41
44
|
|
@@ -58,9 +61,11 @@ module Gruf
|
|
58
61
|
# rubocop:disable Lint/ShadowedException
|
59
62
|
def start!
|
60
63
|
logger.info { 'Booting gRPC Server...' }
|
64
|
+
@started = true
|
61
65
|
server.run_till_terminated
|
62
66
|
rescue Interrupt, SignalException, SystemExit
|
63
67
|
logger.info { 'Shutting down gRPC server...' }
|
68
|
+
@started = false
|
64
69
|
server.stop
|
65
70
|
end
|
66
71
|
# :nocov:
|
@@ -68,21 +73,70 @@ module Gruf
|
|
68
73
|
|
69
74
|
##
|
70
75
|
# @param [Class] klass
|
76
|
+
# @raise [ServerAlreadyStartedError] if the server is already started
|
71
77
|
#
|
72
78
|
def add_service(klass)
|
79
|
+
raise ServerAlreadyStartedError if @started
|
73
80
|
@services << klass unless @services.include?(klass)
|
74
81
|
end
|
75
82
|
|
76
83
|
##
|
77
84
|
# Add an interceptor to the server
|
78
85
|
#
|
79
|
-
# @param [
|
80
|
-
# @param [Hash]
|
86
|
+
# @param [Class] klass The Interceptor to add to the registry
|
87
|
+
# @param [Hash] opts A hash of options for the interceptor
|
88
|
+
# @raise [ServerAlreadyStartedError] if the server is already started
|
81
89
|
#
|
82
90
|
def add_interceptor(klass, opts = {})
|
91
|
+
raise ServerAlreadyStartedError if @started
|
83
92
|
@interceptors.use(klass, opts)
|
84
93
|
end
|
85
94
|
|
95
|
+
##
|
96
|
+
# @param [Class] before_class The interceptor that you want to add the new interceptor before
|
97
|
+
# @param [Class] interceptor_class The Interceptor to add to the registry
|
98
|
+
# @param [Hash] options A hash of options for the interceptor
|
99
|
+
#
|
100
|
+
def insert_interceptor_before(before_class, interceptor_class, options = {})
|
101
|
+
raise ServerAlreadyStartedError if @started
|
102
|
+
@interceptors.insert_before(before_class, interceptor_class, options)
|
103
|
+
end
|
104
|
+
|
105
|
+
##
|
106
|
+
# @param [Class] after_class The interceptor that you want to add the new interceptor after
|
107
|
+
# @param [Class] interceptor_class The Interceptor to add to the registry
|
108
|
+
# @param [Hash] options A hash of options for the interceptor
|
109
|
+
#
|
110
|
+
def insert_interceptor_after(after_class, interceptor_class, options = {})
|
111
|
+
raise ServerAlreadyStartedError if @started
|
112
|
+
@interceptors.insert_after(after_class, interceptor_class, options)
|
113
|
+
end
|
114
|
+
|
115
|
+
##
|
116
|
+
# Return the current list of added interceptor classes
|
117
|
+
#
|
118
|
+
# @return [Array<Class>]
|
119
|
+
#
|
120
|
+
def list_interceptors
|
121
|
+
@interceptors.list
|
122
|
+
end
|
123
|
+
|
124
|
+
##
|
125
|
+
# Remove an interceptor from the server
|
126
|
+
#
|
127
|
+
def remove_interceptor(klass)
|
128
|
+
raise ServerAlreadyStartedError if @started
|
129
|
+
@interceptors.remove(klass)
|
130
|
+
end
|
131
|
+
|
132
|
+
##
|
133
|
+
# Clear the interceptor registry of interceptors
|
134
|
+
#
|
135
|
+
def clear_interceptors
|
136
|
+
raise ServerAlreadyStartedError if @started
|
137
|
+
@interceptors.clear
|
138
|
+
end
|
139
|
+
|
86
140
|
private
|
87
141
|
|
88
142
|
##
|
data/lib/gruf/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gruf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shaun McCormick
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-12-
|
11
|
+
date: 2017-12-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -158,7 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
158
158
|
version: '0'
|
159
159
|
requirements: []
|
160
160
|
rubyforge_project:
|
161
|
-
rubygems_version: 2.6.
|
161
|
+
rubygems_version: 2.6.12
|
162
162
|
signing_key:
|
163
163
|
specification_version: 4
|
164
164
|
summary: gRPC Ruby Framework
|