Catalog npm
PACKAGE EXPLORERView in registry

@021.is/spine-ratelimit

npm

Postgres-backed sliding-window rate limiter. Sliding-window per-key buckets. No Redis required.

Versions collected2
Direct dependencies1From release 0.4.3
Last observed20 Oct, 22:00 UTC

README

Current package documentation

@021.is/spine-ratelimit

Postgres-backed sliding-window rate limiter. Sliding-window per-key buckets. Multi-window in parallel (1m + 1h + 1d). No Redis required.

Use

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

Prisma schema

model RateLimitBucket {
  subject     String
  window      String
  bucketStart DateTime
  count       Int      @default(0)
  @@id([subject, window, bucketStart])
}

Behavior

  • Atomic UPSERT + increment per (subject, window, bucketStart). Postgres guarantees concurrency safety.
  • Multi-window in parallel: a single hit() checks 1m AND 1d limits at once.
  • RateLimitedException.retryAfterSec reflects the tightest window — the one that has the least time until reset.
  • Subject isolation: different subjects share zero state.

In-memory adapter (for tests)

import { makeMemoryStore } from "@021.is/spine-ratelimit";
const limiter = new RateLimiter({ store: makeMemoryStore() });

Why Postgres, not Redis

  • One less infrastructure component
  • Atomic guarantees come free with Postgres
  • For typical 021 workloads (≤ 1k req/s per app), Postgres handles it without breaking a sweat
  • Cleanup: prune buckets older than your widest window via a daily cron

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Versions 2

Collected releases
VersionPublishedDirect dependenciesOpen version
0.4.3Registry latest28 May 20261
0.4.028 May 20261

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Repository

PENDING
021is/spine-ts

Shared repository data · GitHub

License detected in repository
Not collected

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 22:00 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:15e60cd4a0a6134ff70c423ef9ed1cba77b1590eee7cd3ea244d245c19c7642e