Appearance
API Reference
Complete API reference for @shinijs/rate-limit.
Module
RateLimitModule
The main module that provides rate limiting functionality.
Import:
typescript
import { RateLimitModule } from '@shinijs/rate-limit';Usage:
Basic:
typescript
@Module({
imports: [RateLimitModule.forRoot()],
})
export class AppModule {}With custom logger via token:
typescript
@Module({
imports: [
RateLimitModule.forRoot({
loggerToken: YOUR_LOGGER_TOKEN, // Inject logger from DI container
}),
],
})
export class AppModule {}With logger instance:
typescript
@Module({
imports: [
RateLimitModule.forRoot({
logger: customLoggerInstance, // Provide logger directly
}),
],
})
export class AppModule {}Exports:
RateLimitService- The main rate limiting serviceRateLimitGuard- Guard for route protectionRateLimitInterceptor- Interceptor for adding headers
Service
RateLimitService
The core service for rate limiting operations.
Import:
typescript
import { RateLimitService } from '@shinijs/rate-limit';Methods
checkRateLimit(key: string, options: RateLimitOptions): Promise<RateLimitResult>
Checks if a request is allowed based on the rate limit configuration.
Parameters:
key(string) - Unique identifier for the rate limit (e.g., user ID, IP address, API key)options(RateLimitOptions) - Rate limit configurationrequests(number) - Maximum number of requests allowedwindow(string) - Time window (e.g., '1m', '1h', '1d')
Returns: Promise<RateLimitResult>
typescript
{
allowed: boolean; // Whether the request is allowed
remaining: number; // Number of requests remaining in current window
resetTime: number; // Timestamp (ms) when the limit resets
totalHits: number; // Total number of requests in current window
}Example:
typescript
const result = await rateLimitService.checkRateLimit('user:123', {
requests: 100,
window: '1h'
});
if (!result.allowed) {
throw new Error('Rate limit exceeded');
}decrementRateLimit(key: string): Promise<void>
Decrements the rate limit counter for a given key. Useful for rolling back the count when a request fails.
Parameters:
key(string) - The rate limit key to decrement
Returns: Promise<void>
Example:
typescript
try {
await processPayment();
} catch (error) {
// Roll back the rate limit count
await rateLimitService.decrementRateLimit('payment:user:123');
throw error;
}healthCheck(): Promise<boolean>
Checks if the Redis connection is healthy and operational.
Returns: Promise<boolean>
trueif Redis is connected and respondingfalseif Redis is not initialized, disconnected, or unhealthy
Example:
typescript
const isHealthy = await rateLimitService.healthCheck();
console.log(`Redis status: ${isHealthy ? 'connected' : 'disconnected'}`);Decorators
@RateLimit(options: RateLimitOptions)
Decorator to apply rate limiting to a route handler.
Import:
typescript
import { RateLimit } from '@shinijs/rate-limit';Parameters:
options(RateLimitOptions)requests(number) - Maximum number of requests allowedwindow(string) - Time window format:<number><unit>where unit iss,m,h, ord
Usage:
typescript
@Controller('api')
export class ApiController {
@Get('data')
@RateLimit({ requests: 100, window: '1m' })
getData() {
return { data: 'protected' };
}
}Guards
RateLimitGuard
A NestJS guard that enforces rate limits based on the @RateLimit decorator.
Import:
typescript
import { RateLimitGuard } from '@shinijs/rate-limit';Usage:
Per-controller:
typescript
@Controller('api')
@UseGuards(RateLimitGuard)
export class ApiController {
@Get('data')
@RateLimit({ requests: 100, window: '1m' })
getData() {
return { data: 'protected' };
}
}Globally:
typescript
import { APP_GUARD } from '@nestjs/core';
@Module({
providers: [
{
provide: APP_GUARD,
useClass: RateLimitGuard,
},
],
})
export class AppModule {}Behavior:
- Reads rate limit configuration from
@RateLimitdecorator metadata - Generates rate limit key based on IP address and route path
- Throws
HttpExceptionwith status 429 (Too Many Requests) when limit is exceeded - Logs errors using the configured logger
Interceptors
RateLimitInterceptor
A NestJS interceptor that enforces rate limits and adds rate limit information to response headers.
Import:
typescript
import { RateLimitInterceptor } from '@shinijs/rate-limit';Usage:
Per-controller:
typescript
@Controller('api')
@UseInterceptors(RateLimitInterceptor)
export class ApiController {
@Get('data')
@RateLimit({ requests: 100, window: '1m' })
getData() {
return { data: 'protected' };
}
}Per-route:
typescript
@Controller('api')
export class ApiController {
@Get('data')
@UseInterceptors(RateLimitInterceptor)
@RateLimit({ requests: 100, window: '1m' })
getData() {
return { data: 'protected' };
}
}Response Headers: The interceptor adds the following headers to the response:
X-RateLimit-Limit- Maximum number of requests allowedX-RateLimit-Remaining- Number of requests remainingX-RateLimit-Reset- Timestamp when the limit resets
Example Response:
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1699564800000Interfaces
RateLimitOptions
Configuration options for rate limiting.
typescript
interface RateLimitOptions {
requests: number; // Maximum requests allowed
window: string; // Time window (e.g., '1m', '5m', '1h', '1d')
}RateLimitResult
Result returned from rate limit checks.
typescript
interface RateLimitResult {
allowed: boolean; // Whether the request is allowed
remaining: number; // Requests remaining in current window
resetTime: number; // Timestamp (ms) when the limit resets
totalHits: number; // Total requests in current window
}IRateLimit
Interface for rate limiting implementations.
typescript
interface IRateLimit {
checkRateLimit(key: string, options: RateLimitOptions): Promise<RateLimitResult>;
decrementRateLimit(key: string): Promise<void>;
healthCheck(): Promise<boolean>;
}Constants
RATE_LIMIT_METADATA
Symbol used to store rate limit metadata on route handlers.
typescript
export const RATE_LIMIT_METADATA = Symbol('RATE_LIMIT_METADATA');RATE_LIMIT_LOGGER
Injection token for providing a custom logger.
Import:
typescript
import { RATE_LIMIT_LOGGER } from '@shinijs/rate-limit';Usage:
typescript
@Module({
providers: [
{
provide: RATE_LIMIT_LOGGER,
useClass: CustomLogger,
},
],
})
export class AppModule {}Error Handling
Rate Limit Exceeded
When a rate limit is exceeded, the guard throws an HttpException:
Status Code: 429 (Too Many Requests)
Response Body:
json
{
"statusCode": 429,
"message": "Rate limit exceeded"
}Example Error Handling:
typescript
import { ExceptionFilter, Catch, ArgumentsHost, HttpException } from '@nestjs/common';
@Catch(HttpException)
export class RateLimitExceptionFilter implements ExceptionFilter {
catch(exception: HttpException, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse();
const status = exception.getStatus();
if (status === 429) {
response.status(status).json({
statusCode: status,
message: 'Too many requests. Please try again later.',
timestamp: new Date().toISOString(),
});
}
}
}