From 6323f598b575c5f6ee5639a372e0585522a6dae0 Mon Sep 17 00:00:00 2001 From: Scott Nonnenberg Date: Thu, 28 Sep 2017 13:12:43 -0700 Subject: [PATCH] Disconnect from socket faster on loss of network access (#1512) * Disconnect from socket faster on complete loss of network access Today we wait for a keepalive request to fail; this change forces disconnect in the case that the browser tells us that we're now offline. FREEBIE * MessageReceiver: don't react to errors after explicit close() FREEBIE --- js/background.js | 23 +++++++++++++++++------ js/libtextsecure.js | 13 ++++++++++++- libtextsecure/message_receiver.js | 13 ++++++++++++- 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/js/background.js b/js/background.js index e56ee4daf..82d9cc9bd 100644 --- a/js/background.js +++ b/js/background.js @@ -149,9 +149,9 @@ Whisper.events.on('start-shutdown', function() { if (messageReceiver) { messageReceiver.close().then(function() { - messageReceiver = null; Whisper.events.trigger('shutdown-complete'); }); + messageReceiver = null; } else { Whisper.events.trigger('shutdown-complete'); } @@ -159,11 +159,15 @@ function connect(firstRun) { window.removeEventListener('online', connect); + window.addEventListener('offline', disconnect); if (!Whisper.Registration.everDone()) { return; } if (Whisper.Import.isIncomplete()) { return; } - if (messageReceiver) { messageReceiver.close(); } + if (messageReceiver) { + messageReceiver.close(); + messageReceiver = null; + } var USERNAME = storage.get('number_id'); var PASSWORD = storage.get('password'); @@ -439,6 +443,17 @@ return message; } + function disconnect() { + window.removeEventListener('offline', disconnect); + window.addEventListener('online', connect); + + console.log('offline'); + if (messageReceiver) { + messageReceiver.close(); + messageReceiver = null; + } + } + function onError(ev) { var error = ev.error; console.log(error); @@ -457,10 +472,6 @@ setTimeout(connect, 60000); Whisper.events.trigger('reconnectTimer'); - } else { - console.log('offline'); - if (messageReceiver) { messageReceiver.close(); } - window.addEventListener('online', connect); } return; } diff --git a/js/libtextsecure.js b/js/libtextsecure.js index 63f7ba9b2..23c71a6eb 100644 --- a/js/libtextsecure.js +++ b/js/libtextsecure.js @@ -38394,6 +38394,7 @@ MessageReceiver.prototype.extend({ this.incoming = [this.pending]; }, close: function() { + this.calledClose = true; this.socket.close(3000, 'called close'); return this.drain(); }, @@ -38407,7 +38408,17 @@ MessageReceiver.prototype.extend({ return Promise.all(this.dispatchEvent(event)); }, onclose: function(ev) { - console.log('websocket closed', ev.code, ev.reason || ''); + console.log( + 'websocket closed', + ev.code, + ev.reason || '', + 'calledClose:', + this.calledClose + ); + + if (this.calledClose) { + return; + } if (ev.code === 3000) { return; } diff --git a/libtextsecure/message_receiver.js b/libtextsecure/message_receiver.js index de3026a01..09fcbf931 100644 --- a/libtextsecure/message_receiver.js +++ b/libtextsecure/message_receiver.js @@ -40,6 +40,7 @@ MessageReceiver.prototype.extend({ this.incoming = [this.pending]; }, close: function() { + this.calledClose = true; this.socket.close(3000, 'called close'); return this.drain(); }, @@ -53,7 +54,17 @@ MessageReceiver.prototype.extend({ return Promise.all(this.dispatchEvent(event)); }, onclose: function(ev) { - console.log('websocket closed', ev.code, ev.reason || ''); + console.log( + 'websocket closed', + ev.code, + ev.reason || '', + 'calledClose:', + this.calledClose + ); + + if (this.calledClose) { + return; + } if (ev.code === 3000) { return; }