From 6ef94fa43d10c7a8b5837634baf2fc1e125ce5c0 Mon Sep 17 00:00:00 2001 From: Beaudan Date: Mon, 15 Jul 2019 12:05:01 +1000 Subject: [PATCH] Start attempt at closing long polling connections when offline event is triggered --- js/modules/loki_message_api.js | 19 ++++++++++++----- libtextsecure/http-resources.js | 34 +++++++++++++++++++++++-------- libtextsecure/message_receiver.js | 4 ++++ 3 files changed, 44 insertions(+), 13 deletions(-) diff --git a/js/modules/loki_message_api.js b/js/modules/loki_message_api.js index 17147bc8c..dcd084695 100644 --- a/js/modules/loki_message_api.js +++ b/js/modules/loki_message_api.js @@ -253,13 +253,22 @@ class LokiMessageAPI { return false; } - async openRetrieveConnection(callback) { - while (!_.isEmpty(this.ourSwarmNodes)) { + async openRetrieveConnection(stopPollingPromise, callback) { + let stopPollingResult = false; + // eslint-disable-next-line more/no-then + stopPollingPromise.then(result => { + stopPollingResult = result; + }); + + while (!stopPollingResult && !_.isEmpty(this.ourSwarmNodes)) { const address = Object.keys(this.ourSwarmNodes)[0]; const nodeData = this.ourSwarmNodes[address]; delete this.ourSwarmNodes[address]; let successiveFailures = 0; - while (successiveFailures < MAX_ACCEPTABLE_FAILURES) { + while ( + !stopPollingResult && + successiveFailures < MAX_ACCEPTABLE_FAILURES + ) { await sleepFor(successiveFailures * 1000); try { @@ -332,7 +341,7 @@ class LokiMessageAPI { return result.messages || []; } - async startLongPolling(numConnections, callback) { + async startLongPolling(numConnections, stopPolling, callback) { this.ourSwarmNodes = {}; let nodes = await lokiSnodeAPI.getSwarmNodesForPubKey(this.ourKey); if (nodes.length < numConnections) { @@ -353,7 +362,7 @@ class LokiMessageAPI { const promises = []; for (let i = 0; i < numConnections; i += 1) - promises.push(this.openRetrieveConnection(callback)); + promises.push(this.openRetrieveConnection(stopPolling, callback)); // blocks until all snodes in our swarms have been removed from the list // or if there is network issues (ENOUTFOUND due to lokinet) diff --git a/libtextsecure/http-resources.js b/libtextsecure/http-resources.js index 9f3314c6b..38ae9b6a3 100644 --- a/libtextsecure/http-resources.js +++ b/libtextsecure/http-resources.js @@ -49,6 +49,11 @@ handleRequest = request => request.respond(404, 'Not found'); } let connected = true; + this.calledStop = false; + let resolveStopPolling; + const stopPolling = new Promise(res => { + resolveStopPolling = res; + }); this.handleMessage = (message, options = {}) => { try { @@ -83,18 +88,26 @@ // This blocking call will return only when all attempts // at reaching snodes are exhausted or a DNS error occured try { - await server.startLongPolling(NUM_CONCURRENT_CONNECTIONS, messages => { - connected = true; - callback(connected); - messages.forEach(message => { - const { data } = message; - this.handleMessage(data); - }); - }); + await server.startLongPolling( + NUM_CONCURRENT_CONNECTIONS, + stopPolling, + messages => { + connected = true; + callback(connected); + messages.forEach(message => { + const { data } = message; + this.handleMessage(data); + }); + } + ); } catch (e) { // we'll try again anyway } + if (this.calledStop) { + return; + } + connected = false; // Exhausted all our snodes urls, trying again later from scratch setTimeout(() => { @@ -105,5 +118,10 @@ this.isConnected = function isConnected() { return connected; }; + + this.close = () => { + this.calledStop = true; + resolveStopPolling(true); + }; }; })(); diff --git a/libtextsecure/message_receiver.js b/libtextsecure/message_receiver.js index 026ac4032..9b354d1cb 100644 --- a/libtextsecure/message_receiver.js +++ b/libtextsecure/message_receiver.js @@ -190,6 +190,10 @@ MessageReceiver.prototype.extend({ localLokiServer.close(); } + if (this.httpPollingResource) { + this.httpPollingResource.close(); + } + return this.drain(); }, onopen() {