import type { EmailDriver, Result } from "../types.mjs"; /** Backoff strategies. * - `exponential` — `initialDelay * 2^attempt` (default). * - `constant` — `initialDelay` every time. * - `exponential-jitter` — exponential with ±50% uniform noise. * - `full-jitter` — random in `[0, exponential]` (AWS recommendation). * - `decorrelated-jitter` — `random(initialDelay, prev * 3)`. */ export type RetryBackoff = "exponential" | "constant" | "exponential-jitter" | "full-jitter" | "decorrelated-jitter"; /** Options for `withRetry`. All numeric values are milliseconds unless * noted. `respectRetryAfter` honors `error.status === 429` with the * matching `Retry-After` surfaced via `error.cause`. */ export interface RetryOptions { /** Number of *retry* attempts on top of the initial send. Default: 3. */ retries?: number; /** Initial backoff delay. Default: 250ms. */ initialDelay?: number; /** Maximum backoff delay between attempts. Default: 10_000ms. */ maxDelay?: number; /** Backoff strategy. See `RetryBackoff`. */ backoff?: RetryBackoff; /** Honor a `Retry-After` seconds value when present on 429. Default: true. */ respectRetryAfter?: boolean; /** Override default retryability — by default only `error.retryable === true`. */ shouldRetry?: (error: NonNullable["error"]>, attempt: number) => boolean; /** Route exhausted sends to this driver (dead-letter). Original error * is preserved on `ctx.meta.deadLetterReason`. */ deadLetter?: EmailDriver; /** Injected for tests. Default: `setTimeout`. */ sleep?: (ms: number, signal?: AbortSignal) => Promise; /** Injected for deterministic jitter in tests. Default: `Math.random`. */ random?: () => number; } /** Wrap a driver so every send is retried on transient failures. Returns a * regular `EmailDriver` — compose it with `fallback`, `roundRobin`, etc. * * ```ts * const driver = withRetry(resend({ apiKey }), { retries: 3 }) * ``` */ export declare function withRetry(driver: EmailDriver, options?: RetryOptions): EmailDriver;