lib/hardhat/middleware/deadline_propagation.ex

defmodule Hardhat.Middleware.DeadlinePropagation do
  @moduledoc """
  Propagates `Deadline` information to the server being called via
  an HTTP header. _This middleware is part of the default stack_.

  Expects a `:header` option, which defaults to `"deadline"`. See `Hardhat.Defaults.deadline_propagation_opts/0`.
  """

  @behaviour Tesla.Middleware

  @impl Tesla.Middleware
  def call(env, next, opts) do
    header = Keyword.fetch!(opts, :header)

    env =
      case Deadline.time_remaining() do
        :infinity -> env
        value -> Tesla.put_header(env, header, to_string(value))
      end

    Tesla.run(env, next)
  end
end