소스 검색

Fixes #1196. Use alternative connection method upon connfail

JC Brand 6 년 전
부모
커밋
51f2ab9100
3개의 변경된 파일29개의 추가작업 그리고 3개의 파일을 삭제
  1. 1 0
      CHANGES.md
  2. 27 2
      src/headless/converse-core.js
  3. 1 1
      src/headless/converse-muc.js

+ 1 - 0
CHANGES.md

@@ -26,6 +26,7 @@
 - New event: [chatBoxBlurred](https://conversejs.org/docs/html/api/-_converse.html#event:chatBoxBlurred)
 - New event: [chatReconnected](https://conversejs.org/docs/html/api/-_converse.html#event:chatReconnected)
 - #316: Add support for XEP-0198 Stream Management
+- #1196: Use alternative connection method upon connfail
 - #1296: `embedded` view mode shows `chatbox-navback` arrow in header
 - #1330: Missing room name in MUC invitation popup
 - #1445: Participants list uses big font in embedded mode

+ 27 - 2
src/headless/converse-core.js

@@ -1460,16 +1460,41 @@ _converse.api = {
          * Can be called once the XMPP connection has dropped and we want
          * to attempt reconnection.
          * Only needs to be called once, if reconnect fails Converse will
-         * attempt to reconnect every two seconds.
+         * attempt to reconnect every two seconds, alternating between BOSH and
+         * Websocket if URLs for both were provided.
          * @method reconnect
          * @memberOf _converse.api.connection
          */
         reconnect () {
-            if (_converse.connfeedback.get('connection_status') === Strophe.Status.RECONNECTING) {
+            const conn_status = _converse.connfeedback.get('connection_status');
+            if (conn_status === Strophe.Status.CONNFAIL) {
+               if (_converse.api.connection.isType('websocket') && _converse.bosh_service_url) {
+                  _converse.connection._proto = new Strophe.Bosh(_converse.connection);
+                  _converse.connection.service = _converse.bosh_service_url;
+               } else if (_converse.api.connection.isType('bosh') && _converse.websocket_url) {
+                  _converse.connection._proto = new Strophe.Websocket(_converse.connection);
+                  _converse.connection.service = _converse.websocket_url;
+               }
+            }
+            if ([Strophe.Status.RECONNECTING, Strophe.Status.CONNFAIL].includes(conn_status)) {
                debouncedReconnect();
             } else {
                reconnect();
             }
+        },
+
+        /**
+         * Utility method to determine the type of connection we have
+         * @method isType
+         * @memberOf _converse.api.connection
+         * @returns {boolean}
+         */
+        isType (type) {
+           if (type.toLowerCase() === 'websocket') {
+               return _converse.connection._proto instanceof Strophe.Websocket;
+           } else if (type.toLowerCase() === 'bosh') {
+               return _converse.connection._proto instanceof Strophe.Bosh;
+           }
         }
     },
 

+ 1 - 1
src/headless/converse-muc.js

@@ -1724,7 +1724,7 @@ converse.plugins.add('converse-muc', {
 
         _converse.api.listen.on('statusInitialized', () => {
             window.addEventListener(_converse.unloadevent, () => {
-                const using_websocket = _converse.connection._proto instanceof Strophe.Websocket;
+                const using_websocket = _converse.api.connection.isType('websocket');
                 if (using_websocket && !_converse.enable_smacks) {
                     // For non-SMACKS websocket connections, we disconnect all
                     // chatrooms when the page unloads.