Skip to content

Configuration

Full reference for all Rate Limit Plugin options.

Basic Configuration

typescript
import { RedisModule } from '@nestjs-redisx/core';
import { RateLimitPlugin } from '@nestjs-redisx/rate-limit';

@Module({
  imports: [
    RedisModule.forRoot({
      clients: { host: 'localhost', port: 6379 },
      plugins: [
        new RateLimitPlugin({
          // Your options here
        }),
      ],
    }),
  ],
})
export class AppModule {}

Complete Options Reference

typescript
new RateLimitPlugin({
  // Algorithm Settings
  defaultAlgorithm: 'sliding-window', // 'fixed-window' | 'sliding-window' | 'token-bucket'
  defaultPoints: 100,
  defaultDuration: 60,

  // Key Settings
  keyPrefix: 'rl:',
  defaultKeyExtractor: 'ip', // 'ip' | 'user' | 'apiKey' | function

  // Response Headers
  includeHeaders: true,
  headers: {
    limit: 'X-RateLimit-Limit',
    remaining: 'X-RateLimit-Remaining',
    reset: 'X-RateLimit-Reset',
    retryAfter: 'Retry-After',
  },

  // Error Handling
  errorPolicy: 'fail-closed', // 'fail-closed' | 'fail-open'

  skip: (context) => {
    const req = context.switchToHttp().getRequest();
    return req.user?.role === 'admin';
  },

  errorFactory: (result) => {
    return new HttpException(
      `Rate limit exceeded. Retry in ${result.retryAfter}s`,
      HttpStatus.TOO_MANY_REQUESTS
    );
  },
})

Configuration by Use Case

Public API

typescript
new RateLimitPlugin({
  defaultAlgorithm: 'sliding-window',
  defaultPoints: 100,
  defaultDuration: 60,
  defaultKeyExtractor: 'ip',
  includeHeaders: true,
  errorPolicy: 'fail-closed',
})

Internal Service

typescript
new RateLimitPlugin({
  defaultAlgorithm: 'token-bucket',
  defaultPoints: 1000,
  defaultDuration: 1,  // Per second
  defaultKeyExtractor: 'apiKey',
  errorPolicy: 'fail-open',  // Availability over security
})

Premium API

typescript
new RateLimitPlugin({
  defaultAlgorithm: 'sliding-window',
  defaultPoints: 10,  // Low default
  defaultDuration: 60,
  defaultKeyExtractor: 'user',
  skip: (ctx) => {
    const req = ctx.switchToHttp().getRequest();
    return req.user?.plan === 'enterprise';
  },
})

Async Configuration

Use forRootAsync with ConfigService for environment-based configuration:

typescript
import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { RedisModule } from '@nestjs-redisx/core';
import { RateLimitPlugin } from '@nestjs-redisx/rate-limit';

@Module({
  imports: [
    RedisModule.forRootAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: (config: ConfigService) => ({
        clients: {
          host: config.get<string>('REDIS_HOST', 'localhost'),
          port: config.get<number>('REDIS_PORT', 6379),
        },
      }),
      plugins: [
        new RateLimitPlugin({
          defaultAlgorithm:
            (process.env.RATE_LIMIT_ALGORITHM as 'sliding-window' | 'fixed-window' | 'token-bucket') ||
            'sliding-window',
          defaultPoints: parseInt(process.env.RATE_LIMIT_POINTS || '100', 10),
          defaultDuration: parseInt(process.env.RATE_LIMIT_DURATION || '60', 10),
          errorPolicy: process.env.RATE_LIMIT_FAIL_OPEN === 'true' ? 'fail-open' : 'fail-closed',
        }),
      ],
    }),
  ],
})
export class AppModule {}

Environment Configuration

typescript
// config/rate-limit.config.ts
import { registerAs } from '@nestjs/config';

export default registerAs('rateLimit', () => ({
  algorithm: process.env.RATE_LIMIT_ALGORITHM || 'sliding-window',
  points: parseInt(process.env.RATE_LIMIT_POINTS || '100', 10),
  duration: parseInt(process.env.RATE_LIMIT_DURATION || '60', 10),
  errorPolicy: process.env.RATE_LIMIT_FAIL_OPEN === 'true' ? 'fail-open' : 'fail-closed',
}));
bash
# .env
RATE_LIMIT_ALGORITHM=sliding-window
RATE_LIMIT_POINTS=100
RATE_LIMIT_DURATION=60
RATE_LIMIT_FAIL_OPEN=false

Options Deep Dive

Algorithm Settings

OptionTypeDefaultDescription
defaultAlgorithmstringsliding-windowDefault algorithm
defaultPointsnumber100Requests per window
defaultDurationnumber60Window in seconds

Key Settings

OptionTypeDefaultDescription
keyPrefixstringrl:Redis key prefix
defaultKeyExtractorstring/functionipHow to identify client

Header Settings

OptionTypeDefaultDescription
includeHeadersbooleantrueAdd rate limit headers
headers.limitstringX-RateLimit-LimitMax requests header
headers.remainingstringX-RateLimit-RemainingRemaining header
headers.resetstringX-RateLimit-ResetReset timestamp header
headers.retryAfterstringRetry-AfterRetry delay header

Error Settings

OptionTypeDefaultDescription
errorPolicystringfail-closedBehavior on Redis error
skipfunctionundefinedSkip rate limiting if true
errorFactoryfunctionundefinedCustom error creator

Next Steps

Released under the MIT License.