FIX: message bus now properly detects log off

Previously under some conditions message bus could continue firing
even if a user is logged off.

This change ensures that under all conditions once server informs
client of a log off, client stops talking to server
This commit is contained in:
Sam 2018-04-20 16:22:04 +10:00
parent 98d880b67a
commit 9a55a3e8fd
2 changed files with 33 additions and 15 deletions

View File

@ -1,5 +1,20 @@
// Initialize the message bus to receive messages. // Initialize the message bus to receive messages.
import pageVisible from 'discourse/lib/page-visible'; import pageVisible from 'discourse/lib/page-visible';
import { handleLogoff } from 'discourse/lib/ajax';
function ajax(opts) {
if (opts.complete) {
let oldComplete = opts.complete;
opts.complete = function(xhr, stat) {
handleLogoff(xhr);
oldComplete(xhr, stat);
};
} else {
opts.complete = handleLogoff;
}
return $.ajax(opts);
}
export default { export default {
name: "message-bus", name: "message-bus",
@ -41,7 +56,7 @@ export default {
if (pageVisible()) { if (pageVisible()) {
opts.headers['Discourse-Visible'] = "true"; opts.headers['Discourse-Visible'] = "true";
} }
return $.ajax(opts); return ajax(opts);
}; };
} else { } else {
@ -50,7 +65,7 @@ export default {
if (pageVisible()) { if (pageVisible()) {
opts.headers['Discourse-Visible'] = "true"; opts.headers['Discourse-Visible'] = "true";
} }
return $.ajax(opts); return ajax(opts);
}; };
messageBus.baseUrl = Discourse.getURL('/'); messageBus.baseUrl = Discourse.getURL('/');

View File

@ -13,6 +13,22 @@ export function viewTrackingRequired() {
_trackView = true; _trackView = true;
} }
export function handleLogoff(xhr) {
if (xhr.getResponseHeader('Discourse-Logged-Out') && !_showingLogout) {
_showingLogout = true;
const messageBus = Discourse.__container__.lookup('message-bus:main');
messageBus.stop();
bootbox.dialog(
I18n.t("logout"), {label: I18n.t("refresh"), callback: logout},
{
onEscape: () => logout(),
backdrop: 'static'
}
);
}
};
/** /**
Our own $.ajax method. Makes sure the .then method executes in an Ember runloop Our own $.ajax method. Makes sure the .then method executes in an Ember runloop
for performance reasons. Also automatically adjusts the URL to support installs for performance reasons. Also automatically adjusts the URL to support installs
@ -60,19 +76,6 @@ export function ajax() {
args.headers['Discourse-Visible'] = "true"; args.headers['Discourse-Visible'] = "true";
} }
let handleLogoff = function(xhr) {
if (xhr.getResponseHeader('Discourse-Logged-Out') && !_showingLogout) {
_showingLogout = true;
bootbox.dialog(
I18n.t("logout"), {label: I18n.t("refresh"), callback: logout},
{
onEscape: () => logout(),
backdrop: 'static'
}
);
}
};
args.success = (data, textStatus, xhr) => { args.success = (data, textStatus, xhr) => {
handleLogoff(xhr); handleLogoff(xhr);