mercureact/src/Broker/TopicManager.php

51 lines
1.1 KiB
PHP

<?php
namespace NoccyLabs\Mercureact\Broker;
use SplObjectStorage;
class TopicManager
{
/** @var array<string,Topic> */
private array $topics = [];
public function getTopic(string $topic): Topic
{
if (!isset($this->topics[$topic])) {
$this->topics[$topic] = new Topic($topic);
}
return $this->topics[$topic];
}
public function publish(Message $message): void
{
foreach ($message->topic as $topic) {
$this->getTopic($topic)->publish($message);
}
}
public function getTopicCount(): int
{
return count($this->topics);
}
public function getSubscriberCount(): int
{
return array_sum(array_map(fn($t) => $t->getSubscriberCount(), $this->topics));
}
public function garbageCollect(): void
{
$this->topics = array_filter(
$this->topics,
function (Topic $topic) {
$topic->garbageCollect();
return ($topic->getHistorySize() > 0 && $topic->getSubscriberCount() > 0) || ($topic->getAge() < 60);
}
);
}
}