lib/conn_grpc/backoff/exponential.ex

defmodule ConnGRPC.Backoff.Exponential do
  @moduledoc """
  Exponential backoff with jitter.

  This is the default retry backoff mechanism used by ConnGRPC.
  """

  @behaviour ConnGRPC.Backoff

  @impl true
  def new(opts) do
    min = Keyword.fetch!(opts, :min)
    max = Keyword.fetch!(opts, :max)
    :backoff.init(min, max) |> :backoff.type(:jitter)
  end

  @impl true
  def backoff(state) do
    :backoff.fail(state)
  end

  @impl true
  def reset(state) do
    {_, state} = :backoff.succeed(state)
    state
  end
end