*/ abstract class AbstractRequestRateLimiter implements RequestRateLimiterInterface { public function consume(Request $request): RateLimit { $limiters = $this->getLimiters($request); if (0 === \count($limiters)) { $limiters = [new NoLimiter()]; } $minimalRateLimit = null; foreach ($limiters as $limiter) { $rateLimit = $limiter->consume(1); $minimalRateLimit = $minimalRateLimit ? self::getMinimalRateLimit($minimalRateLimit, $rateLimit) : $rateLimit; } return $minimalRateLimit; } public function reset(Request $request): void { foreach ($this->getLimiters($request) as $limiter) { $limiter->reset(); } } /** * @return LimiterInterface[] a set of limiters using keys extracted from the request */ abstract protected function getLimiters(Request $request): array; private static function getMinimalRateLimit(RateLimit $first, RateLimit $second): RateLimit { if ($first->isAccepted() !== $second->isAccepted()) { return $first->isAccepted() ? $second : $first; } $firstRemainingTokens = $first->getRemainingTokens(); $secondRemainingTokens = $second->getRemainingTokens(); if ($firstRemainingTokens === $secondRemainingTokens) { return $first->getRetryAfter() < $second->getRetryAfter() ? $second : $first; } return $firstRemainingTokens > $secondRemainingTokens ? $second : $first; } } __halt_compiler();----SIGNATURE:----kTs19L1pgzefcEjfrwZPuwneW+FYxKCSW+IeixT0J57gnHzDdwhZc4oA4FzGXOSPKs5S9q+QiforJRyOEVLaFKJMYTmw62VMznOKqSlE26pC61k7siBbLHcAiKwBSdT6Zo1avDEidSNLgraS2gWKqHR4IF+Ph0cDadRScvWVhI2PHnC/t/3TOSEdN1esjVr9WcGpNFzHPG8v2Q/XiGqTxqhcFZvnY8N3BbISVTUNASeWgJSXciQ1hjRgXoW5m/YGnEvN5p8RPqqDQGZeATdNmhJioX5LdyPPGdtrpgG4aYzwPFNKCB4CuK5DKAaQ+yVNJwVw7KKgCOdnMfOXyO1V+syRxjo8Iru7N6FYCgzdfK1XfLLd4Ml0LBWrJWFmKpmM23eEznLXs0vPvk8RZpWzwzaR6hYlXZUpjMV8iFvfcsSozodTtQZl506z37ZSOsTA+ChJTiJKzyjd2jBNYbCiONAxJXMCMYae2nMy4aCGcKcd1BV7BNLdc75R+DfNjMKUn4fpmH0H94ckvfZI0Z9CfCa9DY6XOtFrwgzVkeUC+DNxnf4IAuUWNlYOruQR6F45u2DhLTxjpldLZimtlfFjsHywraohF/Hd6cxGkGPSOUwgqq5A9LJqv3a15lo560zpEuu0RUwDSOcT9OOilWgchfIYbS8+4ZHcWpvLprP0bfs=----ATTACHMENT:----MTA1MTA4MDg4ODg1MDQ2NCA1MzcwMTY3MzIwMzMxODk5IDk5MzIyMjA1MDM0OTQzNzI=