瀏覽代碼

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 年之前
父節點
當前提交
10290bbdde
共有 2 個檔案被更改,包括 54 行新增16 行删除
  1. 2
    0
      JitsiConference.js
  2. 52
    16
      JitsiConferenceEventManager.js

+ 2
- 0
JitsiConference.js 查看文件

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

+ 52
- 16
JitsiConferenceEventManager.js 查看文件

@@ -29,6 +29,7 @@ const logger = getLogger(__filename);
29 29
  */
30 30
 export default function JitsiConferenceEventManager(conference) {
31 31
     this.conference = conference;
32
+    this.xmppListeners = {};
32 33
 
33 34
     // Listeners related to the conference only
34 35
     conference.on(JitsiConferenceEvents.TRACK_MUTE_CHANGED,
@@ -529,38 +530,64 @@ JitsiConferenceEventManager.prototype.setupRTCListeners = function() {
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 554
  * Setups event listeners related to conference.xmpp
534 555
  */
535 556
 JitsiConferenceEventManager.prototype.setupXMPPListeners = function() {
536 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 578
         XMPPEvents.CALL_INCOMING,
552 579
         conference.onIncomingCall.bind(conference));
553
-    conference.xmpp.addListener(
580
+    this._addConferenceXMPPListener(
554 581
         XMPPEvents.CALL_ACCEPTED,
555 582
         conference.onCallAccepted.bind(conference));
556
-    conference.xmpp.addListener(
583
+    this._addConferenceXMPPListener(
557 584
         XMPPEvents.TRANSPORT_INFO,
558 585
         conference.onTransportInfo.bind(conference));
559
-    conference.xmpp.addListener(
586
+    this._addConferenceXMPPListener(
560 587
         XMPPEvents.CALL_ENDED,
561 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 591
         (audioMuted, videoMuted) => {
565 592
             if (conference.options.config.ignoreStartMuted) {
566 593
                 return;
@@ -586,6 +613,15 @@ JitsiConferenceEventManager.prototype.setupXMPPListeners = function() {
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 626
  * Setups event listeners related to conference.statistics
591 627
  */

Loading…
取消
儲存