Class: Aptabase::Transport

Inherits:
Object
  • Object
show all
Defined in:
lib/aptabase/transport.rb

Overview

Thin HTTP layer over Net::HTTP. Raises NetworkError for any failure so the client only has one error type to handle.

Constant Summary collapse

EVENTS_PATH =
"/api/v0/events"

Instance Method Summary collapse

Constructor Details

#initialize(base_url:, app_key:, timeout: 30.0) ⇒ Transport

Returns a new instance of Transport.



14
15
16
17
18
# File 'lib/aptabase/transport.rb', line 14

def initialize(base_url:, app_key:, timeout: 30.0)
  @uri = URI.parse(base_url.chomp("/") + EVENTS_PATH)
  @app_key = app_key
  @timeout = timeout
end

Instance Method Details

#post_events(payload) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/aptabase/transport.rb', line 20

def post_events(payload)
  request = Net::HTTP::Post.new(@uri)
  request["App-Key"] = @app_key
  request["Content-Type"] = "application/json"
  request.body = JSON.generate(payload)

  response = Net::HTTP.start(
    @uri.host, @uri.port,
    use_ssl: @uri.scheme == "https",
    open_timeout: @timeout, read_timeout: @timeout, write_timeout: @timeout
  ) { |http| http.request(request) }

  return if response.is_a?(Net::HTTPSuccess)

  raise NetworkError.new(
    "HTTP error #{response.code}: #{response.body}",
    status_code: response.code.to_i
  )
rescue Timeout::Error, SystemCallError, SocketError, IOError, OpenSSL::SSL::SSLError => e
  raise NetworkError, "Network error: #{e.message}"
end