-
Notifications
You must be signed in to change notification settings - Fork 16
/
TransportBuilder.php
134 lines (117 loc) · 3.39 KB
/
TransportBuilder.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<?php
/**
* Elastic Transport
*
* @link https://github.com/elastic/elastic-transport-php
* @copyright Copyright (c) Elasticsearch B.V (https://www.elastic.co)
* @license https://opensource.org/licenses/MIT MIT License
*
* Licensed to Elasticsearch B.V under one or more agreements.
* Elasticsearch B.V licenses this file to you under the MIT License.
* See the LICENSE file in the project root for more information.
*/
declare(strict_types=1);
namespace Elastic\Transport;
use Elastic\Transport\NodePool\NodePoolInterface;
use Elastic\Transport\NodePool\SimpleNodePool;
use Elastic\Transport\Exception;
use Elastic\Transport\NodePool\Resurrect\NoResurrect;
use Elastic\Transport\NodePool\Selector\RoundRobin;
use Http\Discovery\Psr18ClientDiscovery;
use OpenTelemetry\API\Trace\TracerInterface;
use Psr\Http\Client\ClientInterface;
use Psr\Log\LoggerInterface;
use Psr\Log\NullLogger;
use Throwable;
class TransportBuilder
{
protected ClientInterface $client;
protected NodePoolInterface $nodePool;
protected LoggerInterface $logger;
protected array $hosts = [];
protected TracerInterface $OTelTracer;
final public function __construct()
{
}
public static function create(): TransportBuilder
{
return new static();
}
public function setClient(ClientInterface $client): self
{
$this->client = $client;
return $this;
}
public function getClient(): ClientInterface
{
if (empty($this->client)) {
$this->client = Psr18ClientDiscovery::find();
}
return $this->client;
}
public function setNodePool(NodePoolInterface $nodePool): self
{
$this->nodePool = $nodePool;
return $this;
}
public function getNodePool(): NodePoolInterface
{
if (empty($this->nodePool)) {
$this->nodePool = new SimpleNodePool(
new RoundRobin(),
new NoResurrect()
);
}
return $this->nodePool;
}
public function setLogger(LoggerInterface $logger): self
{
$this->logger = $logger;
return $this;
}
public function getLogger(): LoggerInterface
{
if (empty($this->logger)) {
$this->logger = new NullLogger();
}
return $this->logger;
}
public function setHosts(array $hosts): self
{
$this->hosts = $hosts;
return $this;
}
public function getHosts(): array
{
return $this->hosts;
}
public function setCloudId(string $cloudId): self
{
$this->hosts = [$this->parseElasticCloudId($cloudId)];
return $this;
}
public function build(): Transport
{
return new Transport(
$this->getClient(),
$this->getNodePool()->setHosts($this->hosts),
$this->getLogger()
);
}
/**
* Return the URL of Elastic Cloud from the Cloud ID
*/
private function parseElasticCloudId(string $cloudId): string
{
try {
list($name, $encoded) = explode(':', $cloudId);
list($uri, $uuids) = explode('$', base64_decode($encoded));
list($es,) = explode(':', $uuids);
return sprintf("https://%s.%s", $es, $uri);
} catch (Throwable $t) {
throw new Exception\CloudIdParseException(
'Cloud ID not valid'
);
}
}
}