/**
* Rate limiting utilities for GitHub API
*/
export interface RateLimitInfo {
limit: number;
remaining: number;
resetAt: number;
}
/**
* Extracts rate limit info from GitHub GraphQL response headers
* @param headers - Response headers
* @returns Rate limit information
*/
export function extractRateLimit(headers: any): RateLimitInfo | null {
const limit = headers?.['x-ratelimit-limit'];
const remaining = headers?.['x-ratelimit-remaining'];
const reset = headers?.['x-ratelimit-reset'];
if (limit && remaining !== undefined && reset) {
return {
limit: parseInt(limit, 10),
remaining: parseInt(remaining, 10),
resetAt: parseInt(reset, 10),
};
}
return null;
}
/**
* Checks if we're approaching rate limit and should wait
* @param rateLimit - Current rate limit info
* @param threshold - Remaining requests threshold (default: 10)
* @returns True if we should wait
*/
export function shouldWaitForRateLimit(
rateLimit: RateLimitInfo | null,
threshold: number = 10
): boolean {
if (!rateLimit) return false;
return rateLimit.remaining <= threshold;
}
/**
* Calculates wait time until rate limit resets
* @param rateLimit - Rate limit info
* @returns Milliseconds to wait, or 0 if no wait needed
*/
export function getWaitTime(rateLimit: RateLimitInfo | null): number {
if (!rateLimit) return 0;
const now = Math.floor(Date.now() / 1000);
const waitSeconds = Math.max(0, rateLimit.resetAt - now);
return waitSeconds * 1000;
}
/**
* Sleeps for specified milliseconds
* @param ms - Milliseconds to sleep
*/
export function sleep(ms: number): Promise<void> {
return new Promise((resolve) => setTimeout(resolve, ms));
}