%PDF- %PDF-
| Direktori : /home/graphicd/public_html/vebto/vendor/kreait/firebase-php/src/Firebase/ |
| Current File : /home/graphicd/public_html/vebto/vendor/kreait/firebase-php/src/Firebase/Messaging.php |
<?php
declare(strict_types=1);
namespace Kreait\Firebase;
use GuzzleHttp\Promise\Utils;
use Kreait\Firebase\Exception\InvalidArgumentException;
use Kreait\Firebase\Exception\Messaging\InvalidArgument;
use Kreait\Firebase\Exception\Messaging\NotFound;
use Kreait\Firebase\Exception\MessagingException;
use Kreait\Firebase\Http\ResponseWithSubResponses;
use Kreait\Firebase\Messaging\ApiClient;
use Kreait\Firebase\Messaging\AppInstance;
use Kreait\Firebase\Messaging\AppInstanceApiClient;
use Kreait\Firebase\Messaging\CloudMessage;
use Kreait\Firebase\Messaging\Http\Request\SendMessage;
use Kreait\Firebase\Messaging\Http\Request\SendMessages;
use Kreait\Firebase\Messaging\Http\Request\SendMessageToTokens;
use Kreait\Firebase\Messaging\Message;
use Kreait\Firebase\Messaging\Messages;
use Kreait\Firebase\Messaging\MulticastSendReport;
use Kreait\Firebase\Messaging\RegistrationToken;
use Kreait\Firebase\Messaging\RegistrationTokens;
use Kreait\Firebase\Messaging\Topic;
use Kreait\Firebase\Project\ProjectId;
use Kreait\Firebase\Util\JSON;
class Messaging implements Contract\Messaging
{
/** @var string */
private $projectId;
/** @var ApiClient */
private $messagingApi;
/** @var AppInstanceApiClient */
private $appInstanceApi;
/**
* @internal
*/
public function __construct(ProjectId $projectId, ApiClient $messagingApiClient, AppInstanceApiClient $appInstanceApiClient)
{
$this->messagingApi = $messagingApiClient;
$this->appInstanceApi = $appInstanceApiClient;
$this->projectId = $projectId->value();
}
public function send($message, bool $validateOnly = false): array
{
$message = $this->makeMessage($message);
$request = new SendMessage($this->projectId, $message, $validateOnly);
try {
$response = $this->messagingApi->send($request);
} catch (NotFound $e) {
$token = $message->jsonSerialize()['token'] ?? null;
if ($token) {
throw NotFound::becauseTokenNotFound($token);
}
throw $e;
}
return JSON::decode((string) $response->getBody(), true);
}
public function sendMulticast($message, $registrationTokens, bool $validateOnly = false): MulticastSendReport
{
$message = $this->makeMessage($message);
$registrationTokens = $this->ensureNonEmptyRegistrationTokens($registrationTokens);
$request = new SendMessageToTokens($this->projectId, $message, $registrationTokens, $validateOnly);
/** @var ResponseWithSubResponses $response */
$response = $this->messagingApi->send($request);
return MulticastSendReport::fromRequestsAndResponses($request->subRequests(), $response->subResponses());
}
public function sendAll($messages, bool $validateOnly = false): MulticastSendReport
{
$ensuredMessages = [];
foreach ($messages as $message) {
$ensuredMessages[] = $this->makeMessage($message);
}
$request = new SendMessages($this->projectId, new Messages(...$ensuredMessages), $validateOnly);
/** @var ResponseWithSubResponses $response */
$response = $this->messagingApi->send($request);
return MulticastSendReport::fromRequestsAndResponses($request->subRequests(), $response->subResponses());
}
public function validate($message): array
{
return $this->send($message, true);
}
public function validateRegistrationTokens($registrationTokenOrTokens): array
{
$registrationTokenOrTokens = $this->ensureNonEmptyRegistrationTokens($registrationTokenOrTokens);
$report = $this->sendMulticast(CloudMessage::new(), $registrationTokenOrTokens, true);
return [
'valid' => $report->validTokens(),
'unknown' => $report->unknownTokens(),
'invalid' => $report->invalidTokens(),
];
}
public function subscribeToTopic($topic, $registrationTokenOrTokens): array
{
return $this->subscribeToTopics([$topic], $registrationTokenOrTokens);
}
public function subscribeToTopics(iterable $topics, $registrationTokenOrTokens): array
{
$topicObjects = [];
foreach ($topics as $topic) {
$topicObjects[] = $topic instanceof Topic ? $topic : Topic::fromValue($topic);
}
$tokens = $this->ensureNonEmptyRegistrationTokens($registrationTokenOrTokens);
return $this->appInstanceApi->subscribeToTopics($topicObjects, $tokens);
}
public function unsubscribeFromTopic($topic, $registrationTokenOrTokens): array
{
return $this->unsubscribeFromTopics([$topic], $registrationTokenOrTokens);
}
public function unsubscribeFromTopics(array $topics, $registrationTokenOrTokens): array
{
$topics = \array_map(static function ($topic) {
return $topic instanceof Topic ? $topic : Topic::fromValue($topic);
}, $topics);
$tokens = $this->ensureNonEmptyRegistrationTokens($registrationTokenOrTokens);
return $this->appInstanceApi->unsubscribeFromTopics($topics, $tokens);
}
public function unsubscribeFromAllTopics($registrationTokenOrTokens): array
{
$tokens = $this->ensureNonEmptyRegistrationTokens($registrationTokenOrTokens);
$promises = [];
foreach ($tokens as $token) {
$promises[$token->value()] = $this->appInstanceApi->getAppInstanceAsync($token)
->then(function (AppInstance $appInstance) use ($token) {
$topics = [];
foreach ($appInstance->topicSubscriptions() as $subscription) {
$topics[] = $subscription->topic()->value();
}
return \array_keys($this->unsubscribeFromTopics($topics, $token));
})
->otherwise(static function (\Throwable $e) {
return $e->getMessage();
});
}
$responses = Utils::settle($promises)->wait();
$result = [];
foreach ($responses as $token => $response) {
$result[(string) $token] = $response['value'];
}
return $result;
}
public function getAppInstance($registrationToken): AppInstance
{
$token = $registrationToken instanceof RegistrationToken
? $registrationToken
: RegistrationToken::fromValue($registrationToken);
try {
return $this->appInstanceApi->getAppInstanceAsync($token)->wait();
} catch (NotFound $e) {
throw NotFound::becauseTokenNotFound($token->value());
} catch (MessagingException $e) {
// The token is invalid
throw new InvalidArgument("The registration token '{$token}' is invalid or not available", $e->getCode(), $e);
}
}
/**
* @param Message|array<string, mixed> $message
*
* @throws InvalidArgumentException
*/
private function makeMessage($message): Message
{
if ($message instanceof Message) {
return $message;
}
return CloudMessage::fromArray($message);
}
/**
* @param RegistrationTokens|RegistrationToken|RegistrationToken[]|string[]|string $value
*
* @throws InvalidArgument
*/
private function ensureNonEmptyRegistrationTokens($value): RegistrationTokens
{
try {
$tokens = RegistrationTokens::fromValue($value);
} catch (InvalidArgumentException $e) {
// We have to wrap the exception for BC reasons
throw new InvalidArgument($e->getMessage());
}
if ($tokens->isEmpty()) {
throw new InvalidArgument('Empty list of registration tokens.');
}
return $tokens;
}
}