From caad85f45ba874e32e806d53be10539c5f62dc65 Mon Sep 17 00:00:00 2001 From: JC Brand Date: Mon, 29 Jul 2019 10:08:38 +0200 Subject: [PATCH] Manually remove BOSH session tokens from cache even if the `_converse.bosh_session` instance does not exist. We do this to avoid trying to reconnect with stale tokens upon reconnection. Especially relevant for anonymous connections, but could also be applicable when switching between websocket and BOSH connections when reconnecting. Also renamed `startNewBOSHSession` to `startNewPreboundBOSHSession` --- src/headless/converse-bosh.js | 18 +++++++++++++----- src/headless/converse-core.js | 2 +- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/headless/converse-bosh.js b/src/headless/converse-bosh.js index 2648860e9..253462ff1 100644 --- a/src/headless/converse-bosh.js +++ b/src/headless/converse-bosh.js @@ -13,6 +13,8 @@ import converse from "./converse-core"; const { Backbone, Strophe, _ } = converse.env; +const BOSH_SESSION_ID = 'converse.bosh-session'; + converse.plugins.add('converse-bosh', { @@ -26,7 +28,7 @@ converse.plugins.add('converse-bosh', { async function initBOSHSession () { - const id = 'converse.bosh-session'; + const id = BOSH_SESSION_ID; if (!_converse.bosh_session) { _converse.bosh_session = new Backbone.Model({id}); _converse.bosh_session.browserStorage = new BrowserStorage.session(id); @@ -40,7 +42,7 @@ converse.plugins.add('converse-bosh', { } - _converse.startNewBOSHSession = function () { + _converse.startNewPreboundBOSHSession = function () { if (!_converse.prebind_url) { throw new Error( "attemptPreboundSession: If you use prebind then you MUST supply a prebind_url"); @@ -97,14 +99,20 @@ converse.plugins.add('converse-bosh', { /************************ BEGIN Event Handlers ************************/ _converse.api.listen.on('clearSession', () => { - if (!_.isUndefined(_converse.bosh_session)) { + if (_converse.bosh_session === undefined) { + // Remove manually, even if we don't have the corresponding + // model, to avoid trying to reconnect to a stale BOSH session + const id = BOSH_SESSION_ID; + sessionStorage.removeItem(id); + sessionStorage.removeItem(`${id}-${id}`); + } else { _converse.bosh_session.destroy(); delete _converse.bosh_session; } }); _converse.api.listen.on('setUserJID', () => { - if (!_.isUndefined(_converse.bosh_session)) { + if (_converse.bosh_session !== undefined) { _converse.bosh_session.save({'jid': _converse.jid}); } }); @@ -127,7 +135,7 @@ converse.plugins.add('converse-bosh', { * @example _converse.api.tokens.get('rid'); */ get (id) { - if (_.isUndefined(_converse.connection)) { + if (_converse.connection === undefined) { return null; } if (id.toLowerCase() === 'rid') { diff --git a/src/headless/converse-core.js b/src/headless/converse-core.js index b6711fe7b..1d9bc7462 100644 --- a/src/headless/converse-core.js +++ b/src/headless/converse-core.js @@ -1494,7 +1494,7 @@ _converse.api = { if (await _converse.restoreBOSHSession()) { return; } else if (_converse.authentication === _converse.PREBIND) { - return _converse.startNewBOSHSession(); + return _converse.startNewPreboundBOSHSession(); } } else if (_converse.authentication === _converse.PREBIND) { throw new Error("authentication is set to 'prebind' but we don't have a BOSH connection");