Class: Exa::Internal::Transport::BaseClient

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

Direct Known Subclasses

Client

Constant Summary collapse

PLATFORM_HEADERS =
{
  "x-stainless-lang" => "ruby",
  "x-stainless-runtime" => RUBY_ENGINE,
  "x-stainless-runtime-version" => RUBY_ENGINE_VERSION
}.freeze
DEFAULT_MAX_RETRIES =
2
DEFAULT_TIMEOUT =
120.0
DEFAULT_INITIAL_RETRY_DELAY =
0.5
DEFAULT_MAX_RETRY_DELAY =
8.0

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(base_url:, timeout: DEFAULT_TIMEOUT, max_retries: DEFAULT_MAX_RETRIES, initial_retry_delay: DEFAULT_INITIAL_RETRY_DELAY, max_retry_delay: DEFAULT_MAX_RETRY_DELAY, headers: {}, requester: Exa::Internal::Transport::PooledNetRequester.new) ⇒ BaseClient

Returns a new instance of BaseClient.



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/exa/internal/transport/base_client.rb', line 30

def initialize(
  base_url:,
  timeout: DEFAULT_TIMEOUT,
  max_retries: DEFAULT_MAX_RETRIES,
  initial_retry_delay: DEFAULT_INITIAL_RETRY_DELAY,
  max_retry_delay: DEFAULT_MAX_RETRY_DELAY,
  headers: {},
  requester: Exa::Internal::Transport::PooledNetRequester.new
)
  @base_url = URI(base_url)
  @timeout = timeout
  @max_retries = max_retries
  @initial_retry_delay = initial_retry_delay
  @max_retry_delay = max_retry_delay
  @headers = headers || {}
  @requester = requester
end

Instance Attribute Details

#base_urlObject (readonly)

Returns the value of attribute base_url.



28
29
30
# File 'lib/exa/internal/transport/base_client.rb', line 28

def base_url
  @base_url
end

#headersObject (readonly)

Returns the value of attribute headers.



28
29
30
# File 'lib/exa/internal/transport/base_client.rb', line 28

def headers
  @headers
end

#initial_retry_delayObject (readonly)

Returns the value of attribute initial_retry_delay.



28
29
30
# File 'lib/exa/internal/transport/base_client.rb', line 28

def initial_retry_delay
  @initial_retry_delay
end

#max_retriesObject (readonly)

Returns the value of attribute max_retries.



28
29
30
# File 'lib/exa/internal/transport/base_client.rb', line 28

def max_retries
  @max_retries
end

#max_retry_delayObject (readonly)

Returns the value of attribute max_retry_delay.



28
29
30
# File 'lib/exa/internal/transport/base_client.rb', line 28

def max_retry_delay
  @max_retry_delay
end

#requesterObject (readonly)

Returns the value of attribute requester.



28
29
30
# File 'lib/exa/internal/transport/base_client.rb', line 28

def requester
  @requester
end

#timeoutObject (readonly)

Returns the value of attribute timeout.



28
29
30
# File 'lib/exa/internal/transport/base_client.rb', line 28

def timeout
  @timeout
end

Instance Method Details

#request(method:, path:, query: nil, headers: nil, body: nil, unwrap: nil, stream: false, response_model: nil, request_options: nil) ⇒ Object



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
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/exa/internal/transport/base_client.rb', line 48

def request(method:, path:, query: nil, headers: nil, body: nil, unwrap: nil, stream: false, response_model: nil, request_options: nil)
  request_id = SecureRandom.uuid
  path_str = Array(path).join("/")
  endpoint = Exa::Instrumentation::Endpoint.from_path(path_str)
  start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)

  emit_request_start(request_id, endpoint, method, path_str)

  options = normalize_request_options(request_options)
  req = build_request(
    method: method,
    path: path_str,
    query: query,
    headers: headers,
    body: body,
    request_timeout: options[:timeout],
    idempotency_key: options[:idempotency_key]
  )

  begin
    status, response, stream_enum = send_request(req, max_retries: options[:max_retries] || max_retries)
    parsed_headers = Exa::Internal::Util.normalized_headers(response.each_header.to_h)

    result = if stream
               Exa::Internal::Transport::Stream.new(headers: parsed_headers, stream: stream_enum)
             else
               decoded = Exa::Internal::Util.decode_content(parsed_headers, stream: stream_enum)
               coerced = coerce_response(response_model, decoded)
               unwrap ? dig(coerced, unwrap) : coerced
             end

    emit_request_complete(request_id, endpoint, start_time, status, result)
    result
  rescue StandardError => e
    emit_request_error(request_id, endpoint, start_time, e)
    raise
  end
end