class ApiTransformer::Endpoint

Processes endpoint blocks

Public Class Methods

new(base_url, env, route) click to toggle source
# File lib/api_transformer/endpoint.rb, line 4
def initialize(base_url, env, route)
  @base_url = base_url
  @env = env
  @route = route

  @backend_request_senders = []
  @backend_responses = {}
end

Public Instance Methods

complete() click to toggle source
# File lib/api_transformer/endpoint.rb, line 20
def complete
  if @error
    complete_error
  else
    complete_success
  end
end
request(name, options = {}, &block) click to toggle source
# File lib/api_transformer/endpoint.rb, line 28
def request(name, options = {}, &block)
  return unless !options.key?(:when) || options[:when]

  @backend_request_senders << BackendRequestSender.new(
    name,
    options.merge(base_url: @base_url),
    block,
    @env["client-headers"],
    @route[:helper_blocks]
  )
end
response(options = {}, &block) click to toggle source
# File lib/api_transformer/endpoint.rb, line 40
def response(options = {}, &block)
  @builder = FrontendResponseBuilder.new(
    @env,
    options,
    block,
    @route
  )
end
run() click to toggle source
# File lib/api_transformer/endpoint.rb, line 13
def run
  fail "Endpoints must define a response block" unless @builder

  send_requests
  send_response
end
stream(value) click to toggle source
# File lib/api_transformer/endpoint.rb, line 49
def stream(value)
  @stream = value
end

Private Instance Methods

close() click to toggle source
# File lib/api_transformer/endpoint.rb, line 119
def close
  @builder.send_body
  @builder.stream_close
end
complete_error() click to toggle source
# File lib/api_transformer/endpoint.rb, line 114
def complete_error
  @builder.stream_write @error
  close
end
complete_success() click to toggle source
# File lib/api_transformer/endpoint.rb, line 100
def complete_success
  EM.synchrony do
    @builder.do_streaming

    if @backend_request_senders.any?
      @multi.callback do
        close
      end
    else
      close
    end
  end
end
send_request(sender, iter) click to toggle source
# File lib/api_transformer/endpoint.rb, line 68
def send_request(sender, iter)
  http = sender.send(@backend_responses)
  @backend_responses[sender.request_name] = BackendResponse.new(http)
  @multi.add sender.request_name, http
  http.headers { iter.next }
rescue ApiTransformer::RequestError => e
  @error = e
  iter.next
end
send_requests() click to toggle source
# File lib/api_transformer/endpoint.rb, line 55
def send_requests
  @multi = EventMachine::MultiRequest.new
  iterator = EM::Synchrony::Iterator.new(@backend_request_senders)

  iterator.each do |sender, iter|
    if @backend_responses.values.all?(&:success?)
      send_request(sender, iter)
    else
      iter.next
    end
  end
end
send_response() click to toggle source
# File lib/api_transformer/endpoint.rb, line 78
def send_response
  if @stream
    status_and_headers
  else
    if @backend_request_senders.any? && !@error
      EM::Synchrony::Iterator.new([@multi]).each do |multi, iter|
        multi.callback { iter.next }
      end
    end

    status_and_headers
  end
end
status_and_headers() click to toggle source
# File lib/api_transformer/endpoint.rb, line 92
def status_and_headers
  if @error
    [400, {}]
  else
    @builder.status_and_headers(@backend_responses)
  end
end