Skip to content

Commit 51f2ab9

Browse files
committed
Fixes #1196. Use alternative connection method upon connfail
1 parent 297f3d9 commit 51f2ab9

File tree

3 files changed

+29
-3
lines changed

3 files changed

+29
-3
lines changed

CHANGES.md

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

src/headless/converse-core.js

+27-2
Original file line numberDiff line numberDiff line change
@@ -1460,16 +1460,41 @@ _converse.api = {
14601460
* Can be called once the XMPP connection has dropped and we want
14611461
* to attempt reconnection.
14621462
* Only needs to be called once, if reconnect fails Converse will
1463-
* attempt to reconnect every two seconds.
1463+
* attempt to reconnect every two seconds, alternating between BOSH and
1464+
* Websocket if URLs for both were provided.
14641465
* @method reconnect
14651466
* @memberOf _converse.api.connection
14661467
*/
14671468
reconnect () {
1468-
if (_converse.connfeedback.get('connection_status') === Strophe.Status.RECONNECTING) {
1469+
const conn_status = _converse.connfeedback.get('connection_status');
1470+
if (conn_status === Strophe.Status.CONNFAIL) {
1471+
if (_converse.api.connection.isType('websocket') && _converse.bosh_service_url) {
1472+
_converse.connection._proto = new Strophe.Bosh(_converse.connection);
1473+
_converse.connection.service = _converse.bosh_service_url;
1474+
} else if (_converse.api.connection.isType('bosh') && _converse.websocket_url) {
1475+
_converse.connection._proto = new Strophe.Websocket(_converse.connection);
1476+
_converse.connection.service = _converse.websocket_url;
1477+
}
1478+
}
1479+
if ([Strophe.Status.RECONNECTING, Strophe.Status.CONNFAIL].includes(conn_status)) {
14691480
debouncedReconnect();
14701481
} else {
14711482
reconnect();
14721483
}
1484+
},
1485+
1486+
/**
1487+
* Utility method to determine the type of connection we have
1488+
* @method isType
1489+
* @memberOf _converse.api.connection
1490+
* @returns {boolean}
1491+
*/
1492+
isType (type) {
1493+
if (type.toLowerCase() === 'websocket') {
1494+
return _converse.connection._proto instanceof Strophe.Websocket;
1495+
} else if (type.toLowerCase() === 'bosh') {
1496+
return _converse.connection._proto instanceof Strophe.Bosh;
1497+
}
14731498
}
14741499
},
14751500

src/headless/converse-muc.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1724,7 +1724,7 @@ converse.plugins.add('converse-muc', {
17241724

17251725
_converse.api.listen.on('statusInitialized', () => {
17261726
window.addEventListener(_converse.unloadevent, () => {
1727-
const using_websocket = _converse.connection._proto instanceof Strophe.Websocket;
1727+
const using_websocket = _converse.api.connection.isType('websocket');
17281728
if (using_websocket && !_converse.enable_smacks) {
17291729
// For non-SMACKS websocket connections, we disconnect all
17301730
// chatrooms when the page unloads.

0 commit comments

Comments
 (0)