Websocket reconnect (and close old connection on leave)

This commit is contained in:
Sebastiaan Pasma 2018-09-12 15:09:21 +02:00
commit 6692812d55
No known key found for this signature in database
GPG key ID: 9A2B0C8B95A1D26F

View file

@ -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.setAddress = function(newAddr, copyAddress) {
$scope.addr = null; $scope.addr = null;
if (!$scope.wallet || $scope.generatingAddress || !$scope.wallet.isComplete()) return; if (!$scope.wallet || $scope.generatingAddress || !$scope.wallet.isComplete()) return;
@ -36,28 +82,16 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi
popupService.showAlert(err); popupService.showAlert(err);
} }
//close existing socket if ($scope.wallet.coin === 'bch') {
if (currentAddressSocket.close === 'function') { bchAddresses = bitcoinCashJsService.translateAddresses(addr);
currentAddressSocket.close(); $scope.addr = bchAddresses[$scope.bchAddressType.type];
} $scope.addrBchLegacy = bchAddresses['legacy'];
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'];
} else { } else {
$scope.addr = addr; $scope.addr = addr;
// listen to btc address
currentAddressSocket = new WebSocket("wss://ws.blockchain.info/inv");
paymentSubscriptionObj.addr = $scope.addr
} }
connectSocket();
if (copyAddress === true) { if (copyAddress === true) {
try { try {
clipboardService.copyToClipboard($scope.wallet.coin == 'bch' && $scope.bchAddressType.type == 'cashaddr' ? 'bitcoincash:' + $scope.addr : $scope.addr); 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); $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() { $timeout(function() {
$scope.$apply(); $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.$on("$ionicView.beforeEnter", function(event, data) {
$scope.wallets = profileService.getWallets(); $scope.wallets = profileService.getWallets();
$scope.singleWallet = $scope.wallets.length == 1; $scope.singleWallet = $scope.wallets.length == 1;