Goldpath.Idempotency
0.1.0-preview.8
dotnet add package Goldpath.Idempotency --version 0.1.0-preview.8
NuGet\Install-Package Goldpath.Idempotency -Version 0.1.0-preview.8
<PackageReference Include="Goldpath.Idempotency" Version="0.1.0-preview.8" />
<PackageVersion Include="Goldpath.Idempotency" Version="0.1.0-preview.8" />
<PackageReference Include="Goldpath.Idempotency" />
paket add Goldpath.Idempotency --version 0.1.0-preview.8
#r "nuget: Goldpath.Idempotency, 0.1.0-preview.8"
#:package Goldpath.Idempotency@0.1.0-preview.8
#addin nuget:?package=Goldpath.Idempotency&version=0.1.0-preview.8&prerelease
#tool nuget:?package=Goldpath.Idempotency&version=0.1.0-preview.8&prerelease
Goldpath.Idempotency
Ring B idempotency, composed on Mediant (one store, one semantics): the HTTP
Idempotency-Key middleware here; the command path via Mediant [Idempotent].
The promise is effectively-once processing — not "exactly-once delivery" (that would be a lie).
Getting started
builder.Services.AddStackExchangeRedisCache(...); // golden path; AddDistributedMemoryCache in dev
builder.AddGoldpathIdempotency();
POST /api/v1/orders
Idempotency-Key: 7f3c… ← client-generated, stable across retries
First request executes and its response is stored; a retry replays it byte-for-byte
(Goldpath-Idempotent-Replay: true); a concurrent duplicate gets 409; the same key with a
different payload gets 422 (fingerprint).
Configuration
Bound from Goldpath:Idempotency:
{ "Goldpath": { "Idempotency": { "TtlHours": 24, "OnConflict": "Reject", "Fingerprint": "Strict" } } }
OnConflict:Reject(409, default) ·Wait(serialize on the in-flight operation and replay).Fingerprint:Strict(SHA-256 of the body; mismatch → 422, default) ·None.
Advanced
- Key scope:
http:{tenant}:{method}:{path}:{key}— tenants and endpoints never collide. - Only mutating methods (POST/PUT/PATCH) participate; GET/DELETE pass through.
- Only 2xx responses are stored; a failed attempt leaves no trace, so a retry can run.
- Command path: mark Mediant commands
[Idempotent]— same store, so HTTP and in-process semantics can never drift apart. - Per-key serialization is process-local (Mediant coordinator); horizontally scaled replicas can race on a cold key — the store's last-write-wins keeps it safe (documented Mediant note).
Providers
The store is Mediant's IIdempotencyStore over IDistributedCache: Redis in the golden path,
SQL Server distributed cache where mandated, in-memory for dev/tests — chosen by the host.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Goldpath.Abstractions (>= 0.1.0-preview.8)
- Mediant.Behaviors (>= 1.4.1)
-
net8.0
- Goldpath.Abstractions (>= 0.1.0-preview.8)
- Mediant.Behaviors (>= 1.4.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.1.0-preview.8 | 124 | 9/7/2026 |
| 0.1.0-preview.7 | 101 | 9/1/2026 |
| 0.1.0-preview.6 | 376 | 8/4/2026 |
| 0.1.0-preview.5 | 91 | 7/28/2026 |
| 0.1.0-preview.4 | 83 | 7/27/2026 |
| 0.1.0-preview.3 | 73 | 7/25/2026 |
| 0.1.0-preview.2 | 81 | 7/13/2026 |
| 0.1.0-preview.1 | 106 | 7/13/2026 |