Current collected state Current
Observed since 20 Oct, 22:00 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Postgres-backed sliding-window rate limiter. Sliding-window per-key buckets. No Redis required.
Postgres-backed sliding-window rate limiter. Sliding-window per-key buckets. Multi-window in parallel (1m + 1h + 1d). No Redis required.
import { RateLimiter, makePrismaStore } from "@021.is/spine-ratelimit";
const limiter = new RateLimiter({ store: makePrismaStore(prisma) });
// On every API request:
await limiter.hit({
subject: `api-key:${keyId}`,
limits: [
{ window: "1m", max: 60 },
{ window: "1d", max: 100_000 },
],
}); // throws RateLimitedException → spine-errors maps to 429 + Retry-After
model RateLimitBucket {
subject String
window String
bucketStart DateTime
count Int @default(0)
@@id([subject, window, bucketStart])
}
UPSERT + increment per (subject, window, bucketStart). Postgres guarantees concurrency safety.hit() checks 1m AND 1d limits at once.RateLimitedException.retryAfterSec reflects the tightest window — the one that has the least time until reset.import { makeMemoryStore } from "@021.is/spine-ratelimit";
const limiter = new RateLimiter({ store: makeMemoryStore() });
Download counts and popularity will appear here as the collector receives them.
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 22:00 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:15e60cd4a0a6134ff70c423ef9ed1cba77b1590eee7cd3ea244d245c19c7642e