Initial commit
This commit is contained in:
50
src/Broker/TopicManager.php
Normal file
50
src/Broker/TopicManager.php
Normal file
@ -0,0 +1,50 @@
|
||||
<?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);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user