oss-ratelimit
Version:
Flexible rate limiting library with Redis for TypeScript applications
74 lines (69 loc) • 2.46 kB
TypeScript
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 };