Passed
Push — master ( 84cbf2...ef661a )
by Leonardo
04:29 queued 02:41
created

CircuitBreaker::getAdapter()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 3
rs 10
1
<?php
2
3
namespace LeoCarmo\CircuitBreaker;
4
5
use LeoCarmo\CircuitBreaker\Adapters\AdapterInterface;
6
7
class CircuitBreaker
8
{
9
10
    /**
11
     * @var AdapterInterface
12
     */
13
    protected static $adapter;
14
15
    /**
16
     * @var string
17
     */
18
    protected static $redisNamespace;
19
20
    /**
21
     * @var array
22
     */
23
    protected static $servicesSettings;
24
25
    /**
26
     * @var array
27
     */
28
    protected static $globalSettings;
29
30
    /**
31
     * @var array
32
     */
33
    protected static $defaultSettings = [
34
        'timeWindow' => 60,
35
        'failureRateThreshold' => 50,
36
        'intervalToHalfOpen' => 30,
37
    ];
38
39
    /**
40
     * @param AdapterInterface $adapter
41
     */
42
    public static function setAdapter(AdapterInterface $adapter) : void
43
    {
44
        self::$adapter = $adapter;
45
    }
46
47
    /**
48
     * @return AdapterInterface
49
     */
50
    public static function getAdapter() : AdapterInterface
51
    {
52
        return self::$adapter;
53
    }
54
55
    /**
56
     * Set global settings for all services
57
     *
58
     * @param array $settings
59
     */
60
    public static function setGlobalSettings(array $settings) : void
61
    {
62
        foreach (self::$defaultSettings as $defaultSetting => $settingValue) {
63
            self::$globalSettings[$defaultSetting] = (int) $settings[$defaultSetting] ?? $settingValue;
64
        }
65
    }
66
67
    /**
68
     * @return array
69
     */
70
    public static function getGlobalSettings() : array
71
    {
72
        return self::$globalSettings;
73
    }
74
75
    /**
76
     * Set custom settings for each service
77
     *
78
     * @param string $service
79
     * @param array $settings
80
     */
81
    public static function setServiceSettings(string $service, array $settings) : void
82
    {
83
        foreach (self::$defaultSettings as $defaultSetting => $settingValue) {
84
            self::$servicesSettings[$service][$defaultSetting] =
85
                (int) $settings[$defaultSetting]
86
                ?? self::$globalSettings[$defaultSetting]
87
                ?? $settingValue;
88
        }
89
    }
90
91
    /**
92
     * Get setting for a service, if not set, get from default settings
93
     *
94
     * @param string $service
95
     * @param string $setting
96
     * @return mixed
97
     */
98
    public static function getServiceSetting(string $service, string $setting)
99
    {
100
        return self::$servicesSettings[$service][$setting]
101
            ?? self::$globalSettings[$setting]
102
            ?? self::$defaultSettings[$setting];
103
    }
104
105
    /**
106
     * Check if circuit is available (closed)
107
     *
108
     * @param string $service
109
     * @return bool
110
     */
111
    public static function isAvailable(string $service) : bool
112
    {
113
        if (self::$adapter->isOpen($service)) {
114
            return false;
115
        }
116
117
        if (self::$adapter->reachRateLimit($service)) {
118
            self::$adapter->setOpenCircuit($service);
119
            self::$adapter->setHalfOpenCircuit($service);
120
            return false;
121
        }
122
123
        return true;
124
    }
125
126
    /**
127
     * Set new failure for a service
128
     *
129
     * @param string $service
130
     * @return bool
131
     */
132
    public static function failure(string $service)
133
    {
134
        if (self::$adapter->isHalfOpen($service)) {
135
            self::$adapter->setOpenCircuit($service);
136
            self::$adapter->setHalfOpenCircuit($service);
137
            return false;
138
        }
139
140
        return self::$adapter->incrementFailure($service);
141
    }
142
143
    /**
144
     * Record success and clear all status
145
     *
146
     * @param string $service
147
     * @return bool|int
148
     */
149
    public static function success(string $service)
150
    {
151
        return self::$adapter->setSuccess($service);
152
    }
153
}
154