export interface RateLimiterConfig {
    maxRequestsPerWindow: number;
    windowMs: number;
    maxConcurrent?: number;
    retryAfterMs?: number;
    name?: string;
}
export interface RateLimitInfo {
    remainingRequests: number;
    resetTime: Date;
    isLimited: boolean;
    retryAfter?: number;
}
/**
 * Token bucket rate limiter with sliding window
 */
export declare class RateLimiter {
    private logger;
    private requestTimestamps;
    private currentConcurrent;
    private readonly config;
    constructor(config: RateLimiterConfig);
    /**
     * Check if a request can be made without hitting rate limits
     */
    canMakeRequest(): RateLimitInfo;
    /**
     * Wait for rate limit if necessary and execute request
     */
    executeWithRateLimit<T>(fn: () => Promise<T>, options?: {
        priority?: 'high' | 'normal' | 'low';
        timeout?: number;
    }): Promise<T>;
    /**
     * Wait for an available request slot
     */
    private waitForSlot;
    /**
     * Record a request timestamp
     */
    private recordRequest;
    /**
     * Remove timestamps outside the current window
     */
    private cleanupOldTimestamps;
    /**
     * Calculate retry after time based on current state
     */
    private calculateRetryAfter;
    /**
     * Get current rate limiter statistics
     */
    getStats(): {
        name: string;
        requestsInWindow: number;
        currentConcurrent: number;
        remainingRequests: number;
        isLimited: boolean;
    };
    /**
     * Reset the rate limiter
     */
    reset(): void;
}
/**
 * Create rate limiters for different services
 */
export declare const rateLimiters: {
    perplexity: RateLimiter;
    fmp: RateLimiter;
    supabase: RateLimiter;
};
/**
 * Decorator for rate-limited methods
 */
export declare function RateLimited(limiterName: keyof typeof rateLimiters): (target: any, propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
//# sourceMappingURL=rate-limiter.d.ts.map