From 6692812d55bbd69e261af164e18f9eb1983ed78b Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Wed, 12 Sep 2018 15:09:21 +0200 Subject: [PATCH] Websocket reconnect (and close old connection on leave) --- src/js/controllers/tab-receive.js | 95 ++++++++++++++++++++----------- 1 file changed, 63 insertions(+), 32 deletions(-) diff --git a/src/js/controllers/tab-receive.js b/src/js/controllers/tab-receive.js index 320afe320..6642c2e1c 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -24,6 +24,52 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi }); }; + + function connectSocket() { + //close existing socket if not connected with current address + if (currentAddressSocket && typeof currentAddressSocket.close === 'function') { + currentAddressSocket.onclose = function(e) {}; // Overwrite onclose-function to prevent reconnecting old address socket. + currentAddressSocket.close(); + } + if ($scope.wallet.coin === 'bch') { + // listen to bch address + currentAddressSocket = new WebSocket("wss://ws.blockchain.info/bch/inv"); + paymentSubscriptionObj.addr = $scope.addrBchLegacy; + } else { + // listen to btc address + currentAddressSocket = new WebSocket("wss://ws.blockchain.info/inv"); + paymentSubscriptionObj.addr = $scope.addr; + } + + // create subscription to address + var msg = JSON.stringify(paymentSubscriptionObj); + currentAddressSocket.onopen = function (event) { + currentAddressSocket.send(msg); + }; + + // listen for response + currentAddressSocket.onmessage = function (event) { + //console.log("message received:" + event.data); + receivedPayment(event.data); + }; + + currentAddressSocket.onclose = function(e) { + console.log('Socket is closed. Reconnect will be attempted in 1 second.'); + $timeout(function() { + connectSocket(); + }, 1000); + }; + + currentAddressSocket.onerror = function(err) { + console.error('Socket encountered error: ', err, 'Closing socket'); + currentAddressSocket.close(); + }; + + $timeout(function() { + $scope.$apply(); + }, 10); + } + $scope.setAddress = function(newAddr, copyAddress) { $scope.addr = null; if (!$scope.wallet || $scope.generatingAddress || !$scope.wallet.isComplete()) return; @@ -36,28 +82,16 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi popupService.showAlert(err); } - //close existing socket - if (currentAddressSocket.close === 'function') { - currentAddressSocket.close(); - } - - if ($scope.wallet.coin == 'bch') { - bchAddresses = bitcoinCashJsService.translateAddresses(addr); - $scope.addr = bchAddresses[$scope.bchAddressType.type]; - $scope.addrBchLegacy = bchAddresses['legacy']; - - // listen to bch address - currentAddressSocket = new WebSocket("wss://ws.blockchain.info/bch/inv"); - paymentSubscriptionObj.addr = bchAddresses['legacy']; - + if ($scope.wallet.coin === 'bch') { + bchAddresses = bitcoinCashJsService.translateAddresses(addr); + $scope.addr = bchAddresses[$scope.bchAddressType.type]; + $scope.addrBchLegacy = bchAddresses['legacy']; } else { - $scope.addr = addr; - - // listen to btc address - currentAddressSocket = new WebSocket("wss://ws.blockchain.info/inv"); - paymentSubscriptionObj.addr = $scope.addr + $scope.addr = addr; } + connectSocket(); + if (copyAddress === true) { try { clipboardService.copyToClipboard($scope.wallet.coin == 'bch' && $scope.bchAddressType.type == 'cashaddr' ? 'bitcoincash:' + $scope.addr : $scope.addr); @@ -66,19 +100,6 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi $log.debug(error); } } - // create subscription - var msg = JSON.stringify(paymentSubscriptionObj); - currentAddressSocket.onopen = function (event) { - //console.log("message sent: " + msg); - currentAddressSocket.send(msg); - } - - - // listen for response - currentAddressSocket.onmessage = function (event) { - //console.log("message received:" + event.data); - receivedPayment(event.data); - } $timeout(function() { $scope.$apply(); @@ -233,6 +254,16 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi } }; + $scope.$on("$ionicView.beforeLeave", function() { + // Close the old connection! + if (currentAddressSocket && typeof currentAddressSocket.close === 'function') { + console.log("Close open websocket address connection."); + currentAddressSocket.onclose = function(e) {}; // Overwrite onclose-function to prevent reconnecting old address socket. + currentAddressSocket.close(); + } + + }); + $scope.$on("$ionicView.beforeEnter", function(event, data) { $scope.wallets = profileService.getWallets(); $scope.singleWallet = $scope.wallets.length == 1;