import { WebContext, WebMiddleware } from '@aomex/web'; declare abstract class RateLimitStore { abstract getAndSet(data: { key: string; maxRequest: number; duration: number; }): Promise; protected getMicroTime(): number; } interface RateLimitState { /** * 标识 */ key: string; /** * 重置的具体时间戳,单位:`us` */ resetAt: number; /** * 剩余可用请求次数 */ remaining: number; } interface RateLimitOptions { /** * 存储和共享请求记录。默认值:`RateLimitMemoryStore` */ store?: RateLimitStore; /** * 限速时间周期。单位:`ms`。默认值:`3600 * 1000`(1小时) */ duration?: number; /** * 一个客户端(根据id字段)在一个时间周期内的最大可请求数量 */ maxRequest?: number; /** * 请求客户端的身份识别信息,默认使用客户端的IP地址。如果返回`false`,则代表该请求不需要限速 */ id?: (ctx: WebContext) => string | false; /** * 被限速(状态码:429)时响应的报错信息 */ errorMessage?: string; /** * 相关的响应头部名称。如果传入`false`,则代表不设置 */ headers?: false | { /** * 指定时间段内剩下的请求次数。默认名称:`X-RateLimit-Remaining` */ remaining?: string; /** * 以UTC秒为单位,限流重置之前的剩余时间。默认名称:`X-RateLimit-Reset` */ reset?: string; /** * 指定时间内允许的最大请求次数。默认名称:`X-RateLimit-Limit` */ total?: string; }; /** * 白名单,不做请求频率限制 */ allowList?: (ctx: WebContext) => boolean | Promise; /** * 黑名单,直接抛出`403`状态码 */ denyList?: (ctx: WebContext) => boolean | Promise; } declare const rateLimit: (options?: RateLimitOptions) => WebMiddleware; export { type RateLimitOptions, type RateLimitState, RateLimitStore, rateLimit };