Token bucket and sliding window rate limiting for async operations
dart pub add philiprehberger_rate_limiterToken bucket and sliding window rate limiting for async operations
Add to your pubspec.yaml:
dependencies:
philiprehberger_rate_limiter: ^0.1.0
Then run:
dart pub get
import 'package:philiprehberger_rate_limiter/philiprehberger_rate_limiter.dart';
final limiter = TokenBucket(
capacity: 10,
refillInterval: Duration(seconds: 1),
);
if (limiter.tryAcquire()) {
// Request allowed
}
The token bucket algorithm maintains a bucket of tokens that refills at a fixed rate. Each request consumes one token.
final bucket = TokenBucket(
capacity: 5,
refillInterval: Duration(milliseconds: 200),
);
// Non-blocking check
if (bucket.tryAcquire()) {
print('Allowed');
} else {
print('Rate limited');
}
// Async wait until a token is available
await bucket.acquire();
The sliding window algorithm tracks request timestamps and limits the number of requests within a rolling time window.
final window = SlidingWindow(
maxRequests: 100,
window: Duration(minutes: 1),
);
if (window.tryAcquire()) {
print('Allowed');
}
// Wait until the window has room
await window.acquire();
Both algorithms support per-key rate limiting for multi-tenant scenarios.
final limiter = TokenBucket(
capacity: 5,
refillInterval: Duration(seconds: 1),
);
limiter.tryAcquire(key: 'user-123');
limiter.tryAcquire(key: 'user-456');
limiter.reset(key: 'user-123');
| Method | Description |
|---|---|
TokenBucket({capacity, refillInterval}) | Create a token bucket rate limiter |
SlidingWindow({maxRequests, window}) | Create a sliding window rate limiter |
RateLimiter.tryAcquire({key}) | Try to acquire a permit, returns true if allowed |
RateLimiter.acquire({key}) | Acquire a permit, waiting if necessary |
RateLimiter.reset({key}) | Reset state for a key, or all keys if omitted |
dart pub get
dart analyze --fatal-infos
dart test
If you find this project useful: