@@ -2,7 +2,13 @@ import { eq, sql } from 'drizzle-orm'
22import { createLogger } from '@/lib/logs/console/logger'
33import { db } from '@/db'
44import { userRateLimits } from '@/db/schema'
5- import { RATE_LIMITS , type SubscriptionPlan , type TriggerType } from '@/services/queue/types'
5+ import {
6+ MANUAL_EXECUTION_LIMIT ,
7+ RATE_LIMIT_WINDOW_MS ,
8+ RATE_LIMITS ,
9+ type SubscriptionPlan ,
10+ type TriggerType ,
11+ } from '@/services/queue/types'
612
713const logger = createLogger ( 'RateLimiter' )
814
@@ -21,8 +27,8 @@ export class RateLimiter {
2127 if ( triggerType === 'manual' ) {
2228 return {
2329 allowed : true ,
24- remaining : 999999 ,
25- resetAt : new Date ( Date . now ( ) + 60000 ) ,
30+ remaining : MANUAL_EXECUTION_LIMIT ,
31+ resetAt : new Date ( Date . now ( ) + RATE_LIMIT_WINDOW_MS ) ,
2632 }
2733 }
2834
@@ -32,7 +38,7 @@ export class RateLimiter {
3238 : limit . syncApiExecutionsPerMinute
3339
3440 const now = new Date ( )
35- const windowStart = new Date ( now . getTime ( ) - 60000 ) // 1 minute ago
41+ const windowStart = new Date ( now . getTime ( ) - RATE_LIMIT_WINDOW_MS )
3642
3743 // Get or create rate limit record
3844 const [ rateLimitRecord ] = await db
@@ -78,7 +84,9 @@ export class RateLimiter {
7884
7985 // Check if we exceeded the limit
8086 if ( actualCount > execLimit ) {
81- const resetAt = new Date ( new Date ( insertedRecord . windowStart ) . getTime ( ) + 60000 )
87+ const resetAt = new Date (
88+ new Date ( insertedRecord . windowStart ) . getTime ( ) + RATE_LIMIT_WINDOW_MS
89+ )
8290
8391 await db
8492 . update ( userRateLimits )
@@ -98,7 +106,7 @@ export class RateLimiter {
98106 return {
99107 allowed : true ,
100108 remaining : execLimit - actualCount ,
101- resetAt : new Date ( new Date ( insertedRecord . windowStart ) . getTime ( ) + 60000 ) ,
109+ resetAt : new Date ( new Date ( insertedRecord . windowStart ) . getTime ( ) + RATE_LIMIT_WINDOW_MS ) ,
102110 }
103111 }
104112
@@ -124,7 +132,9 @@ export class RateLimiter {
124132
125133 // Check if we exceeded the limit AFTER the atomic increment
126134 if ( actualNewRequests > execLimit ) {
127- const resetAt = new Date ( new Date ( rateLimitRecord . windowStart ) . getTime ( ) + 60000 )
135+ const resetAt = new Date (
136+ new Date ( rateLimitRecord . windowStart ) . getTime ( ) + RATE_LIMIT_WINDOW_MS
137+ )
128138
129139 logger . info (
130140 `Rate limit exceeded - request ${ actualNewRequests } > limit ${ execLimit } for user ${ userId } ` ,
@@ -154,15 +164,15 @@ export class RateLimiter {
154164 return {
155165 allowed : true ,
156166 remaining : execLimit - actualNewRequests ,
157- resetAt : new Date ( new Date ( rateLimitRecord . windowStart ) . getTime ( ) + 60000 ) ,
167+ resetAt : new Date ( new Date ( rateLimitRecord . windowStart ) . getTime ( ) + RATE_LIMIT_WINDOW_MS ) ,
158168 }
159169 } catch ( error ) {
160170 logger . error ( 'Error checking rate limit:' , error )
161171 // Allow execution on error to avoid blocking users
162172 return {
163173 allowed : true ,
164174 remaining : 0 ,
165- resetAt : new Date ( Date . now ( ) + 60000 ) ,
175+ resetAt : new Date ( Date . now ( ) + RATE_LIMIT_WINDOW_MS ) ,
166176 }
167177 }
168178 }
@@ -181,9 +191,9 @@ export class RateLimiter {
181191 if ( triggerType === 'manual' ) {
182192 return {
183193 used : 0 ,
184- limit : 999999 ,
185- remaining : 999999 ,
186- resetAt : new Date ( Date . now ( ) + 60000 ) ,
194+ limit : MANUAL_EXECUTION_LIMIT ,
195+ remaining : MANUAL_EXECUTION_LIMIT ,
196+ resetAt : new Date ( Date . now ( ) + RATE_LIMIT_WINDOW_MS ) ,
187197 }
188198 }
189199
@@ -192,7 +202,7 @@ export class RateLimiter {
192202 ? limit . asyncApiExecutionsPerMinute
193203 : limit . syncApiExecutionsPerMinute
194204 const now = new Date ( )
195- const windowStart = new Date ( now . getTime ( ) - 60000 )
205+ const windowStart = new Date ( now . getTime ( ) - RATE_LIMIT_WINDOW_MS )
196206
197207 const [ rateLimitRecord ] = await db
198208 . select ( )
@@ -205,7 +215,7 @@ export class RateLimiter {
205215 used : 0 ,
206216 limit : execLimit ,
207217 remaining : execLimit ,
208- resetAt : new Date ( now . getTime ( ) + 60000 ) ,
218+ resetAt : new Date ( now . getTime ( ) + RATE_LIMIT_WINDOW_MS ) ,
209219 }
210220 }
211221
@@ -214,7 +224,7 @@ export class RateLimiter {
214224 used,
215225 limit : execLimit ,
216226 remaining : Math . max ( 0 , execLimit - used ) ,
217- resetAt : new Date ( new Date ( rateLimitRecord . windowStart ) . getTime ( ) + 60000 ) ,
227+ resetAt : new Date ( new Date ( rateLimitRecord . windowStart ) . getTime ( ) + RATE_LIMIT_WINDOW_MS ) ,
218228 }
219229 } catch ( error ) {
220230 logger . error ( 'Error getting rate limit status:' , error )
@@ -225,7 +235,7 @@ export class RateLimiter {
225235 used : 0 ,
226236 limit : execLimit ,
227237 remaining : execLimit ,
228- resetAt : new Date ( Date . now ( ) + 60000 ) ,
238+ resetAt : new Date ( Date . now ( ) + RATE_LIMIT_WINDOW_MS ) ,
229239 }
230240 }
231241 }
0 commit comments