https://github.com/OrJDev/trpc-limiter
Open Source Rate Limiter Middleware For tRPC. Supporting Upstash, Memory Store And Much More
https://github.com/OrJDev/trpc-limiter
Last synced: about 1 year ago
JSON representation
Open Source Rate Limiter Middleware For tRPC. Supporting Upstash, Memory Store And Much More
- Host: GitHub
- URL: https://github.com/OrJDev/trpc-limiter
- Owner: OrJDev
- Created: 2023-01-03T11:39:49.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2024-07-15T15:29:50.000Z (almost 2 years ago)
- Last Synced: 2025-05-05T12:05:12.509Z (about 1 year ago)
- Language: TypeScript
- Homepage:
- Size: 374 KB
- Stars: 146
- Watchers: 3
- Forks: 8
- Open Issues: 3
-
Metadata Files:
- Readme: README.MD
- Funding: .github/FUNDING.yml
Awesome Lists containing this project
README
# tRPC Limiter
An open source, tRPC rate limiter middleware.
## Adapters
- [Redis](https://github.com/OrJDev/trpc-limiter/tree/main/packages/redis)
- [Upstash](https://github.com/OrJDev/trpc-limiter/tree/main/packages/upstash)
- [Memory Store](https://github.com/OrJDev/trpc-limiter/tree/main/packages/memory)
- [Custom](https://github.com/OrJDev/trpc-limiter/tree/main/packages/core)
This project was created because of this tRPC [issue](https://github.com/trpc/trpc/issues/3227) opened by the creator of tRPC.
## Note
Make sure to use the `next` version of tRPC. Meaning when installing a tRPC related package, make sure to install the `@next` version.
```bash
pnpm install @trpc/server@next @trpc/client@next ...
```
```ts
import {
createTRPCStoreLimiter,
defaultFingerPrint,
} from '@trpc-limiter/memory'
// or
import {
createTRPCUpstashLimiter,
defaultFingerPrint,
} from '@trpc-limiter/upstash'
// or
import { createTrpcRedisLimiter, defaultFingerPrint } from '@trpc-limiter/redis'
```
## Example (Redis)
```ts
import { initTRPC } from '@trpc/server'
import { type NextApiRequest } from 'next'
import { createTrpcRedisLimiter, defaultFingerPrint } from '@trpc-limiter/redis'
import { createClient } from 'redis'
export const redis = createClient({
password: '...',
socket: {
host: '...',
port: 18382,
},
disableOfflineQueue: true,
})
type Context = {
req: NextApiRequest
}
const t = initTRPC.context().create()
const rateLimiter = createTrpcRedisLimiter({
fingerprint: (ctx) => defaultFingerPrint(ctx.req),
message: (hitInfo) => `Too many requests, please try again later. ${hitInfo}`,
max: 15,
windowMs: 10000,
redisClient: redis,
})
export const rateLimitedProcedure = t.procedure.use(rateLimiter)
```