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' ); } } }