-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrate_limiter_token_bucket.js
45 lines (39 loc) · 1.08 KB
/
rate_limiter_token_bucket.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class TokenBucket {
constructor(capacity, refillRate, initialTokens = capacity) {
this.capacity = capacity;
this.refillRate = refillRate;
this.tokens = Math.min(capacity, initialTokens);
this.lastRefill = Date.now();
}
getToken() {
this.refill();
if (this.tokens > 0) {
this.tokens--;
return true;
}
return false;
}
refill() {
const now = Date.now();
const elapsed = Math.floor((now - this.lastRefill) / 1000); // Time in seconds
this.tokens = Math.min(this.capacity, this.tokens + (elapsed * this.refillRate));
this.lastRefill = now;
}
}
// Example usage
const rateLimit = 5; // Requests per second
const bucket = new TokenBucket(rateLimit, rateLimit);
function handleRequest() {
// Simulate some processing
// ...
// Check if token available for request
if (bucket.getToken()) {
handleRequest();
} else {
console.log("Request rate limit exceeded!");
}
}
// Make requests with a slight delay to simulate traffic
for (let i = 0; i < 10; i++) {
setTimeout(() => handleRequest(), i * 100); // Simulate delay
}