Tokbox - не позволяйте одному и тому же пользователю публиковать дважды

Если пользователь публикует сеанс tokbox и по какой-либо причине тот же пользователь входит в систему на другом устройстве или повторно открывает сеанс в другом окне браузера, я хочу остановить публикацию второго.

К счастью, в метаданных для потоков я сохраняю идентификатор пользователя, поэтому, когда есть список потоков, легко увидеть, принадлежит ли существующий поток вошедшему в систему пользователю.

Когда издатель инициализируется, происходит следующее:

  1. Слушайте session.on("streamCreated"), когда это произойдет, подпишитесь на новые потоки
  2. Начать публикацию

Проблема в том, что когда сеанс инициализируется, нет возможности проверить текущие потоки сеанса, чтобы узнать, публикует ли уже этот пользователь. Мы не знаем, что это за потоки, пока не сработает обратный вызов on("streamCreated").

У меня есть подозрение, что есть простое решение, которое мне не хватает. Любые идеи?


person dylanjha    schedule 08.04.2016    source источник


Ответы (1)


Я предполагаю, что, когда вы сказали, что сохраняете идентификатор пользователя в метаданных потока, это означает, что при инициализации издателя вы устанавливаете свойство «имя». Это отличная техника.

Моя идея немного хак, но это лучшее, что я могу придумать прямо сейчас. Я бы решил эту проблему, по существу разбив подписку на потоки на 2 этапа:

  1. все потоки, созданные до этого подключения клиента
  2. все потоки, созданные после

Во время # 1 я проверял свойство «имя» каждого потока, чтобы узнать, принадлежит ли оно пользователю в этом клиентском соединении. Если это так, то вы знаете, что они входят в сеанс дважды, и вы можете установить флаг (давайте назовем его "userRejoining". Чтобы знать, что № 1 завершен, я бы установил таймер (вот почему я называю это взломом) в течение разумного промежутка времени, например, 1 секунду каждый раз, когда приходит событие "streamCreated", и удалите любой предыдущий таймер.

Затем, если флаг "userRejoining" не установлен, издатель инициализируется и публикуется в сеансе.

Во время #2 вы просто подписываетесь на любой созданный поток.

Недостатком является то, что теперь вы задерживаете публикацию пользователями примерно на 1 секунду везде. В сценариях с большими группами это может стать препятствием, но в небольших (1:1) типах сеансов это должно быть приемлемо. Я надеюсь, что это объяснение понятно, а если нет, я могу попытаться написать для вас пример кода.

person Ankur    schedule 10.04.2016
comment
Примечание: каждый поток имеет свойство createTime, которое можно использовать, чтобы выяснить, старше ли оно вашего собственного соединения или нет. Я не думаю, что это полезно здесь, потому что это не помогает определить, когда все старые потоки завершены и когда вы можете определить, что находитесь в фазе 2 (сверху). - person Ankur; 10.04.2016