Sip.js: Die Funktion UserAgent.stop() dauert zu lange

Erstellt am 6. Okt. 2020  ·  7Kommentare  ·  Quelle: onsip/SIP.js

Beschreibe den Fehler
Aus irgendeinem Grund dauert es bei Verwendung der Funktion "UserAgent.stop()" etwa 30 Sekunden, bis alles gestoppt ist, bis es mit der entsprechenden Zusage antwortet.

Was ich erreichen möchte, ist ein vollständiger Unregister-Befehl, bei dem nicht nur eine Deregistrierung durchgeführt wird, sondern auch:

  1. Löschen aller SIP-Abonnements.
  2. Schließen der Web-Socket-Verbindung.

Soweit ich weiß, macht die Funktion "stop()" genau das. Nur dauert es zu lange.

Protokolle
Hier sind die Protokolle von der Konsole: Protokolle

Beobachtetes Verhalten
Erst nach ca. 32 Sekunden sehen wir: 15:14:05.797
Folgendes Protokoll:
sip.subscribe-dialog | Timer N expired for SUBSCRIBE dialog. Timed out waiting for NOTIFY.
Erst nach obigem Protokoll werden die Verlage und die Transport-(WS)-Ebene freigegeben.
Was mich denken lässt, dass es aufgrund dieser ABONNIEREN-Nachricht passieren kann, dass der Timer abgelaufen ist, aber nicht ganz sicher ist.

Umweltinformationen

  • Kamailio 5.3.5 (Web-Socket)
  • Google Chrome 85.0.4183.121

    • SIP.JS 0.17.1

bug

Hilfreichster Kommentar

Ich habe das gleiche Problem. Ich habe keine Abos. Für mich dauert das Schließen des WebSockets zu lange (20-50 Sek.)

Ich habe es versucht:

  • Objekt manuell zerstören, wie @slavikbialik vorschlägt.
  • Schließen Sie das WebSocket manuell mit userAgent.transport.ws.close() , um sicherzustellen, dass mein Problem mit WebSocket zusammenhängt.
  • in Chrome und Firefox.

Ich habe keine spezifischen Konfigurationen, bin einfach der SIP.js-Anleitung gefolgt, um sie zu reproduzieren. Ich weiß nicht, ob dies hilft oder mit meinem Problem zusammenhängt, aber ich habe versucht, ein WebSocket mit SIP-Protokoll ohne Bibliothek zu öffnen und es geschlossen. Beide hielten unter 1 Sekunde.

wss

Alle 7 Kommentare

Habe es im Code bestätigt...

@john-e-riordan Dies scheint ein Problem mit der Betriebsordnung zu sein.

An der Spitze von user-agent.stop() wir in den Zustand Stopped .

Dann durchlaufen wir registerers , sessions und dann subscriptions .

Die Funktion subscription.dispose() sendet zu Recht ein SUBSCRIBE mit einem Expires=0 Header. Dadurch wird ein NOTIFY an SIP.js gesendet, das anzeigt, dass das Abonnement geschlossen wurde. Es gibt jedoch einen Check in user-agent.onTransportMessage() , der prüft, ob das user-agent gestoppt wird. Und dann die NOTIFY wegen des User-Agent-Status fallen lassen. Veranlasst den Abonnenten, auf das Timeout zu warten.

Wir werden daran arbeiten, dies zu patchen. Vielen Dank.

dass das Abonnement geschlossen wurde. Es gibt jedoch einen Check in user-agent.onTransportMessage() , der prüft, ob user-agent gestoppt wird. Und dann das `NOTIFY wegen . fallen lassen

Vielen Dank für die schnelle Reaktion und die Suche nach der Ursache des Problems! Hoffe es wird bald behoben :)
Übrigens habe ich die stop() Funktion getestet, wenn ich nicht mein anfängliches SIP SUBSCRIBE mache, das ich auch mache, wenn ich das REGISTER mache, und alles funktioniert schnell. Aber natürlich brauche ich dieses ABONNIEREN.
Nochmals vielen Dank!

Um dies zu umgehen, können Sie Ihre Abonnements manuell entsorgen, bevor Sie stop() auf dem User-Agent aufrufen.

Um dies zu umgehen, können Sie Ihre Abonnements manuell entsorgen, bevor Sie stop() auf dem User-Agent aufrufen.

Vielen Dank! Schon gemacht, aber nicht effizient, denke ich. Wenn Sie mir einen besseren Weg vorschlagen können, ist es sehr hilfreich.
Ich habe einige Abonnements, die ich abschließe, während der Benutzer registriert ist (wie Anwesenheit, Konferenz und einige andere Ereignisse).
Gibt es eine Möglichkeit, alle aktiven Abonnements zu durchlaufen und die Methode dispose oder unsubscribe aufzurufen?
Ich habe gesehen, dass ich die Abonnementliste erhalten kann, indem ich Folgendes tue: userAgentObject._subscriptions und sie bekommt eine Reihe von Abonnenten und aus irgendeinem Grund kann ich sie nicht nehmen und etwas damit machen, wie Iteration oder etwas anderes.

So wie ich es derzeit gemacht habe, aber auch hier gefällt es mir nicht, für jeden Abonnenten-Ereignistyp habe ich den Abonnenten in einer anderen globalen Variablen in der Klasse gespeichert und für jede Abonnenten-Variable nenne ich das unsubscribe Methode.

Übrigens, was ist der Unterschied zwischen dispose und unsubscribe ? Ich gehe davon aus, dass dispose das Abonnement in der PBX nicht abbestellen wird. Richtig? Wenn ja, halte ich es für weniger empfehlenswert, da die PBX in meinem Fall, wenn ich mich nicht vollständig abmelde, weiterhin irrelevante NOTIFY-Nachrichten an mein Kamailio sendet (was zu einer vollständigen Sperre führen kann, da Kamailio meine PBX blockiert, wenn dies der Fall ist.) ihn überfordern).

Um dies zu umgehen, können Sie Ihre Abonnements manuell entsorgen, bevor Sie stop() auf dem User-Agent aufrufen.

Irgendwelche Fortschritte😊? Wie geht das, bevor der Fehler behoben ist?

Ich habe kein Abonnement, aber das UA.stop() ist auch sehr langsam. Fast 1min...

Danke.

Um dies zu umgehen, können Sie Ihre Abonnements manuell entsorgen, bevor Sie stop() auf dem User-Agent aufrufen.

Irgendwelche Fortschritte😊? Wie geht das, bevor der Fehler behoben ist?

Ich habe kein Abonnement, aber das UA.stop() ist auch sehr langsam. Fast 1min...

Danke.

Nein, dieses Problem ist noch nicht gelöst.
Aber Sie können tun, was ich getan habe ... Sie können Ihre Objekte einfach manuell nacheinander mit der folgenden logischen Reihenfolge zerstören:

  1. SubscriberObj.unsubscribe();
  2. registerer.unregister();
  3. userAgent.transport.disconnect();
  4. userAgent.stop();

Machen Sie am besten jede Aktion mit Versprechen. Ich meine, verwenden Sie then damit Sie jedes Aktionsversprechen abwarten können, um zurückzukommen und entsprechend zu handeln, um den nächsten Schritt zu tun.

Ich habe das gleiche Problem. Ich habe keine Abos. Für mich dauert das Schließen des WebSockets zu lange (20-50 Sek.)

Ich habe es versucht:

  • Objekt manuell zerstören, wie @slavikbialik vorschlägt.
  • Schließen Sie das WebSocket manuell mit userAgent.transport.ws.close() , um sicherzustellen, dass mein Problem mit WebSocket zusammenhängt.
  • in Chrome und Firefox.

Ich habe keine spezifischen Konfigurationen, bin einfach der SIP.js-Anleitung gefolgt, um sie zu reproduzieren. Ich weiß nicht, ob dies hilft oder mit meinem Problem zusammenhängt, aber ich habe versucht, ein WebSocket mit SIP-Protokoll ohne Bibliothek zu öffnen und es geschlossen. Beide hielten unter 1 Sekunde.

wss

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

kyle9292 picture kyle9292  ·  3Kommentare

raphaelhovsepyan picture raphaelhovsepyan  ·  6Kommentare

Fzwael picture Fzwael  ·  5Kommentare

josephfrazier picture josephfrazier  ·  26Kommentare

Pjata picture Pjata  ·  11Kommentare