Module: TShield::Grpc

Defined in:
lib/tshield/grpc.rb,
lib/tshield/grpc/vcr.rb

Defined Under Namespace

Modules: RequestHandler, VCR

Class Method Summary collapse

Class Method Details

.build_handler(base, descriptions, number_of_handlers, options) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/tshield/grpc.rb', line 56

def self.build_handler(base, descriptions, number_of_handlers, options)
  handler = Class.new(base) do
    class << self
      attr_accessor :options
    end
    descriptions.each do |service_name, description|
      puts description
      method_name = service_name.to_s.underscore.to_sym
      define_method(method_name) do |request, parameters|
        handler(__method__, request, parameters)
      end
    end
  end
  handler.options = options
  TShield::Grpc.const_set "GrpcService#{number_of_handlers}", handler
end

.load_services(services) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/tshield/grpc.rb', line 40

def self.load_services(services)
  handlers = []
  number_of_handlers = 0
  services.each do |file, options|

    require file

    base = Object.const_get("#{options['module']}::Service")
    number_of_handlers += 1

    implementation = build_handler(base, base.rpc_descs, number_of_handlers, options)
    handlers << implementation
  end
  handlers
end

.run!Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/tshield/grpc.rb', line 17

def self.run!
  @configuration = TShield::Configuration.singleton.grpc

  lib_dir = File.join(Dir.pwd, @configuration['proto_dir'])
  $LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)

  TShield.logger.info("loading proto files from #{lib_dir}")

  bind = "0.0.0.0:#{@configuration['port']}"
  TShield.logger.info("Starting gRPC server in #{bind}")

  server = GRPC::RpcServer.new
  server.add_http2_port(bind, :this_port_is_insecure)

  services = load_services(@configuration['services'])
  services.each do |class_service|
    class_service.include RequestHandler
    server.handle(class_service)
  end

  server.run_till_terminated_or_interrupted([1, 'int', 'SIGQUIT']) unless services.empty?
end