LockingMiddleware::executeQueuedJobs()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 9
ccs 5
cts 5
cp 1
rs 9.9666
c 0
b 0
f 0
cc 2
nc 2
nop 0
crap 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