Hey is a decentralized and permissionless social media app built with Lens Protocol 馃尶
1import { rateLimiter as rateLimit } from "hono-rate-limiter";
2import sha256 from "../utils/sha256";
3
4const getIp = (req: Request): string => {
5 const ips = (
6 req.headers.get("cf-connecting-ip") ||
7 req.headers.get("x-real-ip") ||
8 req.headers.get("x-forwarded-for") ||
9 "unknown"
10 ).split(",");
11
12 return ips[0].trim();
13};
14
15const hashedIp = (req: Request): string => sha256(getIp(req)).slice(0, 25);
16
17interface RateLimiterOptions {
18 requests: number;
19}
20
21const rateLimiter = ({ requests }: RateLimiterOptions) => {
22 return rateLimit({
23 keyGenerator: (c) => {
24 const pathHash = sha256(c.req.path).slice(0, 25);
25 const key = `rate-limit:${pathHash}:${hashedIp(c.req.raw)}`;
26 return key;
27 }, // 1 minute
28 limit: requests,
29 standardHeaders: "draft-6",
30 windowMs: 1 * 60 * 1000
31 });
32};
33
34export default rateLimiter;