From 9fe6087e39cd34ab64f5a0c8735b844d213cd6d5 Mon Sep 17 00:00:00 2001 From: JC Brand Date: Fri, 15 Jan 2016 05:40:17 +0000 Subject: [PATCH] Simplify the logic of when to send out a presence stanza. Updates #521 and #536. Turn the logic around so that a presence stanza is always sent out, except in the single case where we know for sure that the session was restored, in which case a presence stanza is not required becaus we "never left". --- converse.js | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/converse.js b/converse.js index c384c8bc8..eadeee2f5 100644 --- a/converse.js +++ b/converse.js @@ -421,12 +421,15 @@ // Module-level variables // ---------------------- this.callback = callback || function () {}; - // This var is used to detect when the session was disconnected, - // so that we can send out a new presence stanza. Otherwise - // it won't be sent out due to roster contacts already being - // in sessionStorage. - // https://github.com/jcbrand/converse.js/issues/521 - this.initial_presence_sent = false; + /* When reloading the page: + * For new sessions, we need to send out a presence stanza to notify + * the server/network that we're online. + * When re-attaching to an existing session (e.g. via the keepalive + * option), we don't need to again send out a presence stanza, because + * it's as if "we never left" (see onConnectStatusChanged). + * https://github.com/jcbrand/converse.js/issues/521 + */ + this.send_initial_presence = true; this.msg_counter = 0; // Module-level functions @@ -629,12 +632,18 @@ this.onConnectStatusChanged = function (status, condition, reconnect) { converse.log("Status changed to: "+PRETTY_CONNECTION_STATUS[status]); if (status === Strophe.Status.CONNECTED || status === Strophe.Status.ATTACHED) { + // By default we always want to send out an initial presence stanza. + converse.send_initial_presence = true; delete converse.disconnection_cause; if ((typeof reconnect !== 'undefined') && (reconnect)) { converse.log(status === Strophe.Status.CONNECTED ? 'Reconnected' : 'Reattached'); converse.onReconnected(); } else { converse.log(status === Strophe.Status.CONNECTED ? 'Connected' : 'Attached'); + if (converse.connection.restored) { + converse.send_initial_presence = false; // No need to send an initial presence stanza when + // we're restoring an existing session. + } converse.onConnected(); } } else if (status === Strophe.Status.DISCONNECTED) { @@ -4944,18 +4953,15 @@ * updates from our contacts. */ converse.roster.fetchFromServer( - converse.xmppstatus.sendInitialPresence.bind(converse.xmppstatus) + converse.xmppstatus.sendPresence.bind(converse.xmppstatus) ); - } else if (converse.connection._proto instanceof Strophe.Websocket || - !converse.keepalive || - !converse.initial_presence_sent - ) { - /* We're not going to fetch the roster again (because we have + } else if (converse.send_initial_presence) { + /* We're not going to fetch the roster again because we have * it already cached in sessionStorage, but we still need to - * send out our presence because this is a new session. + * send out a presence stanza because this is a new session. * See: https://github.com/jcbrand/converse.js/issues/536 */ - converse.xmppstatus.sendInitialPresence(); + converse.xmppstatus.sendPresence(); } } }); @@ -5288,11 +5294,6 @@ converse.connection.send(this.constructPresence(type, status_message)); }, - sendInitialPresence: function () { - this.sendPresence(); - converse.initial_presence_sent = true; - }, - setStatus: function (value) { this.sendPresence(value); this.save({'status': value}); @@ -6264,7 +6265,6 @@ /* Remove those views which are only allowed with a valid * connection. */ - this.initial_presence_sent = false; if (this.roster) { this.roster.off().reset(); // Removes roster contacts }