import { Context, MiddlewareHandler } from 'hono';

interface KV {
    setItem(key: string, value: string, expiresIn?: number): Promise<void>;
    getItem(key: string): Promise<string | null>;
    removeItem(key: string): Promise<void>;
}
interface RateLimitOptions {
    kv: KV;
    rate: number;
    capacity: number;
    requested?: number;
    keyPrefix?: string;
    expiresIn?: number;
    getIdentifier?: (c: Context) => string | undefined;
    onRateLimited?: (c: Context, retryAfter: number) => Response | Promise<Response>;
    skip?: (c: Context) => boolean | Promise<boolean>;
}
interface RateLimitResult {
    allowed: boolean;
    remaining: number;
    limit: number;
    reset: number;
    retryAfter?: number;
}
declare function checkRateLimit(kv: KV, identifier: string, options: {
    rate: number;
    capacity: number;
    requested?: number;
    keyPrefix?: string;
    expiresIn?: number;
}): Promise<RateLimitResult>;
declare function rateLimit(options: RateLimitOptions): MiddlewareHandler;

export { type KV, type RateLimitOptions, type RateLimitResult, checkRateLimit, rateLimit };
