Class: Condux::EventTransport

Inherits:
Object
  • Object
show all
Defined in:
lib/condux/event_transport.rb

Overview

Delivers a serialized event to the relay, retrying transient failures (429 / 5xx / network) with capped exponential backoff, honoring Retry-After on a 429. Never raises — returns a SendResult.

Constant Summary collapse

BASE_BACKOFF_MS =
200.0
MAX_BACKOFF_MS =
30_000.0

Instance Method Summary collapse

Constructor Details

#initialize(store_url, public_key, max_retries, transport, sleep) ⇒ EventTransport

Returns a new instance of EventTransport.



14
15
16
17
18
19
20
# File 'lib/condux/event_transport.rb', line 14

def initialize(store_url, public_key, max_retries, transport, sleep)
  @store_url = store_url
  @public_key = public_key
  @max_retries = max_retries
  @transport = transport || method(:net_http_send)
  @sleep = sleep || ->(seconds) { Kernel.sleep(seconds) }
end

Instance Method Details

#send_event(body) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/condux/event_transport.rb', line 22

def send_event(body)
  last_status = nil
  last_error = nil
  attempt = 0
  while attempt <= @max_retries
    status, headers, error = attempt_send(body)
    if error
      last_error = error
    else
      last_status = status
      last_error = nil
      return SendResult.new(ok: true, attempts: attempt + 1, status: status) if (200..299).cover?(status)
      return SendResult.new(ok: false, attempts: attempt + 1, status: status) unless retriable?(status)
    end

    break if attempt == @max_retries

    @sleep.call(backoff_seconds(attempt, status, headers))
    attempt += 1
  end

  SendResult.new(ok: false, attempts: @max_retries + 1, status: last_status, error: last_error)
end