Generic Rate Limiter for JavaScript/TypeScript.
pnpm add ratelimit-sdk
BYOK(Bring Your Own Key-Value Store) Redis,Valkey,Upstash,memory,etc.
import { Ratelimit } from "ratelimit-sdk";
import Redis from "ioredis";
const redisClient = new Redis("redis://localhost:6379");
const ratelimiter = new Ratelimit("api", {
kv: redisClient,
limiter: Ratelimit.fixedWindow(50, "10s"), // 50 requests per 10 seconds
});
// Use the rate limiter
const result = await ratelimiter.limit("user-123");
import { Ratelimit } from "ratelimit-sdk";
import { createClient } from "redis";
const redisClient = createClient({
url: "redis://localhost:6379",
});
await redisClient.connect();
const ratelimiter = new Ratelimit("api", {
kv: redisClient,
limiter: Ratelimit.fixedWindow(100, "1m"), // 100 requests per minute
});
// Use the rate limiter
const userId = "user-123";
const result = await ratelimiter.limit(userId);
console.log(result);
import { Ratelimit } from "ratelimit-sdk";
import { Redis } from "@upstash/redis";
const ratelimiter = new Ratelimit("api-ratelimiter", {
kv: Redis.fromEnv(),
limiter: Ratelimit.fixedWindow(50, "10s"), // 50 requests per 10 seconds
});
const userId = "user-123";
const result = await ratelimiter.limit(userId);
console.log(result);
import { Ratelimit } from "ratelimit-sdk";
import { createLocalKv } from "ratelimit-sdk/utils";
const localKV = createLocalKv();
const ratelimiter = new Ratelimit("api-ratelimiter", {
kv: localKV,
limiter: Ratelimit.fixedWindow(5, "1m"),
});
// Use the rate limiter
const userId = "user-123";
const result = await ratelimiter.limit(userId);
console.log(result);
The local KV store is not persistent and keeps data in memory only. It is not suitable for serverless functions or any environment where your application might restart frequently. Use Redis or another persistent store for production environments.
MIT license