Skip to content

TopicPeriodicTimer only registered for one Topic, wrongly cleared if any one Topic has zero connections #476

@Androbin

Description

@Androbin

Description

The function TopicPeriodicTimerInterface::registerPeriodicTimer takes a Topic parameter, but once the first Topic registers a timer, it is not called for any additional Topic. Furthermore, if any one Topic has zero connections, any and all timers registered within the TopicInterface are cleared.

Example code

<?php

namespace App\Websocket\Topic;

use Gos\Bundle\WebSocketBundle\Topic\TopicPeriodicTimerInterface;
use Gos\Bundle\WebSocketBundle\Topic\TopicPeriodicTimerTrait;
use Ratchet\Wamp\Topic;

class AcmePeriodicTopic extends AcmeTopic implements TopicPeriodicTimerInterface
{
    use TopicPeriodicTimerTrait;

    public function registerPeriodicTimer(Topic $topic): void
    {
        // Adds the periodic timer the first time a client connects to the topic
        $this->periodicTimer->addPeriodicTimer(
            $this,
            'hello',
            300,
            function () use ($topic) {
                $topic->broadcast('Hello world');
            }
        );
    }

    /**
     * Name of the topic.
     */
    public function getName(): string
    {
        return 'acme.periodic.topic';
    }
}

Steps

  • client 1 subscribes to acme/foo
  • timer is registered for acme/foo
  • client 2 subscribes to acme/bar
  • timer isn't registered for acme/bar
  • client 2 unsubscribes from acme/bar
  • timer is cleared for acme/foo

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions