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