grpc-rest 0.3.0 → 0.4.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 +8 -0
- data/Gemfile.lock +7 -1
- data/lib/generator/controller.rb.erb +1 -1
- data/lib/grpc_rest/version.rb +1 -1
- data/lib/grpc_rest.rb +24 -9
- data/spec/__snapshots__/service.snap +4 -4
- data/spec/testdata/base/app/controllers/my_service_controller.rb +4 -4
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 624b3de8eba78302edff97ecf421a9d660fe781c72452b7f642fa5772e3a6234
|
4
|
+
data.tar.gz: 39143f78f27e6c0905cfb2092b23c4427c70c5810d78243935baf5c38bee9443
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d3897f28befb1aadf27163d67771605116de984a80d86d9ae3b41d131729bfa75c0bd04c84f63ef622cf77637fe1958078d62e59afb1fc8cb95a073137e8733
|
7
|
+
data.tar.gz: 415c00d2059a1cbd9923d5689333f6ae8c07ac9f2c595e0abaed8183106aa6f30e2da751fdeefb5b856969a62fac5f6ae63e0e36cd146c409768f23df7e02a34
|
data/CHANGELOG
CHANGED
@@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
7
7
|
|
8
8
|
## UNRELEASED
|
9
9
|
|
10
|
+
# 0.4.0 - 2025-07-08
|
11
|
+
|
12
|
+
- Feature: Forward request headers to the gRPC call as metadata.
|
13
|
+
- ***BREAKING CHANGE***: Update interceptors to pass a Gruf::Controller::Request instead of the raw gRPC request object. This allows e.g. checking metadata inside the interceptor.
|
14
|
+
|
15
|
+
# 0.3.1 - 2025-07-02
|
16
|
+
- Fix: Include full error backtrace in logs
|
17
|
+
|
10
18
|
# 0.3.0 - 2025-06-11
|
11
19
|
|
12
20
|
- Feature: Add `strict_mode` configuration for rejecting invalid JSON fields.
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
grpc-rest (0.
|
4
|
+
grpc-rest (0.3.1)
|
5
5
|
google-protobuf (>= 4.30.2)
|
6
6
|
grpc
|
7
7
|
rails (>= 6.0)
|
@@ -88,11 +88,17 @@ GEM
|
|
88
88
|
google-protobuf (4.30.2-arm64-darwin)
|
89
89
|
bigdecimal
|
90
90
|
rake (>= 13)
|
91
|
+
google-protobuf (4.30.2-x86_64-linux)
|
92
|
+
bigdecimal
|
93
|
+
rake (>= 13)
|
91
94
|
googleapis-common-protos-types (1.19.0)
|
92
95
|
google-protobuf (>= 3.18, < 5.a)
|
93
96
|
grpc (1.71.0-arm64-darwin)
|
94
97
|
google-protobuf (>= 3.25, < 5.0)
|
95
98
|
googleapis-common-protos-types (~> 1.0)
|
99
|
+
grpc (1.71.0-x86_64-linux)
|
100
|
+
google-protobuf (>= 3.25, < 5.0)
|
101
|
+
googleapis-common-protos-types (~> 1.0)
|
96
102
|
grpc-tools (1.64.0)
|
97
103
|
gruf (2.20.0)
|
98
104
|
activesupport (> 4)
|
@@ -21,7 +21,7 @@ class <%= service.name.demodulize %>Controller < ActionController::Base
|
|
21
21
|
except(*%w(controller action <%= service.name.underscore %>))
|
22
22
|
grpc_request = GrpcRest.init_request(<%= method.request_type %>, parameters)
|
23
23
|
GrpcRest.assign_params(grpc_request, METHOD_PARAM_MAP["<%= method.name.underscore %>"], "<%= method.option_body %>", request.parameters)
|
24
|
-
render json: GrpcRest.send_request("<%= service.namespace %>::<%= service.name.classify %>", "<%= method.name.underscore %>", grpc_request, <%= method.rest_options.inspect
|
24
|
+
render json: GrpcRest.send_request("<%= service.namespace %>::<%= service.name.classify %>", "<%= method.name.underscore %>", grpc_request, <%= method.rest_options.inspect %>, headers: request.headers)
|
25
25
|
end
|
26
26
|
<% end %>
|
27
27
|
end
|
data/lib/grpc_rest/version.rb
CHANGED
data/lib/grpc_rest.rb
CHANGED
@@ -5,6 +5,9 @@ require 'grpc'
|
|
5
5
|
require 'grpc/core/status_codes'
|
6
6
|
|
7
7
|
module GrpcRest
|
8
|
+
|
9
|
+
GrpcRestCall = Struct.new(:metadata)
|
10
|
+
|
8
11
|
class << self
|
9
12
|
attr_accessor :strict_mode
|
10
13
|
|
@@ -180,7 +183,11 @@ module GrpcRest
|
|
180
183
|
end
|
181
184
|
|
182
185
|
def error_msg(error)
|
183
|
-
|
186
|
+
error_info = "#{error.message}, backtrace: #{error.backtrace.join("\n")}"
|
187
|
+
if error.respond_to?(:cause) && error.cause
|
188
|
+
error_info += "\n\nCaused by: " + error.cause.backtrace.join("\n")
|
189
|
+
end
|
190
|
+
Rails.logger.error(error_info)
|
184
191
|
if error.respond_to?(:code)
|
185
192
|
{
|
186
193
|
code: error.code,
|
@@ -204,21 +211,29 @@ module GrpcRest
|
|
204
211
|
end
|
205
212
|
end
|
206
213
|
|
207
|
-
def send_gruf_request(klass, service_obj, method, request)
|
214
|
+
def send_gruf_request(klass, service_obj, method, request, headers: {})
|
208
215
|
ref = service_obj.rpc_descs[method.classify.to_sym]
|
216
|
+
call = GrpcRestCall.new(headers)
|
209
217
|
handler = klass.new(
|
210
218
|
method_key: method.to_sym,
|
211
219
|
service: service_obj,
|
212
220
|
rpc_desc: ref,
|
213
|
-
active_call:
|
221
|
+
active_call: GrpcRestCall.new(headers),
|
222
|
+
message: request
|
223
|
+
)
|
224
|
+
controller_request = Gruf::Controllers::Request.new(
|
225
|
+
method_key: method.to_sym,
|
226
|
+
service: service_obj,
|
227
|
+
rpc_desc: ref,
|
228
|
+
active_call: call,
|
214
229
|
message: request
|
215
230
|
)
|
216
|
-
Gruf::Interceptors::Context.new(gruf_interceptors(
|
231
|
+
Gruf::Interceptors::Context.new(gruf_interceptors(controller_request)).intercept! do
|
217
232
|
handler.send(method.to_sym)
|
218
233
|
end
|
219
234
|
end
|
220
235
|
|
221
|
-
# @param request [
|
236
|
+
# @param request [Gruf::Controllers::Request]
|
222
237
|
# @return [Array<Gruf::Interceptors::Base>]
|
223
238
|
def gruf_interceptors(request)
|
224
239
|
error = Gruf::Error.new
|
@@ -232,19 +247,19 @@ module GrpcRest
|
|
232
247
|
klass.new.public_send(method, request)
|
233
248
|
end
|
234
249
|
|
235
|
-
def get_response(service, method, request)
|
250
|
+
def get_response(service, method, request, headers: {})
|
236
251
|
if defined?(Gruf)
|
237
252
|
service_obj = service.constantize::Service
|
238
253
|
klass = ::Gruf::Controllers::Base.subclasses.find do |k|
|
239
254
|
k.bound_service == service_obj
|
240
255
|
end
|
241
|
-
return send_gruf_request(klass, service_obj, method, request) if klass
|
256
|
+
return send_gruf_request(klass, service_obj, method, request, headers: headers) if klass
|
242
257
|
end
|
243
258
|
send_grpc_request(service, method, request)
|
244
259
|
end
|
245
260
|
|
246
|
-
def send_request(service, method, request, options = {})
|
247
|
-
response = get_response(service, method, request)
|
261
|
+
def send_request(service, method, request, options = {}, headers: {})
|
262
|
+
response = get_response(service, method, request, headers: headers)
|
248
263
|
if options[:emit_defaults]
|
249
264
|
response.to_json(emit_defaults: true)
|
250
265
|
else
|
@@ -29,7 +29,7 @@ class MyServiceController < ActionController::Base
|
|
29
29
|
except(*%w(controller action my_service))
|
30
30
|
grpc_request = GrpcRest.init_request(Testdata::TestRequest, parameters)
|
31
31
|
GrpcRest.assign_params(grpc_request, METHOD_PARAM_MAP["test"], "", request.parameters)
|
32
|
-
render json: GrpcRest.send_request("Testdata::MyService", "test", grpc_request, {:emit_defaults=>true})
|
32
|
+
render json: GrpcRest.send_request("Testdata::MyService", "test", grpc_request, {:emit_defaults=>true}, headers: request.headers)
|
33
33
|
end
|
34
34
|
|
35
35
|
def test2
|
@@ -37,7 +37,7 @@ class MyServiceController < ActionController::Base
|
|
37
37
|
except(*%w(controller action my_service))
|
38
38
|
grpc_request = GrpcRest.init_request(Testdata::TestRequest, parameters)
|
39
39
|
GrpcRest.assign_params(grpc_request, METHOD_PARAM_MAP["test2"], "second_record", request.parameters)
|
40
|
-
render json: GrpcRest.send_request("Testdata::MyService", "test2", grpc_request, {})
|
40
|
+
render json: GrpcRest.send_request("Testdata::MyService", "test2", grpc_request, {}, headers: request.headers)
|
41
41
|
end
|
42
42
|
|
43
43
|
def test3
|
@@ -45,7 +45,7 @@ class MyServiceController < ActionController::Base
|
|
45
45
|
except(*%w(controller action my_service))
|
46
46
|
grpc_request = GrpcRest.init_request(Testdata::TestRequest, parameters)
|
47
47
|
GrpcRest.assign_params(grpc_request, METHOD_PARAM_MAP["test3"], "", request.parameters)
|
48
|
-
render json: GrpcRest.send_request("Testdata::MyService", "test3", grpc_request, {})
|
48
|
+
render json: GrpcRest.send_request("Testdata::MyService", "test3", grpc_request, {}, headers: request.headers)
|
49
49
|
end
|
50
50
|
|
51
51
|
def test4
|
@@ -53,7 +53,7 @@ class MyServiceController < ActionController::Base
|
|
53
53
|
except(*%w(controller action my_service))
|
54
54
|
grpc_request = GrpcRest.init_request(Testdata::TestRequest, parameters)
|
55
55
|
GrpcRest.assign_params(grpc_request, METHOD_PARAM_MAP["test4"], "*", request.parameters)
|
56
|
-
render json: GrpcRest.send_request("Testdata::MyService", "test4", grpc_request, {})
|
56
|
+
render json: GrpcRest.send_request("Testdata::MyService", "test4", grpc_request, {}, headers: request.headers)
|
57
57
|
end
|
58
58
|
|
59
59
|
end
|
@@ -28,7 +28,7 @@ class MyServiceController < ActionController::Base
|
|
28
28
|
except(*%w(controller action my_service))
|
29
29
|
grpc_request = GrpcRest.init_request(Testdata::TestRequest, parameters)
|
30
30
|
GrpcRest.assign_params(grpc_request, METHOD_PARAM_MAP["test"], "", request.parameters)
|
31
|
-
render json: GrpcRest.send_request("Testdata::MyService", "test", grpc_request, {:emit_defaults=>true})
|
31
|
+
render json: GrpcRest.send_request("Testdata::MyService", "test", grpc_request, {:emit_defaults=>true}, headers: request.headers)
|
32
32
|
end
|
33
33
|
|
34
34
|
def test2
|
@@ -36,7 +36,7 @@ class MyServiceController < ActionController::Base
|
|
36
36
|
except(*%w(controller action my_service))
|
37
37
|
grpc_request = GrpcRest.init_request(Testdata::TestRequest, parameters)
|
38
38
|
GrpcRest.assign_params(grpc_request, METHOD_PARAM_MAP["test2"], "second_record", request.parameters)
|
39
|
-
render json: GrpcRest.send_request("Testdata::MyService", "test2", grpc_request, {})
|
39
|
+
render json: GrpcRest.send_request("Testdata::MyService", "test2", grpc_request, {}, headers: request.headers)
|
40
40
|
end
|
41
41
|
|
42
42
|
def test3
|
@@ -44,7 +44,7 @@ class MyServiceController < ActionController::Base
|
|
44
44
|
except(*%w(controller action my_service))
|
45
45
|
grpc_request = GrpcRest.init_request(Testdata::TestRequest, parameters)
|
46
46
|
GrpcRest.assign_params(grpc_request, METHOD_PARAM_MAP["test3"], "", request.parameters)
|
47
|
-
render json: GrpcRest.send_request("Testdata::MyService", "test3", grpc_request, {})
|
47
|
+
render json: GrpcRest.send_request("Testdata::MyService", "test3", grpc_request, {}, headers: request.headers)
|
48
48
|
end
|
49
49
|
|
50
50
|
def test4
|
@@ -52,7 +52,7 @@ class MyServiceController < ActionController::Base
|
|
52
52
|
except(*%w(controller action my_service))
|
53
53
|
grpc_request = GrpcRest.init_request(Testdata::TestRequest, parameters)
|
54
54
|
GrpcRest.assign_params(grpc_request, METHOD_PARAM_MAP["test4"], "*", request.parameters)
|
55
|
-
render json: GrpcRest.send_request("Testdata::MyService", "test4", grpc_request, {})
|
55
|
+
render json: GrpcRest.send_request("Testdata::MyService", "test4", grpc_request, {}, headers: request.headers)
|
56
56
|
end
|
57
57
|
|
58
58
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: grpc-rest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Orner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-
|
11
|
+
date: 2025-07-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: google-protobuf
|