Просмотр исходного кода

Fix: Old JitsiConference instance remains listening on incoming calls… (#858)

* Fix: Old JitsiConference instance remains listening on incoming calls after leave - rejoin to same room

* Remove all listeners added by setupXMPPListeners
dev1
Gábor Takaró 6 лет назад
Родитель
Сommit
10290bbdde
2 измененных файлов: 54 добавлений и 16 удалений
  1. 2
    0
      JitsiConference.js
  2. 52
    16
      JitsiConferenceEventManager.js

+ 2
- 0
JitsiConference.js Просмотреть файл

463
             XMPPEvents.CONFERENCE_PROPERTIES_CHANGED,
463
             XMPPEvents.CONFERENCE_PROPERTIES_CHANGED,
464
             this._updateProperties);
464
             this._updateProperties);
465
 
465
 
466
+        this.eventManager.removeXMPPListeners();
467
+
466
         this.room = null;
468
         this.room = null;
467
 
469
 
468
         return room.leave().catch(error => {
470
         return room.leave().catch(error => {

+ 52
- 16
JitsiConferenceEventManager.js Просмотреть файл

29
  */
29
  */
30
 export default function JitsiConferenceEventManager(conference) {
30
 export default function JitsiConferenceEventManager(conference) {
31
     this.conference = conference;
31
     this.conference = conference;
32
+    this.xmppListeners = {};
32
 
33
 
33
     // Listeners related to the conference only
34
     // Listeners related to the conference only
34
     conference.on(JitsiConferenceEvents.TRACK_MUTE_CHANGED,
35
     conference.on(JitsiConferenceEvents.TRACK_MUTE_CHANGED,
529
         });
530
         });
530
 };
531
 };
531
 
532
 
533
+/**
534
+ * Removes event listeners related to conference.xmpp
535
+ */
536
+JitsiConferenceEventManager.prototype.removeXMPPListeners = function() {
537
+    const conference = this.conference;
538
+
539
+    conference.xmpp.caps.removeListener(
540
+        XMPPEvents.PARTCIPANT_FEATURES_CHANGED,
541
+        this.xmppListeners[XMPPEvents.PARTCIPANT_FEATURES_CHANGED]);
542
+    delete this.xmppListeners[XMPPEvents.PARTCIPANT_FEATURES_CHANGED];
543
+
544
+    Object.keys(this.xmppListeners).forEach(eventName => {
545
+        conference.xmpp.removeListener(
546
+            eventName,
547
+            this.xmppListeners[eventName]);
548
+    });
549
+    this.xmppListeners = {};
550
+};
551
+
552
+
532
 /**
553
 /**
533
  * Setups event listeners related to conference.xmpp
554
  * Setups event listeners related to conference.xmpp
534
  */
555
  */
535
 JitsiConferenceEventManager.prototype.setupXMPPListeners = function() {
556
 JitsiConferenceEventManager.prototype.setupXMPPListeners = function() {
536
     const conference = this.conference;
557
     const conference = this.conference;
537
 
558
 
538
-    conference.xmpp.caps.addListener(XMPPEvents.PARTCIPANT_FEATURES_CHANGED,
539
-        from => {
540
-            const participant
541
-                = conference.getParticipantById(
542
-                    Strophe.getResourceFromJid(from));
559
+    const featuresChangedListener = from => {
560
+        const participant
561
+            = conference.getParticipantById(
562
+            Strophe.getResourceFromJid(from));
543
 
563
 
544
-            if (participant) {
545
-                conference.eventEmitter.emit(
546
-                    JitsiConferenceEvents.PARTCIPANT_FEATURES_CHANGED,
547
-                    participant);
548
-            }
549
-        });
550
-    conference.xmpp.addListener(
564
+        if (participant) {
565
+            conference.eventEmitter.emit(
566
+                JitsiConferenceEvents.PARTCIPANT_FEATURES_CHANGED,
567
+                participant);
568
+        }
569
+    };
570
+
571
+    conference.xmpp.caps.addListener(
572
+        XMPPEvents.PARTCIPANT_FEATURES_CHANGED,
573
+        featuresChangedListener);
574
+    this.xmppListeners[XMPPEvents.PARTCIPANT_FEATURES_CHANGED]
575
+        = featuresChangedListener;
576
+
577
+    this._addConferenceXMPPListener(
551
         XMPPEvents.CALL_INCOMING,
578
         XMPPEvents.CALL_INCOMING,
552
         conference.onIncomingCall.bind(conference));
579
         conference.onIncomingCall.bind(conference));
553
-    conference.xmpp.addListener(
580
+    this._addConferenceXMPPListener(
554
         XMPPEvents.CALL_ACCEPTED,
581
         XMPPEvents.CALL_ACCEPTED,
555
         conference.onCallAccepted.bind(conference));
582
         conference.onCallAccepted.bind(conference));
556
-    conference.xmpp.addListener(
583
+    this._addConferenceXMPPListener(
557
         XMPPEvents.TRANSPORT_INFO,
584
         XMPPEvents.TRANSPORT_INFO,
558
         conference.onTransportInfo.bind(conference));
585
         conference.onTransportInfo.bind(conference));
559
-    conference.xmpp.addListener(
586
+    this._addConferenceXMPPListener(
560
         XMPPEvents.CALL_ENDED,
587
         XMPPEvents.CALL_ENDED,
561
         conference.onCallEnded.bind(conference));
588
         conference.onCallEnded.bind(conference));
562
 
589
 
563
-    conference.xmpp.addListener(XMPPEvents.START_MUTED_FROM_FOCUS,
590
+    this._addConferenceXMPPListener(XMPPEvents.START_MUTED_FROM_FOCUS,
564
         (audioMuted, videoMuted) => {
591
         (audioMuted, videoMuted) => {
565
             if (conference.options.config.ignoreStartMuted) {
592
             if (conference.options.config.ignoreStartMuted) {
566
                 return;
593
                 return;
586
         });
613
         });
587
 };
614
 };
588
 
615
 
616
+/**
617
+ * Add XMPP listener and save its reference for remove on leave conference.
618
+ */
619
+JitsiConferenceEventManager.prototype._addConferenceXMPPListener = function(
620
+        eventName, listener) {
621
+    this.xmppListeners[eventName] = listener;
622
+    this.conference.xmpp.addListener(eventName, listener);
623
+};
624
+
589
 /**
625
 /**
590
  * Setups event listeners related to conference.statistics
626
  * Setups event listeners related to conference.statistics
591
  */
627
  */

Загрузка…
Отмена
Сохранить