Browse Source

feat: Waits for the room dataform to be received before setting lobby.

Waits to check if lobby is already enabled, and if enabled ignore the request.
release-8443
damencho 1 year ago
parent
commit
ba21a2365e
4 changed files with 51 additions and 3 deletions
  1. 2
    2
      modules/util/Listenable.js
  2. 13
    1
      modules/xmpp/ChatRoom.js
  3. 30
    0
      modules/xmpp/Lobby.js
  4. 6
    0
      service/xmpp/XMPPEvents.ts

+ 2
- 2
modules/util/Listenable.js View File

@@ -34,7 +34,7 @@ export default class Listenable {
34 34
      * Adds new listener.
35 35
      * @param {String} eventName the name of the event
36 36
      * @param {Function} listener the listener.
37
-     * @returns {EventEmitter} - The unsubscribe function.
37
+     * @returns {EventEmitter} - The emitter, so that calls can be chained.
38 38
      */
39 39
     addListener(eventName, listener) {
40 40
         return this.eventEmitter.addListener(eventName, listener);
@@ -45,7 +45,7 @@ export default class Listenable {
45 45
      * @param {String} eventName the name of the event that triggers the
46 46
      * listener
47 47
      * @param {Function} listener the listener.
48
-     * @returns {EventEmitter} - The unsubscribe function.
48
+     * @returns {EventEmitter} - The emitter, so that calls can be chained.
49 49
      */
50 50
     removeListener(eventName, listener) {
51 51
         return this.eventEmitter.removeListener(eventName, listener);

+ 13
- 1
modules/xmpp/ChatRoom.js View File

@@ -21,6 +21,12 @@ import XmppConnection from './XmppConnection';
21 21
 
22 22
 const logger = getLogger(__filename);
23 23
 
24
+/**
25
+ * How long we're going to wait for IQ response, before timeout error is triggered.
26
+ * @type {number}
27
+ */
28
+const IQ_TIMEOUT = 10000;
29
+
24 30
 export const parser = {
25 31
     packet2JSON(xmlElement, nodes) {
26 32
         for (const child of Array.from(xmlElement.children)) {
@@ -190,6 +196,7 @@ export default class ChatRoom extends Listenable {
190 196
 
191 197
         this.locked = false;
192 198
         this.transcriptionStatus = JitsiTranscriptionStatus.OFF;
199
+        this.initialDiscoRoomInfoReceived = false;
193 200
     }
194 201
 
195 202
     /* eslint-enable max-params */
@@ -402,9 +409,14 @@ export default class ChatRoom extends Listenable {
402 409
                     logger.warn('Failed to set room metadata', e);
403 410
                 }
404 411
             }
412
+
413
+            this.initialDiscoRoomInfoReceived = true;
414
+            this.eventEmitter.emit(XMPPEvents.ROOM_DISCO_INFO_UPDATED);
405 415
         }, error => {
406 416
             logger.error('Error getting room info: ', error);
407
-        });
417
+            this.eventEmitter.emit(XMPPEvents.ROOM_DISCO_INFO_FAILED, error);
418
+        },
419
+        IQ_TIMEOUT);
408 420
     }
409 421
 
410 422
     /**

+ 30
- 0
modules/xmpp/Lobby.js View File

@@ -63,6 +63,36 @@ export default class Lobby {
63 63
             return Promise.reject(new Error('Lobby not supported!'));
64 64
         }
65 65
 
66
+        // let's wait for the room data form to be populated after XMPPEvents.MUC_JOINED
67
+        if (!this.mainRoom.initialDiscoRoomInfoReceived) {
68
+            return new Promise((resolve, reject) => {
69
+                let unsubscribers = [];
70
+                const unsubscribe = () => {
71
+                    unsubscribers.forEach(remove => remove());
72
+                    unsubscribers = [];
73
+                };
74
+
75
+                unsubscribers.push(
76
+                    this.mainRoom.addCancellableListener(XMPPEvents.ROOM_DISCO_INFO_UPDATED, () => {
77
+                        unsubscribe();
78
+
79
+                        if (this.mainRoom.membersOnlyEnabled) {
80
+                            resolve();
81
+
82
+                            return;
83
+                        }
84
+
85
+                        this.mainRoom.setMembersOnly(true, resolve, reject);
86
+                    }));
87
+
88
+                // on timeout or failure
89
+                unsubscribers.push(this.mainRoom.addCancellableListener(XMPPEvents.ROOM_DISCO_INFO_FAILED, e => {
90
+                    unsubscribe();
91
+                    reject(e);
92
+                }));
93
+            });
94
+        }
95
+
66 96
         if (this.mainRoom.membersOnlyEnabled) {
67 97
             return Promise.resolve();
68 98
         }

+ 6
- 0
service/xmpp/XMPPEvents.ts View File

@@ -223,6 +223,12 @@ export enum XMPPEvents {
223 223
     ROOM_JOIN_ERROR = 'xmpp.room_join_error',
224 224
     ROOM_CONNECT_MEMBERS_ONLY_ERROR = 'xmpp.room_connect_error.members_only',
225 225
 
226
+    /**
227
+     * Indicates that we have received a reply to our disco-info request for the room.
228
+     */
229
+    ROOM_DISCO_INFO_UPDATED = 'xmpp.room_disco_info_updated',
230
+    ROOM_DISCO_INFO_FAILED = 'xmpp.room_disco_info_failed',
231
+
226 232
     /**
227 233
      * Indicates that max users limit has been reached.
228 234
      */

Loading…
Cancel
Save