1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace Dazzle\Channel\Record; |
4
|
|
|
|
5
|
|
|
use Dazzle\Util\Support\TimeSupport; |
6
|
|
|
use Dazzle\Throwable\Exception\System\TaskIncompleteException; |
7
|
|
|
|
8
|
|
|
trait ResponseRecordStorage |
9
|
|
|
{ |
10
|
|
|
/** |
11
|
|
|
* @var ResponseRecord[] |
12
|
|
|
*/ |
13
|
|
|
protected $reps = []; |
14
|
|
|
|
15
|
|
|
/** |
16
|
|
|
* @var ResponseRecord[] |
17
|
|
|
*/ |
18
|
|
|
protected $handledReps = []; |
19
|
|
|
|
20
|
|
|
/** |
21
|
|
|
* @var int |
22
|
|
|
*/ |
23
|
|
|
protected $handledRepsTimeout = 0; |
24
|
|
|
|
25
|
|
|
/** |
26
|
|
|
* Create ResponseRecord. |
27
|
|
|
* |
28
|
|
|
* @param string $pid |
29
|
|
|
* @param string $alias |
30
|
|
|
* @param float $timeout |
31
|
|
|
* @param float $timeoutIncrease |
32
|
|
|
* @return ResponseRecord |
33
|
|
|
*/ |
34
|
1 |
|
protected function createResponse($pid, $alias, $timeout = 0.0, $timeoutIncrease = 1.0) |
35
|
|
|
{ |
36
|
1 |
|
return new ResponseRecord($pid, $alias, $timeout, $timeoutIncrease); |
37
|
|
|
} |
38
|
|
|
|
39
|
|
|
/** |
40
|
|
|
* Check if ResponseRecord with given protocol ID exists. |
41
|
|
|
* |
42
|
|
|
* @param $pid |
43
|
|
|
* @return bool |
44
|
|
|
*/ |
45
|
3 |
|
protected function existsResponse($pid) |
46
|
|
|
{ |
47
|
3 |
|
return isset($this->reps[$pid]) || isset($this->handledReps[$pid]); |
48
|
|
|
} |
49
|
|
|
|
50
|
|
|
/** |
51
|
|
|
* Add new ResponseRecord to storage. |
52
|
|
|
* |
53
|
|
|
* @param string $pid |
54
|
|
|
* @param ResponseRecord $response |
55
|
|
|
*/ |
56
|
5 |
|
protected function addResponse($pid, ResponseRecord $response) |
57
|
|
|
{ |
58
|
5 |
|
$this->reps[$pid] = $response; |
59
|
5 |
|
} |
60
|
|
|
|
61
|
|
|
/** |
62
|
|
|
* Return ResponseRecord if it exists or null if it does not exist. |
63
|
|
|
* |
64
|
|
|
* @param string $pid |
65
|
|
|
* @return ResponseRecord |
66
|
|
|
*/ |
67
|
1 |
|
protected function getResponse($pid) |
68
|
|
|
{ |
69
|
1 |
|
return $this->reps[$pid]; |
70
|
|
|
} |
71
|
|
|
|
72
|
|
|
/** |
73
|
|
|
* Mark ResponseRecord as handled if it exists that and has protocol ID equal to $pid. |
74
|
|
|
* |
75
|
|
|
* @param string $pid |
76
|
|
|
* @param $exception |
77
|
|
|
*/ |
78
|
2 |
|
protected function resolveOrRejectResponse($pid, $exception) |
79
|
|
|
{ |
80
|
2 |
|
if ($exception !== TaskIncompleteException::class) |
81
|
|
|
{ |
82
|
2 |
|
unset($this->reps[$pid]); |
83
|
2 |
|
$this->handledReps[$pid] = new ResponseRecord($pid, '', TimeSupport::now() + $this->handledRepsTimeout); |
84
|
|
|
} |
85
|
2 |
|
} |
86
|
|
|
|
87
|
|
|
/** |
88
|
|
|
* Return all unhandled ResponseRecords in array form. |
89
|
|
|
* |
90
|
|
|
* @return ResponseRecord[] |
91
|
|
|
*/ |
92
|
1 |
View Code Duplication |
protected function unfinishedResponses() |
|
|
|
|
93
|
|
|
{ |
94
|
1 |
|
$now = TimeSupport::now(); |
95
|
1 |
|
$unfinishedReps = []; |
96
|
|
|
|
97
|
1 |
|
foreach ($this->reps as $pid=>$response) |
98
|
|
|
{ |
99
|
1 |
|
if ($now >= $response->timeout) |
100
|
|
|
{ |
101
|
1 |
|
$unfinishedReps[] = $response; |
102
|
1 |
|
$response->timeout = $now + $response->timeoutIncrease; |
103
|
|
|
} |
104
|
|
|
} |
105
|
|
|
|
106
|
1 |
|
return $unfinishedReps; |
107
|
|
|
} |
108
|
|
|
|
109
|
|
|
/** |
110
|
|
|
* Expire unhandled ResponseRecords. |
111
|
|
|
*/ |
112
|
1 |
View Code Duplication |
protected function expireResponses() |
|
|
|
|
113
|
|
|
{ |
114
|
1 |
|
$now = TimeSupport::now(); |
115
|
1 |
|
$expiredReps = []; |
116
|
|
|
|
117
|
1 |
|
foreach ($this->handledReps as $pid=>$response) |
118
|
|
|
{ |
119
|
1 |
|
if ($now >= $response->timeout) |
120
|
|
|
{ |
121
|
1 |
|
$expiredReps[] = $pid; |
122
|
|
|
} |
123
|
|
|
} |
124
|
|
|
|
125
|
1 |
|
foreach ($expiredReps as $pid) |
126
|
|
|
{ |
127
|
1 |
|
unset($this->handledReps[$pid]); |
128
|
|
|
} |
129
|
1 |
|
} |
130
|
|
|
} |
131
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.