2016-04-08 6 views
1

Wenn ein Benutzer in einer Tokbox-Sitzung veröffentlicht und aus irgendeinem Grund, dass sich derselbe Benutzer auf einem anderen Gerät anmeldet oder die Sitzung in einem anderen Browserfenster erneut öffnet, möchte ich aufhören der zweite aus dem Verlagswesen.Tokbox- lassen Sie denselben Benutzer nicht zweimal veröffentlichen

Zum Glück auf den Metadaten für die Ströme, ich bin der Benutzer-ID zu speichern, so dass, wenn es eine Liste von Streams ist es leicht zu sehen, ob ein vorhandener Strom zu dem Benutzer gehört, der angemeldet ist.

Wenn wird ein Verlag geschieht folgendes initialisiert:

  1. Hören für session.on("streamCreated"), wenn dies geschieht, abonnieren Sie neuen Streams
  2. startet Veröffentlichung

Das Problem ist, wenn die Sitzung initialisiert wird, gibt es keine Möglichkeit, die aktuellen Datenströme der Sitzung zu überprüfen, um festzustellen, ob dieser Benutzer bereits veröffentlicht. Wir wissen nicht, was die Streams sind, bis der Rückruf on("streamCreated") ausgelöst wird.

Ich habe eine Ahnung, dass es eine einfache Lösung gibt, die ich vermisse. Irgendwelche Ideen?

Antwort

1

Ich nehme an, dass, wenn Sie sagten, dass Sie die Benutzer-ID in den Stream-Metadaten speichern, das bedeutet, wenn Sie den Verleger initialisieren, legen Sie die Eigenschaft "Name" fest. Das ist eine großartige Technik.

Meine Idee ist ein bisschen ein Hack, aber es ist das Beste, was ich im Moment finden kann. Ich würde dieses Problem im wesentlichen lösen, indem Sie das Abonnement von Strömen in 2 Phasen Zerschlagung:

  1. alle Streams erstellt diese Client-Verbindung vor
  2. alle Ströme nach erstellt

Während # 1 Ich würde die "Name" -Eigenschaft jedes Streams prüfen, um zu sehen, ob er dem Benutzer bei dieser Client-Verbindung gehört. Wenn dies der Fall ist, wissen Sie, dass sie die Sitzung zweimal betreten und Sie können ein Flag setzen (lassen Sie es "userRejoining" anrufen. Um zu wissen, dass # 1 abgeschlossen ist, würde ich einen Timer setzen (deshalb nenne ich es einen Hack) für einen angemessenen Zeitraum, wie 1 Sekunde jedes Mal, wenn ein "streamCreated" Ereignis eintrifft, und die alle vorherigen Timer entfernen.

wenn dann die "userRejoining" Flag nicht gesetzt ist, wird der Publisher auf die Sitzung initialisiert und veröffentlicht.

Während # 2, abonnieren Sie einfach zu jedem Stream, die erstellt wird.

der Nachteil ist, dass Sie jetzt Ihre Benutzererfahrung der Veröffentlichung von ~ 1 Sekunde everywhe verzögert haben Re. In größeren Gruppenszenarien könnte dies ein Deal Breaker sein, aber in kleineren (1: 1) Arten von Sitzungen sollte dies akzeptabel sein. Ich hoffe, dass diese Erklärung klar ist, und wenn nicht, kann ich versuchen, einen Beispielcode für Sie zu schreiben.

+0

Hinweis: Jeder Stream verfügt über eine "creationTime" -Eigenschaft, die verwendet werden kann, um herauszufinden, ob es älter ist als Ihre eigene Verbindung oder nicht. Ich denke nicht, dass es hier nützlich ist, weil es nicht hilft festzustellen, wann alle älteren Streams vollständig sind und wann Sie feststellen können, dass Sie sich in Phase 2 (von oben) befinden. – Ankur