<?php
namespace Illuminate\Queue\Middleware;
use Illuminate\Cache\RateLimiter;
use Illuminate\Container\Container;
use Throwable;
class ThrottlesExceptions
{
/**
* The developer specified key that the rate limiter should use.
*
* @var string
*/
protected $key;
/**
* Indicates whether the throttle key should use the job's UUID.
*
* @var bool
*/
protected $byJob = false;
/**
* The maximum number of attempts allowed before rate limiting applies.
*
* @var int
*/
protected $maxAttempts;
/**
* The number of minutes until the maximum attempts are reset.
*
* @var int
*/
protected $decayMinutes;
/**
* The number of minutes to wait before retrying the job after an exception.
*
* @var int
*/
protected $retryAfterMinutes = 0;
/**
* The callback that determines if rate limiting should apply.
*
* @var callable
*/
protected $whenCallback;
/**
* The prefix of the rate limiter key.
*
* @var string
*/
protected $prefix = 'laravel_throttles_exceptions:';
/**
* The rate limiter instance.
*
* @var \Illuminate\Cache\RateLimiter
*/
protected $limiter;
/**
* Create a new middleware instance.
*
* @param int $maxAttempts
* @param int $decayMinutes
* @return void
*/
public function __construct($maxAttempts = 10, $decayMinutes = 10)
{
$this->maxAttempts = $maxAttempts;
$this->decayMinutes = $decayMinutes;
}
/**
* Process the job.
*
* @param mixed $job
* @param callable $next
* @return mixed
*/
public function handle($job, $next)
{
$this->limiter = Container::getInstance()->make(RateLimiter::class);
if ($this->limiter->tooManyAttempts($jobKey = $this->getKey($job), $this->maxAttempts)) {
return $job->release($this->getTimeUntilNextRetry($jobKey));
}
try {
$next($job);
$this->limiter->clear($jobKey);
} catch (Throwable $throwable) {
if ($this->whenCallback && ! call_user_func($this->whenCallback, $throwable)) {
throw $throwable;
}
$this->limiter->hit($jobKey, $this->decayMinutes * 60);
return $job->release($this->retryAfterMinutes * 60);
}
}
/**
* Specify a callback that should determine if rate limiting behavior should apply.
*
* @param callable $callback
* @return $this
*/
public function when(callable $callback)
{
$this->whenCallback = $callback;
return $this;
}
/**
* Set the prefix of the rate limiter key.
*
* @param string $prefix
* @return $this
*/
public function withPrefix(string $prefix)
{
$this->prefix = $prefix;
return $this;
}
/**
* Specify the number of minutes a job should be delayed when it is released (before it has reached its max exceptions).
*
* @param int $backoff
* @return $this
*/
public function backoff($backoff)
{
$this->retryAfterMinutes = $backoff;
return $this;
}
/**
* Get the cache key associated for the rate limiter.
*
* @param mixed $job
* @return string
*/
protected function getKey($job)
{
if ($this->key) {
return $this->prefix.$this->key;
} elseif ($this->byJob) {
return $this->prefix.$job->job->uuid();
}
return $this->prefix.md5(get_class($job));
}
/**
* Set the value that the rate limiter should be keyed by.
*
* @param string $key
* @return $this
*/
public function by($key)
{
$this->key = $key;
return $this;
}
/**
* Indicate that the throttle key should use the job's UUID.
*
* @return $this
*/
public function byJob()
{
$this->byJob = true;
return $this;
}
/**
* Get the number of seconds that should elapse before the job is retried.
*
* @param string $key
* @return int
*/
protected function getTimeUntilNextRetry($key)
{
return $this->limiter->availableIn($key) + 3;
}
}
Welcome to the Kueue Pay Payment Gateway Solutions Developer API Documentation. This comprehensive guide will empower you to seamlessly integrate our advanced payment gateway into your website, enhancing your customers’ payment experience and enabling efficient transaction processing. The Kueue Pay Developer API is designed for developers and entrepreneurs who seek simplicity, security, and reliability in their payment processing solutions.
The Kueue Pay Developer API allows you to seamlessly integrate Kueue Pay’s Payment Gateway Solutions into your website, enabling secure and efficient debit and credit card transactions. With our API, you can initiate payments, check payment statuses, and even process refunds, all while ensuring a smooth and streamlined payment experience for your customers.