瀏覽代碼

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 年之前
父節點
當前提交
ba21a2365e
共有 4 個檔案被更改,包括 51 行新增3 行删除
  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 查看文件

34
      * Adds new listener.
34
      * Adds new listener.
35
      * @param {String} eventName the name of the event
35
      * @param {String} eventName the name of the event
36
      * @param {Function} listener the listener.
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
     addListener(eventName, listener) {
39
     addListener(eventName, listener) {
40
         return this.eventEmitter.addListener(eventName, listener);
40
         return this.eventEmitter.addListener(eventName, listener);
45
      * @param {String} eventName the name of the event that triggers the
45
      * @param {String} eventName the name of the event that triggers the
46
      * listener
46
      * listener
47
      * @param {Function} listener the listener.
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
     removeListener(eventName, listener) {
50
     removeListener(eventName, listener) {
51
         return this.eventEmitter.removeListener(eventName, listener);
51
         return this.eventEmitter.removeListener(eventName, listener);

+ 13
- 1
modules/xmpp/ChatRoom.js 查看文件

21
 
21
 
22
 const logger = getLogger(__filename);
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
 export const parser = {
30
 export const parser = {
25
     packet2JSON(xmlElement, nodes) {
31
     packet2JSON(xmlElement, nodes) {
26
         for (const child of Array.from(xmlElement.children)) {
32
         for (const child of Array.from(xmlElement.children)) {
190
 
196
 
191
         this.locked = false;
197
         this.locked = false;
192
         this.transcriptionStatus = JitsiTranscriptionStatus.OFF;
198
         this.transcriptionStatus = JitsiTranscriptionStatus.OFF;
199
+        this.initialDiscoRoomInfoReceived = false;
193
     }
200
     }
194
 
201
 
195
     /* eslint-enable max-params */
202
     /* eslint-enable max-params */
402
                     logger.warn('Failed to set room metadata', e);
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
         }, error => {
415
         }, error => {
406
             logger.error('Error getting room info: ', error);
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 查看文件

63
             return Promise.reject(new Error('Lobby not supported!'));
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
         if (this.mainRoom.membersOnlyEnabled) {
96
         if (this.mainRoom.membersOnlyEnabled) {
67
             return Promise.resolve();
97
             return Promise.resolve();
68
         }
98
         }

+ 6
- 0
service/xmpp/XMPPEvents.ts 查看文件

223
     ROOM_JOIN_ERROR = 'xmpp.room_join_error',
223
     ROOM_JOIN_ERROR = 'xmpp.room_join_error',
224
     ROOM_CONNECT_MEMBERS_ONLY_ERROR = 'xmpp.room_connect_error.members_only',
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
      * Indicates that max users limit has been reached.
233
      * Indicates that max users limit has been reached.
228
      */
234
      */

Loading…
取消
儲存