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