diff --git a/src/lib/rate-limit.ts b/src/lib/rate-limit.ts index 1f0ebd8..c07b0d6 100644 --- a/src/lib/rate-limit.ts +++ b/src/lib/rate-limit.ts @@ -1,13 +1,9 @@ import { NextRequest, NextResponse } from "next/server"; -import { createClient } from "redis"; +import { createClient, RedisClientType } from "redis"; import { auth } from "./auth"; -const client = await createClient({ - url: process.env.REDIS_URL, -}) - .on("error", (err) => console.error("Redis client error", err)) - .connect(); -const windowSize = 60; +const WINDOW_SIZE = 60; +let client: RedisClientType | null = null; interface RateLimitData { success: boolean; @@ -16,6 +12,17 @@ interface RateLimitData { expires: number; } +async function getRedisClient() { + if (!client) { + client = createClient({ + url: process.env.REDIS_URL, + }); + client.on("error", (err) => console.error("Redis client error", err)); + await client.connect(); + } + return client; +} + // Fixed window implementation export class RateLimit { private request: NextRequest; @@ -41,10 +48,12 @@ export class RateLimit { const now = Date.now(); const seconds = Math.floor(now / 1000); - const currentWindow = Math.floor(seconds / windowSize) * windowSize; - const expireAt = currentWindow + windowSize; + const currentWindow = Math.floor(seconds / WINDOW_SIZE) * WINDOW_SIZE; + const expireAt = currentWindow + WINDOW_SIZE; try { + const client = await getRedisClient(); + // Execute a Redis transaction and get the count const [result] = await client.multi().incr(key).expireAt(key, expireAt).exec(); if (!result) {