@@ -53,6 +53,26 @@ export function expressRateLimiter(
5353 // Manages processing of event queue
5454 const requestEvents = new EventEmitter ( ) ;
5555
56+ // Resolves the promise created by throttledProcess
57+ async function processRequestResolver (
58+ userId : string ,
59+ timestamp : number ,
60+ tokens : number ,
61+ resolve : ( value : RateLimiterResponse | PromiseLike < RateLimiterResponse > ) => void ,
62+ reject : ( reason : any ) => void
63+ ) {
64+ try {
65+ const response = await rateLimiter . processRequest ( userId , timestamp , tokens ) ;
66+ requestQueue [ userId ] = requestQueue [ userId ] . slice ( 1 ) ;
67+ // trigger the next event
68+ resolve ( response ) ;
69+ requestEvents . emit ( requestQueue [ userId ] [ 0 ] ) ;
70+ if ( requestQueue [ userId ] . length === 0 ) delete requestQueue [ userId ] ;
71+ } catch ( err ) {
72+ reject ( err ) ;
73+ }
74+ }
75+
5676 /**
5777 * Throttle rateLimiter.processRequest based on user IP to prevent inaccurate redis reads
5878 * Throttling is based on a event driven promise fulfillment approach.
@@ -77,17 +97,14 @@ export function expressRateLimiter(
7797 }
7898 requestQueue [ userId ] . push ( requestId ) ;
7999
80- return new Promise ( ( resolve ) => {
81- requestEvents . once ( requestId , async ( ) => {
82- // process the request
83- const response = await rateLimiter . processRequest ( userId , timestamp , tokens ) ;
84- requestQueue [ userId ] = requestQueue [ userId ] . slice ( 1 ) ;
85- // trigger the next event
86- requestEvents . emit ( requestQueue [ userId ] [ 0 ] ) ;
87-
88- resolve ( response ) ;
89- } ) ;
90- requestEvents . emit ( requestQueue [ userId ] [ 0 ] ) ;
100+ return new Promise ( ( resolve , reject ) => {
101+ if ( requestQueue [ userId ] . length > 1 ) {
102+ requestEvents . once ( requestId , async ( ) => {
103+ await processRequestResolver ( userId , timestamp , tokens , resolve , reject ) ;
104+ } ) ;
105+ } else {
106+ processRequestResolver ( userId , timestamp , tokens , resolve , reject ) ;
107+ }
91108 } ) ;
92109 }
93110
0 commit comments