JFIF  x x C         C     "        } !1AQa "q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz        w !1AQ aq"2B #3Rbr{ gilour
<?php declare(strict_types=1); namespace Kreait\Firebase\AppCheck; use Beste\Json; use GuzzleHttp\ClientInterface; use Kreait\Firebase\Exception\AppCheckApiExceptionConverter; use Kreait\Firebase\Exception\AppCheckException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\UriInterface; use Throwable; /** * @internal * * @phpstan-import-type AppCheckTokenShape from AppCheckToken */ final class ApiClient { public function __construct( private readonly ClientInterface $client, private readonly AppCheckApiExceptionConverter $errorHandler, ) { } /** * @throws AppCheckException * * @return AppCheckTokenShape */ public function exchangeCustomToken(string $appId, string $customToken): array { $response = $this->requestApi('POST', 'apps/'.$appId.':exchangeCustomToken', [ 'headers' => [ 'Content-Type' => 'application/json; UTF-8', ], 'body' => Json::encode([ 'customToken' => $customToken, ]), ]); /** @var AppCheckTokenShape $decoded */ $decoded = Json::decode((string) $response->getBody(), true); return $decoded; } /** * @param non-empty-string $method * @param array<string, mixed>|null $options * @throws AppCheckException */ private function requestApi(string $method, string|UriInterface $uri, ?array $options = null): ResponseInterface { $options ??= []; try { return $this->client->request($method, $uri, $options); } catch (Throwable $e) { throw $this->errorHandler->convertException($e); } } }