Class: Exa::Internal::Transport::AsyncRequester

Inherits:
Object
  • Object
show all
Defined in:
lib/exa/internal/transport/async_requester.rb

Defined Under Namespace

Classes: ResponseAdapter

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(internet: nil) ⇒ AsyncRequester



42
43
44
# File 'lib/exa/internal/transport/async_requester.rb', line 42

def initialize(internet: nil)
  @internet = internet || Async::HTTP::Internet.new
end

Instance Attribute Details

#internetObject (readonly)

Returns the value of attribute internet.



40
41
42
# File 'lib/exa/internal/transport/async_requester.rb', line 40

def internet
  @internet
end

Instance Method Details

#closeObject



76
77
78
# File 'lib/exa/internal/transport/async_requester.rb', line 76

def close
  internet.close
end

#execute(request) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/exa/internal/transport/async_requester.rb', line 46

def execute(request)
  task = Async::Task.current?
  unless task
    raise Exa::Errors::ConfigurationError,
      "AsyncRequester must run inside an Async scheduler (wrap calls in `Async do ... end`)."
  end

  deadline = request.fetch(:deadline)
  response = with_timeout(deadline, request[:url]) do
    internet.call(
      request.fetch(:method).to_s.upcase,
      request.fetch(:url).to_s,
      request.fetch(:headers),
      request[:body]
    )
  end

  adapter = ResponseAdapter.new(response)

  body_enum = build_body_enum(response: response, deadline: deadline, url: request.fetch(:url).to_s)

  [Integer(response.status), adapter, body_enum]
rescue Async::TimeoutError
  raise Exa::Errors::APITimeoutError.new("Request timed out", url: request[:url])
rescue Exa::Errors::APIError, Exa::Errors::ConfigurationError
  raise
rescue StandardError => e
  raise Exa::Errors::APIConnectionError.new(e.message, url: request[:url])
end