Completed
Pull Request — master (#12)
by
unknown
12:17 queued 02:05
created

InMemoryRateLimiter   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 51
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 0

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
wmc 9
lcom 1
cbo 0
dl 0
loc 51
ccs 0
cts 21
cp 0
rs 10
c 0
b 0
f 0

6 Methods

Rating   Name   Duplication   Size   Complexity  
A get() 0 11 3
A init() 0 7 1
A increment() 0 4 1
A ttl() 0 8 2
A has() 0 4 1
A hasExpired() 0 4 1
1
<?php
2
/**
3
 * This file is part of the Rate Limit package.
4
 *
5
 * Copyright (c) Nikola Posa
6
 *
7
 * For full copyright and license information, please refer to the LICENSE file,
8
 * located at the package root folder.
9
 */
10
11
declare(strict_types=1);
12
13
namespace RateLimit;
14
15
/**
16
 * @author Nikola Posa <[email protected]>
17
 */
18
final class InMemoryRateLimiter extends AbstractRateLimiter
19
{
20
    /**
21
     * @var array
22
     */
23
    protected $store = [];
24
25
    protected function get(string $key, int $default) : int
26
    {
27
        if (
28
            !$this->has($key)
29
            || $this->hasExpired($key)
30
        ) {
31
            return $default;
32
        }
33
34
        return $this->store[$key]['current'];
35
    }
36
37
    protected function init(string $key)
38
    {
39
        $this->store[$key] = [
40
            'current' => 1,
41
            'expires' => time() + $this->window,
42
        ];
43
    }
44
45
    protected function increment(string $key)
46
    {
47
        $this->store[$key]['current']++;
48
    }
49
50
    protected function ttl(string $key) : int
51
    {
52
        if (!isset($this->store[$key])) {
53
            return 0;
54
        }
55
56
        return max($this->store[$key]['expires'] - time(), 0);
57
    }
58
59
    private function has(string $key) : bool
60
    {
61
        return array_key_exists($key, $this->store);
62
    }
63
64
    private function hasExpired(string $key) : bool
65
    {
66
        return time() > $this->store[$key]['expires'];
67
    }
68
}
69