/** * @param ClientSession $session * @param EventMessage $msg */ public function processEvent(ClientSession $session, EventMessage $msg) { foreach ($this->subscriptions as $key => $subscription) { if ($subscription["subscription_id"] === $msg->getSubscriptionId()) { call_user_func_array($subscription["callback"], [$msg->getArguments(), $msg->getArgumentsKw(), $msg->getDetails(), $msg->getPublicationId()]); break; } } }
/** * @param Session $session * @param PublishMessage $msg */ public function processPublish(Session $session, PublishMessage $msg) { $this->manager->debug("processing publish message"); $receivers = isset($this->topics[$msg->getTopicName()]) ? $this->topics[$msg->getTopicName()] : null; //If the topic doesn't have any subscribers if (empty($receivers)) { $receivers = array(); } // see if they wanted confirmation $options = $msg->getOptions(); if (is_array($options)) { if (isset($options['acknowledge']) && $options['acknowledge'] == true) { $publicationId = Session::getUniqueId(); $session->sendMessage(new PublishedMessage($msg->getRequestId(), $publicationId)); } } $eventMsg = EventMessage::createFromPublishMessage($msg); /* @var $receiver Session */ foreach ($receivers as $receiver) { if ($receiver != $session) { $receiver->sendMessage($eventMsg); } } }
/** * @param Session $session * @param EventMessage $msg * @param Subscription $subscription */ private function disclosePublisherOption(Session $session, EventMessage $msg, Subscription $subscription) { if ($subscription->isDisclosePublisher() === true) { $details = ["caller" => $session->getSessionId(), "authid" => $session->getAuthenticationDetails()->getAuthId(), "authrole" => $session->getAuthenticationDetails()->getAuthRole(), "authroles" => $session->getAuthenticationDetails()->getAuthRoles(), "authmethod" => $session->getAuthenticationDetails()->getAuthMethod()]; $msg->setDetails(array_merge($msg->getDetails(), $details)); } }
/** * @param EventMessage $msg */ public function sendEventMessage(EventMessage $msg) { if ($this->pausedForState && !$msg->isRestoringState()) { $this->pauseQueue->enqueue($msg); return; } $this->getSession()->sendMessage($msg); }
/** * Send an Event Message for each subscription * @param Session $session * @param PublishMessage $msg * @param Subscription $subscription */ private function sendEventMessage(Session $session, PublishMessage $msg, Subscription $subscription) { $sessionId = $subscription->getSession()->getSessionId(); $authroles = []; $authid = ""; $authenticationDetails = $subscription->getSession()->getAuthenticationDetails(); if ($authenticationDetails) { $authroles = $authenticationDetails->getAuthRoles(); $authid = $authenticationDetails->getAuthId(); } if ((!$msg->excludeMe() || $subscription->getSession() != $session) && !$msg->isExcluded($sessionId) && $msg->isWhiteListed($sessionId) && $msg->hasEligibleAuthrole($authroles) && $msg->hasEligibleAuthid($authid)) { $eventMsg = EventMessage::createFromPublishMessage($msg, $subscription->getId()); if ($subscription->isDisclosePublisher() === true) { $eventMsg->disclosePublisher($session); } if ($this->getMatchType() != "exact") { $eventMsg->getDetails()->topic = $msg->getUri(); } $subscription->sendEventMessage($eventMsg); } }
protected function assertEventMessagesEqual(EventMessage $em1, EventMessage $em2) { // we are not checking the publication id or subscription $em2->setPublicationId($em1->getPublicationId()); $em2->setSubscriptionId($em1->getSubscriptionId()); $this->assertEquals(json_encode($em1), json_encode($em2), "EventMessages are equal"); }