On this page

TypeScript Types

Complete TypeScript type definitions for hitlimit.

HitLimitOptions

Main configuration options for the hitlimit function.

interface HitLimitOptions<TRequest = any> {
  /** Maximum requests per window */
  limit?: number

  /** Time window (e.g., '1m', '1h', 60000) */
  window?: string | number

  /** Key extraction function */
  key?: (req: TRequest) => string | Promise<string>

  /** Tiered rate limits by tier name */
  tiers?: Record<string, { limit: number; window?: string | number }>

  /** Resolve tier name per request */
  tier?: (req: TRequest) => string | Promise<string>

  /** Custom error response body */
  response?: object | ((info: HitLimitInfo) => object)

  /** Rate limit response headers config */
  headers?: HeadersConfig

  /** Storage backend */
  store?: HitLimitStore

  /** Handler called when the store throws */
  onStoreError?: (err: unknown, req: TRequest) => void

  /** Skip rate limiting for certain requests */
  skip?: (req: TRequest) => boolean | Promise<boolean>

  /** Logger for internal events */
  logger?: { warn(msg: string): void }

  /** Ban configuration */
  ban?: { threshold: number; duration: string | number }

  /** Group identifier for shared rate limits */
  group?: string | ((req: TRequest) => string)
}

HeadersConfig

interface HeadersConfig {
  /** RateLimit-* headers (IETF draft) */
  standard?: boolean

  /** X-RateLimit-* legacy headers */
  legacy?: boolean

  /** Retry-After header on 429 responses */
  retryAfter?: boolean
}

HitLimitInfo

Rate limit state returned with each response.

interface HitLimitInfo {
  limit: number
  remaining: number
  resetIn: number    // seconds until window resets
  resetAt: number    // unix timestamp (ms)
  key: string
  tier?: string
  banned?: boolean
  banExpiresAt?: number
  violations?: number
  group?: string
}

HitLimitStore

Interface for rate limit storage backends.

interface HitLimitStore {
  hit(key: string, windowMs: number, limit: number): Promise<StoreResult> | StoreResult
  reset(key: string): Promise<void> | void
  shutdown?(): Promise<void> | void
}

interface StoreResult {
  count: number
  resetAt: number
}

Store Options

SqliteStoreOptions

interface SqliteStoreOptions {
  /** Path to SQLite database file (default: ':memory:') */
  path?: string
}

RedisStoreOptions

interface RedisStoreOptions {
  /** Redis connection URL */
  url?: string

  /** Key prefix (default: 'hitlimit:') */
  keyPrefix?: string
}

Augmented Request

The request object is augmented with rate limit info:

interface Request {
  rateLimit?: {
    limit: number
    remaining: number
    resetAt: number
  }
}

Usage Example

import type { HitLimitOptions, HitLimitStore } from '@joint-ops/hitlimit'

const options: HitLimitOptions = {
  limit: 100,
  window: '1m',
  headers: { standard: true }
}

const customStore: HitLimitStore = {
  hit(key, windowMs) { /* ... */ },
  reset(key) { /* ... */ }
}