Skip to content

Commit 4f77bb1

Browse files
committed
refactored the token bucket
1 parent 52db84f commit 4f77bb1

File tree

1 file changed

+13
-20
lines changed

1 file changed

+13
-20
lines changed

src/rateLimiters/tokenBucket.ts

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

107100
export default TokenBucket;

0 commit comments

Comments
 (0)