LockingMiddleware   A
last analyzed

Complexity

Total Complexity 5

Size/Duplication

Total Lines 61
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 0

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 5
lcom 1
cbo 0
dl 0
loc 61
ccs 17
cts 17
cp 1
rs 10
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A execute() 0 22 3
A executeQueuedJobs() 0 9 2
1
<?php
2
3
namespace League\Tactician\Plugins;
4
5
use League\Tactician\Middleware;
6
7
/**
8
 * If another command is already being executed, locks the command bus and
9
 * queues the new incoming commands until the first has completed.
10
 */
11
class LockingMiddleware implements Middleware
12
{
13
    /**
14
     * @var bool
15
     */
16
    private $isExecuting;
17
18
    /**
19
     * @var callable[]
20
     */
21
    private $queue = [];
22
23
    /**
24
     * Execute the given command... after other running commands are complete.
25
     *
26
     * @param object   $command
27
     * @param callable $next
28
     *
29
     * @throws \Exception
30
     *
31
     * @return mixed|void
32
     */
33
    public function execute($command, callable $next)
34
    {
35 8
        $this->queue[] = function () use ($command, $next) {
36 8
            return $next($command);
37
        };
38
39 8
        if ($this->isExecuting) {
40 4
            return;
41
        }
42 8
        $this->isExecuting = true;
43
44
        try {
45 8
            $returnValue = $this->executeQueuedJobs();
46 3
        } catch (\Exception $e) {
47 3
            $this->isExecuting = false;
48 3
            $this->queue = [];
49 3
            throw $e;
50
        }
51
52 7
        $this->isExecuting = false;
53 7
        return $returnValue;
54
    }
55
56
    /**
57
     * Process any pending commands in the queue. If multiple, jobs are in the
58
     * queue, only the first return value is given back.
59
     *
60
     * @return mixed
61
     */
62 8
    protected function executeQueuedJobs()
63
    {
64 8
        $returnValues = [];
65 8
        while ($resumeCommand = array_shift($this->queue)) {
66 8
            $returnValues[] = $resumeCommand();
67
        }
68
69 7
        return array_shift($returnValues);
70
    }
71
}
72