Module: Clicksign::RetryBackoff

Defined in:
lib/clicksign/retry_backoff.rb

Constant Summary collapse

BASE_SECONDS =
0.5
CAP_SECONDS =
30.0

Class Method Summary collapse

Class Method Details

.ceiling(attempt) ⇒ Object



10
11
12
# File 'lib/clicksign/retry_backoff.rb', line 10

def ceiling(attempt)
  [BASE_SECONDS * (2**(attempt - 1)), CAP_SECONDS].min.to_f
end

.delay(attempt, rng: Random) ⇒ Object

Full jitter: uniform in [0, ceiling) to spread retries and avoid thundering herd.



15
16
17
18
19
20
# File 'lib/clicksign/retry_backoff.rb', line 15

def delay(attempt, rng: Random)
  max = ceiling(attempt)
  return 0.0 if max <= 0

  rng.rand(max)
end

.parse_retry_after(headers) ⇒ Object



22
23
24
25
26
27
28
29
30
31
# File 'lib/clicksign/retry_backoff.rb', line 22

def parse_retry_after(headers)
  return nil unless headers.is_a?(Hash)

  raw = headers['retry-after'] || headers['Retry-After']
  return nil if raw.nil? || raw.to_s.strip.empty?

  Float(raw.to_s.strip)
rescue ArgumentError, TypeError
  nil
end

.retry_delay(attempt, headers = nil, rng: Random) ⇒ Object



33
34
35
36
37
# File 'lib/clicksign/retry_backoff.rb', line 33

def retry_delay(attempt, headers = nil, rng: Random)
  jitter      = delay(attempt, rng: rng)
  retry_after = parse_retry_after(headers)
  retry_after ? [jitter, retry_after].max : jitter
end