UNPKG

oss-ratelimit

Version:

Flexible rate limiting library with Redis for TypeScript applications

74 lines (69 loc) 2.46 kB
import { RedisClientType } from 'redis'; type TimeWindow = `${number} ms` | `${number} s` | `${number} m` | `${number} h` | `${number} d`; interface FixedWindowOptions { interval: number; limit: number; } interface SlidingWindowOptions { interval: number; limit: number; } interface TokenBucketOptions { refillRate: number; interval: number; limit: number; } interface RatelimitResponse { success: boolean; limit: number; remaining: number; reset: number; retryAfter?: number; pending?: number; throughput?: number; } interface RatelimitConfig { redis: RedisClientType | Promise<RedisClientType>; limiter: LimiterType; prefix?: string; analytics?: boolean; timeout?: number; ephemeralCache?: boolean; ephemeralCacheTTL?: number; } type LimiterType = FixedWindowOptions | SlidingWindowOptions | TokenBucketOptions; declare class Ratelimit { private redisPromise; private limiter; private limiterType; private prefix; private analytics; private timeout; private ephemeralCache?; constructor(config: RatelimitConfig); private getRedis; limit(identifier: string): Promise<RatelimitResponse>; private applySlidingWindowLimit; private applyFixedWindowLimit; private applyTokenBucketLimit; block(identifier: string, maxWaitMs?: number): Promise<RatelimitResponse>; reset(identifier: string): Promise<void>; } declare class RatelimitError extends Error { constructor(message: string); } declare const fixedWindow: (limit: number, window: TimeWindow) => FixedWindowOptions; declare const slidingWindow: (limit: number, window: TimeWindow) => SlidingWindowOptions; declare const tokenBucket: (refillRate: number, interval: TimeWindow, limit: number) => TokenBucketOptions; declare const getRedisSingleClient: (envRedisKey: string) => RedisClientType; interface CreateRateLimiterProps extends Omit<RatelimitConfig, 'redis'> { } declare const createSingletonRateLimiter: (props?: CreateRateLimiterProps & { limiter?: LimiterType; envRedisKey?: string; }) => Ratelimit; declare const createRateLimiter: (redis: RedisClientType, props?: CreateRateLimiterProps & { limiter?: LimiterType; envRedisKey?: string; }) => Ratelimit; export { type CreateRateLimiterProps, Ratelimit, RatelimitError, createRateLimiter, createSingletonRateLimiter, fixedWindow, getRedisSingleClient, slidingWindow, tokenBucket };