Class: Protobuf::Rpc::Service

Inherits:
Object
  • Object
show all
Includes:
Logging, ServiceFilters
Defined in:
lib/protobuf/rpc/service.rb

Overview

Object to encapsulate the request/response types for a given service method

Constant Summary collapse

DEFAULT_HOST =
'127.0.0.1'.freeze
DEFAULT_PORT =
9399

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Logging

initialize_logger, #log_exception, #log_signature, #logger, #sign_message

Constructor Details

#initialize(env) ⇒ Service

Constructor!

Initialize a service with the rpc endpoint name and the bytes for the request.



27
28
29
30
# File 'lib/protobuf/rpc/service.rb', line 27

def initialize(env)
  @env = env.dup # Dup the env so it doesn't change out from under us
  @request = env.request
end

Class Attribute Details

.hostObject

The host location of the service.



57
58
59
# File 'lib/protobuf/rpc/service.rb', line 57

def self.host
  @host ||= DEFAULT_HOST
end

.portObject

The port of the service on the destination server.



91
92
93
# File 'lib/protobuf/rpc/service.rb', line 91

def self.port
  @port ||= DEFAULT_PORT
end

Instance Attribute Details

#envObject (readonly)

Returns the value of attribute env.



20
21
22
# File 'lib/protobuf/rpc/service.rb', line 20

def env
  @env
end

#requestObject (readonly)

Returns the value of attribute request.



20
21
22
# File 'lib/protobuf/rpc/service.rb', line 20

def request
  @request
end

Class Method Details

.client(options = {}) ⇒ Object

Class Methods

Create a new client for the given service. See Client#initialize and ClientConnection::DEFAULT_OPTIONS for all available options.



39
40
41
42
43
# File 'lib/protobuf/rpc/service.rb', line 39

def self.client(options = {})
  ::Protobuf::Rpc::Client.new({ :service => self,
                                :host => host,
                                :port => port }.merge(options))
end

.configure(config = {}) ⇒ Object

Allows service-level configuration of location. Useful for system-startup configuration of a service so that any Clients using the Service.client sugar will not have to configure the location each time.



50
51
52
53
# File 'lib/protobuf/rpc/service.rb', line 50

def self.configure(config = {})
  self.host = config[:host] if config.key?(:host)
  self.port = config[:port] if config.key?(:port)
end

.implemented_servicesObject

An array of defined service classes that contain implementation code



69
70
71
72
73
74
75
76
77
# File 'lib/protobuf/rpc/service.rb', line 69

def self.implemented_services
  classes = (subclasses || []).select do |subclass|
    subclass.rpcs.any? do |(name, _)|
      subclass.method_defined? name
    end
  end

  classes.map(&:name)
end

.located_at(location) ⇒ Object

Shorthand call to configure, passing a string formatted as hostname:port e.g. 127.0.0.1:9933 e.g. localhost:0



83
84
85
86
87
# File 'lib/protobuf/rpc/service.rb', line 83

def self.located_at(location)
  return if location.nil? || location.downcase.strip !~ /.+:\d+/
  host, port = location.downcase.strip.split ':'
  configure(:host => host, :port => port.to_i)
end

.rpc(method, request_type, response_type, &options_block) ⇒ Object

Define an rpc method with the given request and response types. This methods is only used by the generated service definitions and not useful for user code.



105
106
107
# File 'lib/protobuf/rpc/service.rb', line 105

def self.rpc(method, request_type, response_type, &options_block)
  rpcs[method] = RpcMethod.new(method, request_type, response_type, &options_block)
end

.rpc_method?(name) ⇒ Boolean

Check if the given method name is a known rpc endpoint.

Returns:

  • (Boolean)


117
118
119
# File 'lib/protobuf/rpc/service.rb', line 117

def self.rpc_method?(name)
  rpcs.key?(name)
end

.rpcsObject

Hash containing the set of methods defined via rpc.



111
112
113
# File 'lib/protobuf/rpc/service.rb', line 111

def self.rpcs
  @rpcs ||= {}
end

Instance Method Details

#call(method_name) ⇒ Object



121
122
123
# File 'lib/protobuf/rpc/service.rb', line 121

def call(method_name)
  run_filters(method_name)
end

#responseObject

Response object for this rpc cycle. Not assignable.



127
128
129
# File 'lib/protobuf/rpc/service.rb', line 127

def response
  @response ||= response_type.new
end

#rpc_method?(name) ⇒ Boolean

Convenience method to get back to class method.

Returns:

  • (Boolean)


133
134
135
# File 'lib/protobuf/rpc/service.rb', line 133

def rpc_method?(name)
  self.class.rpc_method?(name)
end

#rpcsObject

Convenience method to get back to class rpcs hash.



139
140
141
# File 'lib/protobuf/rpc/service.rb', line 139

def rpcs
  self.class.rpcs
end