Skip to content

Commit bbd8655

Browse files
committed
refactored throttledPromise to skip unnecessary events
1 parent 877d975 commit bbd8655

File tree

1 file changed

+28
-11
lines changed

1 file changed

+28
-11
lines changed

src/middleware/index.ts

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)