v0.2.2 (2026-05-29)
Requires Elixir 1.15 or higher.
Fixed
IdempotencyPlug.EctoStorenow prevents decoding of unsafe dataIdempotencyPlug.call/2now formats store error reasons withinspect/1to prevent serialization failure when reason is an error structExpiresresponse header now uses RFC 9110 IMF-fixdate with zero-padded day
Changed
IdempotencyPlug.ETSStorenow uses:setinstead of:ordered_setfor faster lookups- Cached responses now use the original response headers exactly, dropping any headers set by upstream plugs
Added
- Support
:cached_headersoption to set custom headers likeIdempotent-Replayedfor cached responses - Added
[:idempotency_plug, :track, _event]telemetry span events - Added
[:idempotency_plug, :request_tracker, :cache_hit]and[:idempotency_plug, :request_tracker, :cache_miss]telemetry events - Added
[:idempotency_plug, :request_tracker, :prune, _event]telemetry span events
v0.2.1 (2023-04-28)
Relaxed dependency requirements for ecto and ecto_sql.
v0.2.0 (2023-04-12)
This is a breaking release.
If you have been using the Idempotency.Handler behaviour, change your plug to this:
plug IdempotencyPlug,
tracker: MyAppWeb.RequestTracker,
idempotency_key: {MyAppWeb.IdempotencyPlugHandler, :scope_idempotency_key},
with: {MyAppWeb.IdempotencyPlugHandler, :handle_error}And change your handler module to this:
defmodule MyAppWeb.IdempotencyPlugHandler do
import Phoenix.Controller
import Plug.Conn
def scope_idempotency_key(conn, key), do: {conn.assigns.current_user.id, key}
def handle_error(conn, error) do
conn
|> put_status(Plug.Exception.status(error))
|> json(%{error: error.message})
|> halt()
end
endChanges
- IdempotencyPlug.Handler removed
- IdempotencyPlug raises errors by default
- IdempotencyPlug now accepts
:idempotency_key,:request_payload,:hash, and:withoptions - IdempotencyPlug now requires
:trackeroption - SHA256 hashing now accepts Erlang terms instead of just binary
v0.1.2 (2023-04-07)
- Fix source url and name in docs
v0.1.1 (2023-04-07)
- Fix indention for generated Ecto migration
v0.1.0 (2023-04-06)
- Initial release