Completed
Pull Request — master (#12)
by thomas
19:02 queued 01:07
created

Session::getDevice()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 3
ccs 1
cts 1
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 1
nc 1
nop 0
crap 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace BitWasp\Trezor\Bridge;
6
7
use BitWasp\Trezor\Bridge\Exception\InactiveSessionException;
8
use BitWasp\Trezor\Bridge\Message\Device;
9
use BitWasp\Trezor\Device\Exception\FailureException;
10
use BitWasp\Trezor\Device\Message;
11
use BitWasp\Trezor\Device\MessageBase;
12
use BitWasp\TrezorProto\Failure;
13
use GuzzleHttp\Promise\PromiseInterface;
14
15
class Session
16
{
17
    /**
18
     * @var Client
19
     */
20
    private $client;
21
22
    /**
23
     * @var Device
24
     */
25
    private $device;
26
27
    /**
28
     * @var string
29
     */
30
    private $sessionId;
31
32
    /**
33
     * @var bool
34
     */
35
    private $active = true;
36
37
    /**
38
     * Session constructor.
39
     * @param Client $client
40
     * @param Device $device
41
     * @param string $sessionId
42 32
     */
43
    public function __construct(Client $client, Device $device, string $sessionId)
44 32
    {
45 32
        $this->client = $client;
46 32
        $this->device = $device;
47 32
        $this->sessionId = $sessionId;
48
    }
49
50
    /**
51
     * @throws InactiveSessionException
52 32
     */
53
    private function assertSessionIsActive()
54 32
    {
55 1
        if (!$this->active) {
56
            throw new InactiveSessionException("Attempted command on inactive session");
57 32
        }
58
    }
59
60
    /**
61
     * @return bool
62 2
     */
63
    public function isActive(): bool
64 2
    {
65
        return $this->active;
66
    }
67
68
    /**
69
     * @throws InactiveSessionException
70 2
     */
71
    public function release()
72 2
    {
73 2
        $this->assertSessionIsActive();
74 2
        $this->client->release($this->sessionId);
75 2
        $this->active = false;
76
    }
77
78
    /**
79
     * @return string
80
     * @throws InactiveSessionException
81 30
     */
82
    public function getSessionId(): string
83 30
    {
84 30
        $this->assertSessionIsActive();
85
        return $this->sessionId;
86
    }
87
88
    /**
89
     * @return Device
90 2
     */
91
    public function getDevice(): Device
92 2
    {
93
        return $this->device;
94
    }
95
96
    /**
97
     * @param MessageBase $request
98
     * @return PromiseInterface
99
     */
100
    public function sendMessageAsync(MessageBase $request): PromiseInterface
101 29
    {
102
        $this->assertSessionIsActive();
103 29
        return $this->client->callAsync($this->getSessionId(), $request)
104 28
            ->then(function (Message $message): \Protobuf\Message {
105 28
                $proto = $message->getProto();
106 28
                if ($proto instanceof Failure) {
107 1
                    FailureException::handleFailure($proto);
108
                }
109
110 28
                return $proto;
111
            });
112
    }
113
114
    /**
115
     * @param MessageBase $message
116
     * @return \Protobuf\Message
117
     * @throws FailureException
118
     * @throws InactiveSessionException
119
     */
120
    public function sendMessage(MessageBase $message): \Protobuf\Message
121
    {
122
        $this->assertSessionIsActive();
123
        return $this->sendMessageAsync($message)
124
            ->wait(true);
125
    }
126
127
    /**
128
     * @param MessageBase $message
129
     * @throws FailureException
130
     * @throws InactiveSessionException
131
     */
132
    public function postMessage(MessageBase $message)
133
    {
134
        $this->assertSessionIsActive();
135
        return $this->client->post($this->getSessionId(), $message);
136
    }
137
}
138