UNPKG

@adonisjs/limiter

Version:

Rate limiting package for AdonisJS framework

104 lines (103 loc) 3.38 kB
import { type Limiter } from './limiter.ts'; import { type LimiterResponse } from './response.ts'; import { type ThrottleException } from './errors.ts'; /** * Manages multiple limiters and executes operations across them. * Useful for applying rate limits across multiple dimensions simultaneously * (e.g., per user and per IP). */ export declare class MultiLimiter { #private; constructor(limiters: { key: string | number; limiter: Limiter; }[]); /** * Returns the list of configured limiters with their keys. */ list(): { key: string | number; limiter: Limiter; }[]; /** * Consumes one request across all limiters sequentially. * Throws a ThrottleException if any limiter exceeds its rate limit. * * @example * ```ts * const multi = limiter.multi([ * { key: 'user:123', requests: 100, duration: '1 hour' }, * { key: 'ip:192.168.1.1', requests: 1000, duration: '1 hour' } * ]) * * const responses = await multi.consume() * ``` */ consume(): Promise<LimiterResponse[]>; /** * Increments the consumed request count across all limiters. * Does not throw when limits are reached. */ increment(): Promise<LimiterResponse[]>; /** * Decrements the consumed request count across all limiters. * Will not decrement below zero. */ decrement(): Promise<LimiterResponse[]>; /** * Retrieves the current rate limit state for all limiters. */ get(): Promise<(LimiterResponse | null)[]>; /** * Sets the number of consumed requests for all limiters. * * @param requests - Number of requests consumed * @param duration - Optional duration in seconds or time expression */ set(requests: number, duration?: string | number): Promise<LimiterResponse[]>; /** * Deletes all limiter keys, resetting their rate limit states. */ delete(): Promise<boolean[]>; /** * Attempts to consume requests across all limiters and execute the callback if successful. * Returns undefined if any rate limit is exceeded. * * @param callback - Function to execute if all rate limits allow * * @example * ```ts * const result = await multi.attempt(async () => { * return await performOperation() * }) * * if (!result) { * console.log('Rate limit exceeded on one or more limiters') * } * ``` */ attempt<T>(callback: () => T | Promise<T>): Promise<T | undefined>; /** * Executes the callback and penalizes on failure by consuming requests across all limiters. * Useful for rate limiting failed operations across multiple dimensions. * * - Returns error if any rate limit is exhausted * - Executes callback if all limiters have available requests * - Increments counters and blocks keys on callback failure * - Resets all keys on callback success * * @param callback - Function to execute * * @example * ```ts * const [error, result] = await multi.penalize(async () => { * return await attemptLogin(credentials) * }) * * if (error) { * throw error * } * ``` */ penalize<T>(callback: () => T | Promise<T>): Promise<[null, T] | [ThrottleException, null]>; }