51 lines
1.1 KiB
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);
|
|
}
|
|
);
|
|
}
|
|
|
|
}
|
|
|