Class: Itsi::Server::GrpcInterface
- Inherits:
-
Object
- Object
- Itsi::Server::GrpcInterface
- Defined in:
- lib/itsi/server/grpc/grpc_interface.rb
Constant Summary collapse
- DeadlineExceeded =
Class.new(StandardError)
Instance Attribute Summary collapse
-
#service ⇒ Object
Returns the value of attribute service.
-
#service_class ⇒ Object
Returns the value of attribute service_class.
Class Method Summary collapse
Instance Method Summary collapse
- #handle_request(active_call) ⇒ Object
-
#initialize(service) ⇒ GrpcInterface
constructor
A new instance of GrpcInterface.
Constructor Details
#initialize(service) ⇒ GrpcInterface
Returns a new instance of GrpcInterface.
23 24 25 26 27 28 29 |
# File 'lib/itsi/server/grpc/grpc_interface.rb', line 23 def initialize(service) @service = service @service_class = service.class @rpc_descs = @service_class.rpc_descs.transform_keys do |k| k.to_s.gsub(/([a-z])([A-Z])/, "\\1_\\2").downcase.to_sym end end |
Instance Attribute Details
#service ⇒ Object
Returns the value of attribute service.
6 7 8 |
# File 'lib/itsi/server/grpc/grpc_interface.rb', line 6 def service @service end |
#service_class ⇒ Object
Returns the value of attribute service_class.
6 7 8 |
# File 'lib/itsi/server/grpc/grpc_interface.rb', line 6 def service_class @service_class end |
Class Method Details
.for(service) ⇒ Object
8 9 10 11 12 13 |
# File 'lib/itsi/server/grpc/grpc_interface.rb', line 8 def self.for(service) interface = new(service) lambda do |request| interface.handle_request(request) end end |
.reflection_for(handlers) ⇒ Object
15 16 17 18 19 20 21 |
# File 'lib/itsi/server/grpc/grpc_interface.rb', line 15 def self.reflection_for(handlers) require_relative "reflection/v1/reflection_services_pb" interface = new(Grpc::Reflection::V1::ServerReflection::Service.new(handlers)) lambda do |request| interface.handle_request(request) end end |
Instance Method Details
#handle_request(active_call) ⇒ Object
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/itsi/server/grpc/grpc_interface.rb', line 31 def handle_request(active_call) unless (active_call.rpc_desc = @rpc_descs[active_call.method_name]) active_call.stream.write("\n") active_call.send_status(13, "Method not found") active_call.close return end active_call.( { "grpc-accept-encoding" => "gzip, deflate, identity", "content-type" => active_call.json? ? "application/json" : "application/grpc" } ) begin if active_call.bidi_streamer? handle_bidi_streaming(active_call) elsif active_call.client_streamer? handle_client_streaming(active_call) elsif active_call.server_streamer? handle_server_streaming(active_call) elsif active_call.request_response? handle_unary(active_call) end active_call.send_status(0, "Success") rescue Google::Protobuf::ParseError => e active_call.send_empty active_call.send_status(3, e.) rescue DeadlineExceeded => e active_call.send_empty active_call.send_status(4, e.) rescue StandardError => e active_call.send_empty active_call.send_status(13, e.) end rescue StandardError => e Itsi.log_warn("Unhandled error in grpc_interface: #{e.message}") ensure active_call.close end |