Module: ApiBrasil::Core::Retry

Defined in:
lib/api_brasil/core/retry.rb

Overview

Politica de retry do cliente. Por padrao a SDK tenta novamente apenas em HTTP 429 (rate limit) e em falhas de conexao - nunca em timeouts ou erros de negocio, para nao duplicar cobrancas/envios.

Constant Summary collapse

DEFAULT =

Configuracao padrao:

  • retries: novas tentativas alem da original
  • min_delay_ms: atraso base do backoff exponencial
  • max_delay_ms: teto do atraso entre tentativas
  • retry_on_statuses: status HTTP que disparam retry
{
  retries: 2,
  min_delay_ms: 300,
  max_delay_ms: 5000,
  retry_on_statuses: [429].freeze
}.freeze

Class Method Summary collapse

Class Method Details

.backoff_delay_ms(attempt, retry_config) ⇒ Integer

Backoff exponencial com jitter: min * 2^attempt, limitado a max.

Parameters:

  • attempt (Integer)
  • retry_config (Hash)

Returns:

  • (Integer)

    atraso em milissegundos



46
47
48
49
50
51
# File 'lib/api_brasil/core/retry.rb', line 46

def backoff_delay_ms(attempt, retry_config)
  exponential = retry_config[:min_delay_ms] * (2**attempt)
  jitter = 0.5 + (Kernel.rand * 0.5)

  [retry_config[:max_delay_ms], (exponential * jitter).round].min
end

.normalize_key(key) ⇒ Symbol

Aceita minDelayMs (paridade com as outras SDKs) e min_delay_ms.

Returns:

  • (Symbol)


61
62
63
64
65
66
# File 'lib/api_brasil/core/retry.rb', line 61

def normalize_key(key)
  key.to_s
     .gsub(/([a-z\d])([A-Z])/, '\1_\2')
     .downcase
     .to_sym
end

.resolve(config) ⇒ Hash?

Normaliza a configuracao de retry. false (ou nil explicito via retry: false) desativa completamente.

Parameters:

  • config (Hash, false, nil)

Returns:

  • (Hash, nil)


28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/api_brasil/core/retry.rb', line 28

def resolve(config)
  return nil if config == false
  return DEFAULT.dup unless config.is_a?(Hash)

  normalized = config.each_with_object({}) do |(key, value), acc|
    next if value.nil?

    acc[normalize_key(key)] = value
  end

  DEFAULT.merge(normalized)
end

.sleep_ms(milliseconds) ⇒ Object

Pausa a execucao por ms milissegundos.



54
55
56
# File 'lib/api_brasil/core/retry.rb', line 54

def sleep_ms(milliseconds)
  Kernel.sleep(milliseconds / 1000.0) if milliseconds.positive?
end