@@ -9,7 +9,7 @@ export class KvStore implements Store {
99 _options : ConfigType | undefined ;
1010 prefix = "rate-limiter" ;
1111
12- constructor ( readonly _store : Kv ) { }
12+ constructor ( readonly _store : Kv | Deno . Kv ) { }
1313
1414 init ( options : ConfigType ) : void {
1515 this . _options = options ;
@@ -80,9 +80,7 @@ export class KvStore implements Store {
8080}
8181
8282export async function createKvStore ( ) : Promise < KvStore > {
83- // @ts -expect-error - Deno isn't defined without having the DenoLand extension installed or within the runtime
8483 if ( typeof Deno !== "undefined" && Deno . openKv ) {
85- // @ts -expect-error - Deno isn't defined without having the DenoLand extension installed or within the runtime
8684 const kv = await Deno . openKv ( ) ;
8785 if ( ! kv ) {
8886 throw new Error ( "Failed to open Deno KV" ) ;
@@ -136,31 +134,6 @@ export async function createUserRateLimiter(c: Context, next: () => Promise<void
136134 return ;
137135 }
138136
139- // Helper to create rate limit response
140- function createRateLimitResponse ( resetAt : number , user : { id : number } ) {
141- const logMessage = logger . warn ( "RateLimit: exceeded" , {
142- key : `user:${ user . id } :${ mode } ` ,
143- resetAt,
144- limit,
145- } ) ;
146-
147- return Response . json (
148- {
149- ok : false ,
150- reasons : [ logMessage . logMessage . raw ] ,
151- resetAt,
152- } ,
153- {
154- status : 429 ,
155- headers : {
156- "x-ratelimit-limit" : limit . toString ( ) ,
157- "x-ratelimit-reset" : resetAt . toString ( ) ,
158- } ,
159- }
160- ) ;
161- }
162-
163- // Use hono-rate-limiter with user-specific key and custom handler
164137 const rateLimitKey = `user:${ user . id } :${ mode } ` ;
165138 const { rateLimiter } = await import ( "hono-rate-limiter" ) ;
166139 const userLimiter = rateLimiter ( {
@@ -171,22 +144,7 @@ export async function createUserRateLimiter(c: Context, next: () => Promise<void
171144 store : kvStore ,
172145 skipSuccessfulRequests : false ,
173146 skipFailedRequests : false ,
174- handler : async ( c ) => {
175- const rateLimitInfo = await kvStore . get ( rateLimitKey ) ;
176- const resetAt = rateLimitInfo ?. resetTime ?. getTime ( ) ?? Date . now ( ) + 60 * 1000 ;
177- const response = createRateLimitResponse ( resetAt , user ) ;
178- c . res = response ;
179- } ,
180147 } ) ;
181148
182- // Execute rate limiter - it will call next() internally if not rate limited
183- // If rate limited, it will call our custom handler which sets c.res
184- await userLimiter ( c , next ) ;
185-
186- // If rate limit was exceeded, the handler set c.res
187- // hono-rate-limiter should prevent next() from being called, but we check anyway
188- // to ensure we don't continue processing if a response was already set
189- if ( c . res && c . res . status === 429 ) {
190- return ;
191- }
149+ return await userLimiter ( c , next ) ;
192150}
0 commit comments