Wait to manually disconnect after receiving 'offline' event (#1561)

* Wait to manually disconnect after receiving 'offline' event

We've received Linux logs indicating that we can get offline/online
blips - only 30ms between the two events. The app was never realy
offline. So this change slows the whole disconnect process down.

* Handle offline startup: register for online event, don't connect
This commit is contained in:
Scott Nonnenberg 2017-10-13 17:02:08 -07:00 committed by GitHub
parent 75cece3358
commit 1f9fcd64c7
1 changed files with 60 additions and 15 deletions

View File

@ -45,7 +45,7 @@
storage.put('safety-numbers-approval', false);
}
Whisper.Registration.markDone();
console.log("dispatching registration event");
console.log('dispatching registration event');
Whisper.events.trigger('registration_done');
});
}
@ -81,9 +81,9 @@
window.dispatchEvent(new Event('storage_ready'));
console.log("listening for registration events");
console.log('listening for registration events');
Whisper.events.on('registration_done', function() {
console.log("handling registration event");
console.log('handling registration event');
connect(true);
});
@ -151,11 +151,66 @@
}
});
var disconnectTimer = null;
function onOffline() {
console.log('offline');
window.removeEventListener('offline', onOffline);
window.addEventListener('online', onOnline);
// We've received logs from Linux where we get an 'offline' event, then 30ms later
// we get an online event. This waits a bit after getting an 'offline' event
// before disconnecting the socket manually.
disconnectTimer = setTimeout(disconnect, 1000);
}
function onOnline() {
console.log('online');
window.removeEventListener('online', onOnline);
window.addEventListener('offline', onOffline);
if (disconnectTimer && isSocketOnline()) {
console.log('Already online. Had a blip in online/offline status.');
clearTimeout(disconnectTimer);
disconnectTimer = null;
return;
}
connect();
}
function isSocketOnline() {
var socketStatus = window.getSocketStatus();
return socketStatus === WebSocket.CONNECTING || socketStatus === WebSocket.OPEN;
}
function disconnect() {
console.log('disconnect');
// Clear timer, since we're only called when the timer is expired
disconnectTimer = null;
if (messageReceiver) {
messageReceiver.close();
}
}
var connectCount = 0;
function connect(firstRun) {
console.log('connect');
window.removeEventListener('online', connect);
window.addEventListener('offline', disconnect);
// Bootstrap our online/offline detection, only the first time we connect
if (connectCount === 0 && navigator.onLine) {
window.addEventListener('offline', onOffline);
}
if (connectCount === 0 && !navigator.onLine) {
console.log('Starting up offline; will connect when we have network access');
window.addEventListener('online', onOnline);
onEmpty(); // this ensures that the loading screen is dismissed
return;
}
if (!Whisper.Registration.everDone()) { return; }
if (Whisper.Import.isIncomplete()) { return; }
@ -476,16 +531,6 @@
return message;
}
function disconnect() {
window.removeEventListener('offline', disconnect);
window.addEventListener('online', connect);
console.log('offline');
if (messageReceiver) {
messageReceiver.close();
}
}
function onError(ev) {
var error = ev.error;
console.log(error);