Review API rate-limit headers

src/rate-limit-headers.tsTypeScript
@@ -0,0 +1,27 @@
1+export interface RateLimitDecision {
2+ readonly actorId: string;
3+ readonly limit: number;
4+ readonly usedBeforeRequest: number;
5+ readonly allowed: boolean;
6+ readonly resetAtMs: number;
7+}
8+
9+export function buildRateLimitHeaders(
10+ decision: RateLimitDecision,
11+ nowMs: number,
12+): Readonly<Record<string, string>> {
13+ const headers: Record<string, string> = {
14+ "RateLimit-Limit": String(decision.limit),
15+ "RateLimit-Remaining": String(
16+ decision.limit - decision.usedBeforeRequest,
17+ ),
18+ "RateLimit-Reset": String(decision.resetAtMs),
19+ "X-RateLimit-Actor": decision.actorId,
20+ };
21+
22+ if (!decision.allowed && decision.resetAtMs > nowMs) {
23+ headers["Retry-After"] = String(decision.resetAtMs);
24+ }
25+
26+ return headers;
27+}