Documentation
¶
Overview ¶
Package idempotency coordinates request attempts using expiring ownership leases.
Index ¶
- Variables
- func Middleware(c HTTPConfig) (func(http.Handler) http.Handler, error)
- type HTTPConfig
- type Memory
- func (m *Memory) Begin(ctx context.Context, key, fingerprint string, lease time.Duration) (Record, error)
- func (m *Memory) Complete(ctx context.Context, key, token string, status int, ttl time.Duration) error
- func (m *Memory) Fail(ctx context.Context, key, token string, ttl time.Duration) error
- func (m *Memory) Renew(ctx context.Context, key, token string, ttl time.Duration) error
- type Record
- type State
- type Store
Constants ¶
This section is empty.
Variables ¶
var ErrBusy = errors.New("idempotency: request processing")
var ErrCompleted = errors.New("idempotency: request already completed")
var ErrMismatch = errors.New("idempotency: request fingerprint mismatch")
var ErrOwnership = errors.New("idempotency: ownership lost")
Functions ¶
func Middleware ¶
Middleware returns context-aware HTTP admission or coordination middleware.
Types ¶
type HTTPConfig ¶
type HTTPConfig struct {
Store Store
Scope func(*http.Request) string
Lease, Retention, RequestTimeout time.Duration
MaxBodyBytes int64
OnError func(context.Context, error)
}
HTTPConfig requires a server-defined authorization/tenant scope. Bodies are fingerprinted, never persisted. Completed duplicates receive 409 and Idempotency-Status: completed; response bodies are not replayed. RequestTimeout must be shorter than Lease. A handler must honor cancellation; use durable business keys for irreversible side effects.
type Memory ¶
Memory is bounded. Expired processing leases may be reclaimed; operations must stop when renewal fails.
func (*Memory) Begin ¶
func (m *Memory) Begin(ctx context.Context, key, fingerprint string, lease time.Duration) (Record, error)
Begin atomically attempts to acquire a fingerprint-bound processing lease.
func (*Memory) Complete ¶
func (m *Memory) Complete(ctx context.Context, key, token string, status int, ttl time.Duration) error
Complete records successful processing only for the current ownership token.
type Record ¶
type Record struct {
Fingerprint string `json:"fingerprint"`
Token string `json:"token"`
State State `json:"state"`
Status int `json:"status"`
Expires time.Time `json:"expires"`
}
Record contains persisted processing or event metadata.
type Store ¶
type Store interface {
Begin(context.Context, string, string, time.Duration) (Record, error)
Complete(context.Context, string, string, int, time.Duration) error
Fail(context.Context, string, string, time.Duration) error
Renew(context.Context, string, string, time.Duration) error
}
Store defines atomic lease-based idempotency transitions.