Wit’s server includes a flexible rate limiting middleware to protect API endpoints from abuse. The rate limiter supports multiple storage backends and provides fine-grained control over request limits.
import { rateLimit, RateLimitPresets } from 'wit/server/middleware/rate-limit';import { Hono } from 'hono';const app = new Hono();// Apply to all routesapp.use('*', rateLimit({ windowMs: 60 * 1000, // 1 minute max: 100, // 100 requests per minute}));// Or use presetsapp.use('/api/*', rateLimit(RateLimitPresets.standard));
By default, rate limiting is based on IP address. Customize this:
rateLimit({ windowMs: 60000, max: 100, keyGenerator: (c) => { // Rate limit by user ID if authenticated const userId = c.get('userId'); if (userId) return `user:${userId}`; // Fall back to IP return c.req.header('x-forwarded-for') || 'unknown'; },});
import { MemoryStore, setRateLimitStore } from 'wit/server/middleware/rate-limit';const store = new MemoryStore(60000); // cleanup intervalsetRateLimitStore(store);
import { RedisStore, setRateLimitStore } from 'wit/server/middleware/rate-limit';import Redis from 'ioredis';const redis = new Redis(process.env.REDIS_URL);const store = new RedisStore(redis);setRateLimitStore(store);
import { SlidingWindowStore, setRateLimitStore } from 'wit/server/middleware/rate-limit';import Redis from 'ioredis';const redis = new Redis(process.env.REDIS_URL);const store = new SlidingWindowStore(redis);setRateLimitStore(store);