import type { RateLimitConfig, ESPName } from '../types/emailServiceSelector.type.js';
/**
 * Défauts embarqués par ESP, exprimés en envois par seconde.
 *
 * - resend   : 10/s (limite officielle Resend)
 * - brevo    : 100/s (conservative, plan business)
 * - postmark : 10/s (safe default Postmark)
 * - nodemailer : 5/s (prudent SMTP, dépend fortement du fournisseur)
 * - emailserviceviewer / local : 1000/s (viewer de test — pas de vraie limite)
 *
 * Ces défauts s'appliquent UNIQUEMENT si `config.rateLimit` est absent. Dès
 * qu'une valeur `rateLimit` est fournie par le consommateur, elle remplace
 * complètement le défaut (pas de merge partiel).
 */
export declare const RATE_LIMIT_DEFAULTS: Record<ESPName, RateLimitConfig>;
/**
 * Token bucket minimal, in-memory, **par instance**. Chaque instance
 * `EmailServiceSelector` créée par le consommateur a son propre bucket :
 * pas de synchronisation cross-process, pas de persistance. Au redémarrage,
 * le bucket repart plein.
 *
 * Algorithme :
 * - capacity tokens au démarrage (autorise un petit burst initial)
 * - refill continu à `rate` tokens/s (calcul paresseux à chaque acquire)
 * - acquire() attend le temps nécessaire si aucun token dispo, via setTimeout
 *   (zéro CPU spin)
 *
 * Retourne le nombre de ms attendues — utile pour le logger.
 */
export declare class TokenBucket {
    private readonly rate;
    private readonly capacity;
    private tokens;
    private lastRefill;
    constructor(rate: number, capacity: number);
    private refill;
    acquire(): Promise<number>;
}
/**
 * Compose plusieurs token buckets — utile quand on veut cumuler
 * `perSecond` et `perMinute`. `acquire()` attend sur le bucket le plus
 * restrictif.
 */
export declare class CompositeBucket {
    private readonly buckets;
    constructor(buckets: TokenBucket[]);
    acquire(): Promise<number>;
}
/**
 * Construit un rate limiter à partir d'un `Config`. Retourne `null` si
 * aucun rate limit n'est applicable (ne devrait pas arriver avec les
 * défauts embarqués, sauf ESP inconnu).
 */
export declare function createRateLimiter(esp: ESPName, override?: RateLimitConfig): TokenBucket | CompositeBucket | null;
