@adonisjs/limiter
Version:
Rate limiting package for AdonisJS framework
104 lines (103 loc) • 3.38 kB
TypeScript
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]>;
}