class Protobuf::Rpc::Middleware::ResponseEncoder

def _call(env)

def _call(env)
  @env = app.call(env)
  env.response = response
  env.encoded_response = encoded_response
  env
end

def call(env)

def call(env)
  dup._call(env)
end

def encoded_response


Encode the response wrapper to return to the client
def encoded_response
  logger.debug { sign_message("Encoding response: #{response.inspect}") }
  env.encoded_response = wrapped_response.encode
rescue => exception
  log_exception(exception)
  # Rescue encoding exceptions, re-wrap them as generic protobuf errors,
  # and re-raise them
  raise PbError, exception.message
end

def initialize(app)

def initialize(app)
  @app = app
end

def log_signature

def log_signature
  env.log_signature || super
end

def response

candidate. Validate the candidate protos.
Prod the object to see if we can produce a proto object as a response
def response
  return @response unless @response.nil?
  candidate = env.response
  return @response = validate!(candidate) if candidate.is_a?(Message)
  return @response = validate!(candidate.to_proto) if candidate.respond_to?(:to_proto)
  return @response = env.response_type.new(candidate.to_hash) if candidate.respond_to?(:to_hash)
  return @response = candidate if candidate.is_a?(PbError)
  @response = validate!(candidate)
end

def validate!(candidate)


we expect so that deserialization on the client side works.
Ensure that the response candidate we've been given is of the type
def validate!(candidate)
  if candidate.class != env.response_type
    fail BadResponseProto, "Expected response to be of type #{env.response_type.name} but was #{candidate.class.name}"
  end
  candidate
end

def wrapped_response


it up so that it's in the correct spot in the response wrapper
The middleware stack returns either an error or response proto. Package
def wrapped_response
  if response.is_a?(::Protobuf::Rpc::PbError)
    ::Protobuf::Socketrpc::Response.new(:error => response.message, :error_reason => response.error_type, :server => env.server)
  else
    ::Protobuf::Socketrpc::Response.new(:response_proto => response.encode, :server => env.server)
  end
end