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+
}