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".
This commit is contained in:
JC Brand 2016-01-15 05:40:17 +00:00
parent 9d7b41cd96
commit 9fe6087e39

View File

@ -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
}