interface StorageAdapter { get(key: string): Promise; set(key: string, value: string, ttlMs: number): Promise; increment(key: string, ttlMs: number): Promise; delete(key: string): Promise; } type DurationString = `${number}${"s" | "m" | "h" | "d"}`; type RateString = `${number}/${"s" | "m" | "h"}`; type IdentifierFn = (request: Request) => string | Promise; interface AlgorithmState { allowed: boolean; remaining: number; reset: number; } interface RateLimitAlgorithm { kind: "sliding-window" | "fixed-window" | "token-bucket" | "leaky-bucket"; limit: number; windowMs: number; evaluate(storage: StorageAdapter, key: string, nowMs: number): Promise; } interface RateLimitTier { name: string; algorithm: RateLimitAlgorithm; } interface RateLimitResult { success: boolean; status: 200 | 429; reason: "ok" | "rate_limited" | "storage_error"; headers: Headers; meta: { remaining: number; reset: number; limit: number; tier: string | null; }; } interface RateLimitConfig { storage: StorageAdapter; algorithm?: RateLimitAlgorithm; tiers?: RateLimitTier[]; identifier?: IdentifierFn; prefix?: string; failOpen?: boolean; } interface RateLimiter { check(request: Request): Promise; } export type { DurationString as D, RateLimitAlgorithm as R, StorageAdapter as S, RateLimitConfig as a, RateLimitResult as b, RateLimiter as c, RateString as d };