From 5d9258d8c35483c608b780e140b887417a372dd7 Mon Sep 17 00:00:00 2001 From: Michael Schiemer Date: Mon, 27 Oct 2025 19:23:22 +0100 Subject: [PATCH] chore: RateLimiter fixes --- src/Framework/RateLimit/RateLimitResult.php | 2 +- src/Framework/RateLimit/SlidingWindowTokenBucket.php | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Framework/RateLimit/RateLimitResult.php b/src/Framework/RateLimit/RateLimitResult.php index 094c25a7..4edc3eaa 100644 --- a/src/Framework/RateLimit/RateLimitResult.php +++ b/src/Framework/RateLimit/RateLimitResult.php @@ -14,7 +14,7 @@ use App\Framework\Core\ValueObjects\Timestamp; * Enhanced with sophisticated threat analysis, attack pattern detection, * and adaptive response capabilities from the WAF system. */ -readonly class RateLimitResult +final readonly class RateLimitResult { public function __construct( private bool $allowed, diff --git a/src/Framework/RateLimit/SlidingWindowTokenBucket.php b/src/Framework/RateLimit/SlidingWindowTokenBucket.php index e60f6dc6..689a89c2 100644 --- a/src/Framework/RateLimit/SlidingWindowTokenBucket.php +++ b/src/Framework/RateLimit/SlidingWindowTokenBucket.php @@ -20,13 +20,15 @@ final readonly class SlidingWindowTokenBucket private SlidingWindow $analyticsWindow; + private Duration $refillInterval; + public function __construct( private string $identifier, private int $capacity, private int $refillRate, SlidingWindowFactory $windowFactory, private TimeProviderInterface $timeProvider = new SystemTimeProvider(), - private Duration $refillInterval = Duration::SECOND, + ?Duration $refillInterval = null, private bool $persistent = true ) { // Window for tracking token consumption (short window for actual limiting) @@ -42,6 +44,8 @@ final readonly class SlidingWindowTokenBucket windowSize: Duration::fromMinutes(5), // Longer window for pattern analysis persistent: $this->persistent ); + + $this->refillInterval = $refillInterval ?? Duration::fromSeconds(1); } /** @@ -212,11 +216,9 @@ final readonly class SlidingWindowTokenBucket ); // Available tokens = capacity - consumed + refilled, capped at capacity - $availableTokens = min( + return min( $this->capacity, max(0, $this->capacity - $tokensConsumed + $tokensRefilled) ); - - return $availableTokens; } }