Review a distributed rate limiter

src/rate-limit-types.tsTypeScript
@@ -0,0 +1,38 @@
1+export interface BucketState {
2+ tokens: number;
3+ updatedAtMilliseconds: number;
4+}
5+
6+export interface AtomicBucketEvaluation {
7+ allowed: boolean;
8+ retryAfterMilliseconds: number;
9+}
10+
11+export interface DistributedRateStore {
12+ get(key: string): Promise<BucketState | null>;
13+ set(key: string, state: BucketState, ttlMilliseconds: number): Promise<void>;
14+ timeMilliseconds(): Promise<number>;
15+ evaluateAtomically(input: {
16+ key: string;
17+ capacity: number;
18+ refillPerMillisecond: number;
19+ cost: number;
20+ ttlMilliseconds: number;
21+ }): Promise<AtomicBucketEvaluation>;
22+}
23+
24+export interface RateLimitRequest {
25+ tenantId: string;
26+ subjectId: string;
27+ routeTemplate: string;
28+ policy: "standard" | "credential";
29+}
30+
31+export type RateLimitDecision =
32+ | { allowed: true }
33+ | { allowed: false; status: 429; retryAfterSeconds: number }
34+ | { allowed: false; status: 503 };
35+
36+export interface RateLimitTelemetry {
37+ storeUnavailable(policy: RateLimitRequest["policy"]): void;
38+}