start with 1 token in rate limiter rather than a full bucket (per/min providers only
All checks were successful
Generic zig build / build (push) Successful in 27s
All checks were successful
Generic zig build / build (push) Successful in 27s
This commit is contained in:
parent
7fabc794c1
commit
3e13faa66f
1 changed files with 17 additions and 3 deletions
|
|
@ -29,9 +29,12 @@ pub fn init(max_per_window: u32, window_ns: u64) RateLimiter {
|
|||
};
|
||||
}
|
||||
|
||||
/// Convenience: N requests per minute
|
||||
/// Convenience: N requests per minute.
|
||||
/// Starts with 1 token (no burst) to stay within provider sliding-window limits.
|
||||
pub fn perMinute(n: u32) RateLimiter {
|
||||
return init(n, std.time.ns_per_min);
|
||||
var rl = init(n, std.time.ns_per_min);
|
||||
rl.tokens = 1.0;
|
||||
return rl;
|
||||
}
|
||||
|
||||
/// Convenience: N requests per day
|
||||
|
|
@ -87,8 +90,19 @@ fn refill(self: *RateLimiter) void {
|
|||
|
||||
test "rate limiter basic" {
|
||||
var rl = RateLimiter.perMinute(60);
|
||||
// Should have full bucket initially
|
||||
// perMinute starts with 1 token (no burst)
|
||||
try std.testing.expect(rl.tryAcquire());
|
||||
// Second call should be rate-limited immediately
|
||||
try std.testing.expect(!rl.tryAcquire());
|
||||
}
|
||||
|
||||
test "rate limiter perDay keeps full burst" {
|
||||
var rl = RateLimiter.perDay(25);
|
||||
// perDay starts with full bucket
|
||||
for (0..25) |_| {
|
||||
try std.testing.expect(rl.tryAcquire());
|
||||
}
|
||||
try std.testing.expect(!rl.tryAcquire());
|
||||
}
|
||||
|
||||
test "rate limiter exhaustion" {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue