Skip to content

Commit

Permalink
Merge pull request #1 from Radweb/per-day
Browse files Browse the repository at this point in the history
Add per day rate limit
  • Loading branch information
LukeAustin8 authored Sep 21, 2022
2 parents 8360415 + cf515f6 commit dea953a
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ composer.lock
docs
vendor
coverage
.phpunit.result.cache
5 changes: 5 additions & 0 deletions src/RateLimiter.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ class RateLimiter
{
const TIME_FRAME_MINUTE = 'minute';
const TIME_FRAME_SECOND = 'second';
const TIME_FRAME_DAY = 'day';

/** @var int */
protected $limit;
Expand Down Expand Up @@ -74,6 +75,10 @@ protected function timeFrameLengthInMilliseconds(): int
return 60 * 1000;
}

if ($this->timeFrame === self::TIME_FRAME_DAY) {
return 24 * 60 * 60 * 1000;
}

return 1000;
}
}
12 changes: 12 additions & 0 deletions src/RateLimiterMiddleware.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,18 @@ public static function perMinute(int $limit, Store $store = null, Deferrer $defe
return new static($rateLimiter);
}

public static function perDay(int $limit, Store $store = null, Deferrer $deferrer = null): RateLimiterMiddleware
{
$rateLimiter = new RateLimiter(
$limit,
RateLimiter::TIME_FRAME_DAY,
$store ?? new InMemoryStore(),
$deferrer ?? new SleepDeferrer()
);

return new static($rateLimiter);
}

public function __invoke(callable $handler)
{
return function (RequestInterface $request, array $options) use ($handler) {
Expand Down
5 changes: 5 additions & 0 deletions tests/RateLimiterMiddlewareTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,10 @@ public function it_has_named_constructors_to_create_instances()
RateLimiterMiddleware::class,
RateLimiterMiddleware::perMinute(5)
);

$this->assertInstanceOf(
RateLimiterMiddleware::class,
RateLimiterMiddleware::perDay(10000)
);
}
}
65 changes: 65 additions & 0 deletions tests/RateLimiterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -135,4 +135,69 @@ public function it_defers_actions_when_it_reaches_a_limit_in_minutes()

$this->assertEquals(60000, $this->deferrer->getCurrentTime());
}

/** @test */
public function it_execute_actions_below_a_limit_for_day()
{
$rateLimiter = $this->createRateLimiter(3, RateLimiter::TIME_FRAME_DAY);

$this->assertEquals(0, $this->deferrer->getCurrentTime());

$rateLimiter->handle(function () {
$this->deferrer->sleep(100);
});

$this->assertEquals(100, $this->deferrer->getCurrentTime());

$rateLimiter->handle(function () {
$this->deferrer->sleep(100);
});

$this->assertEquals(200, $this->deferrer->getCurrentTime());

$rateLimiter->handle(function () {
$this->deferrer->sleep(100);
});

$this->assertEquals(300, $this->deferrer->getCurrentTime());

$dayInMilliseconds = 24 * 60 * 60 * 1000;

$this->deferrer->sleep($dayInMilliseconds - 300);

$rateLimiter->handle(function () {
$this->deferrer->sleep(100);
});

$this->assertEquals($dayInMilliseconds + 100, $this->deferrer->getCurrentTime());
}

/** @test */
public function it_defers_actions_when_it_reaches_a_limit_in_day()
{
$rateLimiter = $this->createRateLimiter(3, RateLimiter::TIME_FRAME_DAY);

$this->assertEquals(0, $this->deferrer->getCurrentTime());

$rateLimiter->handle(function () {
});

$this->assertEquals(0, $this->deferrer->getCurrentTime());

$rateLimiter->handle(function () {
});

$this->assertEquals(0, $this->deferrer->getCurrentTime());

$rateLimiter->handle(function () {
});

$this->assertEquals(0, $this->deferrer->getCurrentTime());

$rateLimiter->handle(function () {
});

$this->assertEquals(24 * 60 * 60 * 1000, $this->deferrer->getCurrentTime());
}

}

0 comments on commit dea953a

Please sign in to comment.