class Yrpc::Controllers::ServiceBinder

Public Class Methods

new(service) click to toggle source

初始化。。没什么好解释的

# File lib/yrpc/controllers/service_binder.rb, line 12
def initialize(service)
  @service = service
end

Public Instance Methods

bind!(controller) click to toggle source

通过controller绑定所有的方法

# File lib/yrpc/controllers/service_binder.rb, line 18
def bind!(controller)
  rpc_methods.each { |name, desc| bind_method(controller, name, desc) }
end
rpc_desc(request_method) click to toggle source
# File lib/yrpc/controllers/service_binder.rb, line 22
def rpc_desc(request_method)
  @service.rpc_descs[request_method]
end

Private Instance Methods

bind_method(controller, method_name, desc) click to toggle source

打开类并且进行一个方法define,返回给这个方法打call。这里要注意的是request 会以参数形式构造进controller 这里也涉及到stream 类型。

# File lib/yrpc/controllers/service_binder.rb, line 31
def bind_method(controller, method_name, desc)
  method_desc = method_name.to_s.to_sym
  method_key = method_name.to_s.underscore.to_sym
  current_desc = rpc_desc(method_desc)
  service_ref = @service
  @service.class_eval do
    if desc.request_response?
      define_method(method_key) do |message, active_call|
        c = controller.new(method_key: method_key, service: service_ref, message: message, active_call: active_call, rpc_desc: desc)
        begin
          c.call(method_key)
        rescue => e
          p method_key
          p e.backtrace_locations
          desc && desc.output ? desc.output.new(status: {code: e.respond_to?(:code) ? e.code :  Yrpc::Response::Code::ERROR , message: e.message}) : (raise e)
        end
      end
    elsif desc.client_streamer?
      define_method(method_key) do |active_call|
        c = controller.new(method_key: method_key, service: service_ref, message: proc { |&block| active_call.each_remote_read(&block) }, active_call: active_call, rpc_desc: desc)
        begin
          c.call(method_key)
        rescue => e
          desc && desc.output ? desc.output.new(status: {code: e&.code || Yrpc::Response::Code::ERROR, message: e.message}) : (raise e)
        end
      end
    elsif desc.server_streamer?
      define_method(method_key) do |message, active_call, &block|
        c = controller.new(method_key: method_key, service: service_ref, message: message, active_call: active_call, rpc_desc: desc)
        begin
          c.call(method_key)
        rescue => e
          desc && desc.output ? desc.output.new(status: {code: e&.code || Yrpc::Response::Code::ERROR , message: e.message}) : (raise e)
        end
      end
    else # bidi
      define_method(method_key) do |messages, active_call, &block|
        c = controller.new(method_key: method_key, service: service_ref, message: messages, active_call: active_call, rpc_desc: desc)
        begin
          c.call(method_key)
        rescue => e
          desc && desc.output ? desc.output.new(status: {code: e&.code || Yrpc::Response::Code::ERROR, message: e.message}) : (raise e)
        end
      end
    end
  end
end
rpc_methods() click to toggle source

讲方法都代理到boundDesc 上

# File lib/yrpc/controllers/service_binder.rb, line 82
def rpc_methods
  @service.rpc_descs.map { |rd| BoundDesc.new(rd) }
end