123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- <?php
-
- namespace Illuminate\Redis\Limiters;
-
- use Illuminate\Support\InteractsWithTime;
- use Illuminate\Contracts\Redis\LimiterTimeoutException;
-
- class ConcurrencyLimiterBuilder
- {
- use InteractsWithTime;
-
- /**
- * The Redis connection.
- *
- * @var \Illuminate\Redis\Connections\Connection
- */
- public $connection;
-
- /**
- * The name of the lock.
- *
- * @var string
- */
- public $name;
-
- /**
- * The maximum number of entities that can hold the lock at the same time.
- *
- * @var int
- */
- public $maxLocks;
-
- /**
- * The number of seconds to maintain the lock until it is automatically released.
- *
- * @var int
- */
- public $releaseAfter = 60;
-
- /**
- * The amount of time to block until a lock is available.
- *
- * @var int
- */
- public $timeout = 3;
-
- /**
- * Create a new builder instance.
- *
- * @param \Illuminate\Redis\Connections\Connection $connection
- * @param string $name
- * @return void
- */
- public function __construct($connection, $name)
- {
- $this->name = $name;
- $this->connection = $connection;
- }
-
- /**
- * Set the maximum number of locks that can obtained per time window.
- *
- * @param int $maxLocks
- * @return $this
- */
- public function limit($maxLocks)
- {
- $this->maxLocks = $maxLocks;
-
- return $this;
- }
-
- /**
- * Set the number of seconds until the lock will be released.
- *
- * @param int $releaseAfter
- * @return $this
- */
- public function releaseAfter($releaseAfter)
- {
- $this->releaseAfter = $this->secondsUntil($releaseAfter);
-
- return $this;
- }
-
- /**
- * Set the amount of time to block until a lock is available.
- *
- * @param int $timeout
- * @return $this
- */
- public function block($timeout)
- {
- $this->timeout = $timeout;
-
- return $this;
- }
-
- /**
- * Execute the given callback if a lock is obtained, otherwise call the failure callback.
- *
- * @param callable $callback
- * @param callable|null $failure
- * @return mixed
- *
- * @throws \Illuminate\Contracts\Redis\LimiterTimeoutException
- */
- public function then(callable $callback, callable $failure = null)
- {
- try {
- return (new ConcurrencyLimiter(
- $this->connection, $this->name, $this->maxLocks, $this->releaseAfter
- ))->block($this->timeout, $callback);
- } catch (LimiterTimeoutException $e) {
- if ($failure) {
- return $failure($e);
- }
-
- throw $e;
- }
- }
- }
|