defmodule Dust.Lease do
@moduledoc """
A held lease — a snapshot capability handle returned by `Dust.lease/3` and
`Dust.renew/2`.
Authority lives on the server: this struct is a point-in-time snapshot, not a
live lock. `token` is the server-stamped fence token (monotonic, preserved
across `renew`); pass the whole struct to `Dust.renew/2`, `Dust.release/1`,
or a write's `fence:` option.
"""
@type t :: %__MODULE__{
key: String.t(),
token: integer(),
holder: String.t() | nil,
expires_at: integer()
}
defstruct [:key, :token, :holder, :expires_at]
@spec new(keyword()) :: t()
def new(opts) do
%__MODULE__{
key: Keyword.fetch!(opts, :key),
token: Keyword.fetch!(opts, :token),
holder: Keyword.get(opts, :holder),
expires_at: Keyword.fetch!(opts, :expires_at)
}
end
end