@@ -39,35 +39,39 @@ class TokenBucket implements RateLimiter {
3939
4040 // attempt to get the value for the uuid from the redis cache
4141 const bucketJSON = await this . client . get ( uuid ) ;
42- // if the response is null, we need to create bucket for the user
42+
43+ // if the response is null, we need to create a bucket for the user
4344 if ( bucketJSON === null ) {
4445 const newUserBucket : RedisBucket = {
46+ // conditionally set tokens depending on how many are requested comapred to the capacity
4547 tokens : tokens > this . capacity ? 10 : this . capacity - tokens ,
4648 timestamp,
4749 } ;
50+ // reject the request, not enough tokens could even be in the bucket
4851 if ( tokens > this . capacity ) {
49- // reject the request, not enough tokens could even be in the bucket
5052 await this . client . setex ( uuid , keyExpiry , JSON . stringify ( newUserBucket ) ) ;
51- return TokenBucket . processRequestResponse ( false , this . capacity ) ;
53+ return { success : false , tokens : this . capacity } ;
5254 }
5355 await this . client . setex ( uuid , keyExpiry , JSON . stringify ( newUserBucket ) ) ;
54- return TokenBucket . processRequestResponse ( true , newUserBucket . tokens ) ;
56+ return { success : true , tokens : newUserBucket . tokens } ;
5557 }
5658
57- // parse the returned thring form redis and update their token budget based on the time lapse between queries
59+ // parse the returned string from redis and update their token budget based on the time lapse between queries
5860 const bucket : RedisBucket = await JSON . parse ( bucketJSON ) ;
59- bucket . tokens = this . calculateTokenBudgetFormTimestamp ( bucket , timestamp ) ;
61+ bucket . tokens = this . calculateTokenBudgetFromTimestamp ( bucket , timestamp ) ;
62+
6063 const updatedUserBucket = {
64+ // conditionally set tokens depending on how many are requested comapred to the bucket
6165 tokens : bucket . tokens < tokens ? bucket . tokens : bucket . tokens - tokens ,
6266 timestamp,
6367 } ;
6468 if ( bucket . tokens < tokens ) {
6569 // reject the request, not enough tokens in bucket
6670 await this . client . setex ( uuid , keyExpiry , JSON . stringify ( updatedUserBucket ) ) ;
67- return TokenBucket . processRequestResponse ( false , bucket . tokens ) ;
71+ return { success : false , tokens : bucket . tokens } ;
6872 }
6973 await this . client . setex ( uuid , keyExpiry , JSON . stringify ( updatedUserBucket ) ) ;
70- return TokenBucket . processRequestResponse ( true , updatedUserBucket . tokens ) ;
74+ return { success : true , tokens : updatedUserBucket . tokens } ;
7175 }
7276
7377 /**
@@ -80,7 +84,7 @@ class TokenBucket implements RateLimiter {
8084 /**
8185 * Calculates the tokens a user bucket should have given the time lapse between requests.
8286 */
83- private calculateTokenBudgetFormTimestamp = (
87+ private calculateTokenBudgetFromTimestamp = (
8488 bucket : RedisBucket ,
8589 timestamp : number
8690 ) : number => {
@@ -91,17 +95,6 @@ class TokenBucket implements RateLimiter {
9195 const updatedTokenCount = bucket . tokens + tokensToAdd ;
9296 return updatedTokenCount > this . capacity ? 10 : updatedTokenCount ;
9397 } ;
94-
95- /**
96- * A helper function to create the response object from 'processRequest'
97- */
98- private static processRequestResponse = (
99- success : boolean ,
100- tokens : number
101- ) : RateLimiterResponse => ( {
102- success,
103- tokens,
104- } ) ;
10598}
10699
107100export default TokenBucket ;
0 commit comments