feat(porch-store): store tables for rate limit + idempotency (Phase A)
(cherry picked from commit 519d4117fd0d6d0bd7d51f80bcb20de4d6294503)
This commit is contained in:
parent
4f6dc2dcfc
commit
192d451f5e
1 changed files with 24 additions and 0 deletions
24
docs/examples/porch/middleware/store.wo
Normal file
24
docs/examples/porch/middleware/store.wo
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
-- porch/middleware/store.wo — store-backed middleware tables.
|
||||
-- Two purpose-shaped @table classes for rate limiting and idempotency.
|
||||
-- Iteration 1 of the porch track.
|
||||
|
||||
-- Rate limiter: fixed-window counter.
|
||||
-- Key format: "ip:192.168.1.1" or "principal:alice"
|
||||
-- Window = start of current window in time.ticks (µs monotonic)
|
||||
@table(name: "rate_limit_counters", index: [key])
|
||||
class RateLimitCounter {
|
||||
key: Text @unique
|
||||
count: Int
|
||||
window: Int
|
||||
}
|
||||
|
||||
-- Idempotency: stored response for replay.
|
||||
-- Key format: "idem:keyheader" or "idem:keyheader:sha256(method|path|body)"
|
||||
-- Response = JSON-encoded Resp {status, headers, body} (allowlist: status, body, content-type)
|
||||
-- created_at = time.ticks when stored (µs monotonic) for lazy expiry
|
||||
@table(name: "idempotency_keys", index: [key])
|
||||
class IdempotencyKey {
|
||||
key: Text @unique
|
||||
response: Text
|
||||
created_at: Int
|
||||
}
|
||||
Loading…
Reference in a new issue