Class: Grpc::Reflection::V1::ServerReflection::Service

Inherits:
Object
  • Object
show all
Includes:
GRPC::GenericService
Defined in:
lib/itsi/server/grpc/reflection/v1/reflection_services_pb.rb

Instance Method Summary collapse

Constructor Details

#initialize(handlers) ⇒ Service

Returns a new instance of Service.



45
46
47
48
# File 'lib/itsi/server/grpc/reflection/v1/reflection_services_pb.rb', line 45

def initialize(handlers)
  @handlers = handlers
  super()
end

Instance Method Details

#convert_file_path_to_proto_name(file_path) ⇒ Object



97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/itsi/server/grpc/reflection/v1/reflection_services_pb.rb', line 97

def convert_file_path_to_proto_name(file_path)
  # Remove .proto extension
  file_path = file_path.sub(/\.proto$/, "")

  # Split path into parts
  parts = file_path.split("/")

  # Convert last part to PascalCase (e.g., money -> Money)
  parts[-1] = parts[-1].split("_").map(&:capitalize).join

  # Join with dots
  parts.join(".")
end

#find_file_descriptor_by_filename(filename) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/itsi/server/grpc/reflection/v1/reflection_services_pb.rb', line 84

def find_file_descriptor_by_filename(filename)
  # First try direct lookup in the pool

  descriptor = Google::Protobuf::DescriptorPool.generated_pool.lookup(filename)&.file_descriptor
  return descriptor.to_proto if descriptor

  proto_name = convert_file_path_to_proto_name(filename)
  descriptor = Google::Protobuf::DescriptorPool.generated_pool.lookup(proto_name)&.file_descriptor
  return descriptor.to_proto if descriptor

  nil
end

#list_services_responseObject



111
112
113
114
115
# File 'lib/itsi/server/grpc/reflection/v1/reflection_services_pb.rb', line 111

def list_services_response
  @list_services_response ||= @handlers.map(&:class).map(&:service_name).map do |name|
    Grpc::Reflection::V1::ServiceResponse.new(name: name)
  end
end

#server_reflection_info(req, _unused_call) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/itsi/server/grpc/reflection/v1/reflection_services_pb.rb', line 50

def server_reflection_info(req, _unused_call)
  req.each do |request|
    res = Grpc::Reflection::V1::ServerReflectionResponse.new

    if !request.list_services.empty?
      res.list_services_response = Grpc::Reflection::V1::ListServiceResponse.new(service: list_services_response)
    elsif !request.file_containing_symbol.empty?
      res.file_descriptor_response = Grpc::Reflection::V1::FileDescriptorResponse.new(
        file_descriptor_proto: [
          Google::Protobuf::FileDescriptorProto.encode(Google::Protobuf::DescriptorPool.generated_pool.lookup(request.file_containing_symbol).file_descriptor.to_proto)
        ]
      )
    elsif !request.file_by_filename.empty?
      # Handle file_by_filename requests
      file_descriptor = find_file_descriptor_by_filename(request.file_by_filename)
      if file_descriptor
        res.file_descriptor_response = Grpc::Reflection::V1::FileDescriptorResponse.new(
          file_descriptor_proto: [Google::Protobuf::FileDescriptorProto.encode(file_descriptor)]
        )
      else
        res.error_response = Grpc::Reflection::V1::ErrorResponse.new(
          error_code: 5, # NOT_FOUND
          error_message: "File not found: #{request.file_by_filename}"
        )
      end
    end
    yield res
    # We can loop here if running in Fiber mode, but for best compatibility with blocking IO modes
    # we'll close the connection and force the client to reconnect force
    # subsequent reflection requests
    break
  end
end