Single-node ETS implementation of Attesto.CodeStore.
Codes live in a public ETS table owned by a GenServer that sweeps
expired rows on a fixed interval. take/1 uses :ets.take/2, which
fetches and deletes a row in one atomic step, so the single-use
guarantee holds against concurrent redemptions on a node. This is a
per-node store: a multi-node deployment MUST back Attesto.CodeStore
with a shared store (e.g. Postgres DELETE ... RETURNING) so a code
issued on one node can be redeemed (once) on another.
Start options
:sweep_interval_ms(default30_000) - how often expired rows are bulk-deleted. Correctness does not depend on sweeping (take/1returns the row andAttesto.AuthorizationCodere-checks expiry); the sweeper only bounds table size.
Wiring
children = [Attesto.CodeStore.ETS]then pass the module as the store:
Attesto.AuthorizationCode.issue(Attesto.CodeStore.ETS, attrs)
Summary
Functions
@spec reset() :: :ok
Clear every entry. Test-facing.
@spec start_link(keyword()) :: GenServer.on_start()