improved backup ws connection functionality

This commit is contained in:
Abhishek Sinha 2019-08-23 14:15:35 +05:30
parent 2b46ed925b
commit b36e5f980b

View File

@ -10918,9 +10918,38 @@
reactor.registerEvent('sync_backup_nodes_of_my_backup_node'); reactor.registerEvent('sync_backup_nodes_of_my_backup_node');
reactor.registerEvent('resolve_backup_ws_connections'); reactor.registerEvent('resolve_backup_ws_connections');
reactor.registerEvent('shift_ws_connection'); reactor.registerEvent('shift_ws_connection');
reactor.registerEvent('switchToBackupWSForSuperNodesOperations');
reactor.registerEvent('user_flo_keys_active'); reactor.registerEvent('user_flo_keys_active');
reactor.registerEvent('clean_dead_ws_conections'); reactor.registerEvent('clean_dead_ws_conections');
reactor.addEventListener('switchToBackupWSForSuperNodesOperations', async function(disconnected_url='') {
const user_data = await readDB('localbitcoinUser', '00-01');
const user_flo_pubKey = user_data.myLocalFLOPublicKey;
disconnected_url = disconnected_url.replace(/\/$/, '');
if(typeof user_flo_pubKey !== "string"
|| !localbitcoinplusplus.master_configurations.supernodesPubKeys
.includes(user_flo_pubKey)) return false;
let ideal_supernode = '';
const myClosestSupernodesArray = await readAllDB(`myClosestSupernodes`);
let nextClosestSupernodeElem = myClosestSupernodesArray
.filter((wew, index)=>{
let ww = `ws://${wew.ip}:${wew.port}`;
if(typeof z =='boolean' && z) {
z = false;
localbitcoinplusplus.MY_SUPERNODE_FLO_ADDRESS = wew.trader_flo_address;
return ww;
}
if(ww==disconnected_url) z = true;
});
reactor.dispatchEvent('shift_ws_connection', nextClosestSupernodeElem[0]);
});
reactor.addEventListener('fireNodeWelcomeBackEvent', function(evt) { reactor.addEventListener('fireNodeWelcomeBackEvent', function(evt) {
let getFLOId = bitjs.FLO_TEST.pubkey2address(evt.flo_public_key); let getFLOId = bitjs.FLO_TEST.pubkey2address(evt.flo_public_key);
@ -11239,21 +11268,30 @@
if (getFLOId===localbitcoinplusplus.wallets.my_local_flo_address) return; if (getFLOId===localbitcoinplusplus.wallets.my_local_flo_address) return;
const back_ws_url = `ws://${wsSupsObj.ip}:${wsSupsObj.port}`; const back_ws_url = `ws://${wsSupsObj.ip}:${wsSupsObj.port}`;
let currenctBackupWsList = Object.keys(localbitcoinplusplus.backupWS)
.filter(m=>localbitcoinplusplus.backupWS[m].ws_connection.readyState<2);
if (currenctBackupWsList.length
=== localbitcoinplusplus.master_configurations.MaxBackups) return;
if (typeof localbitcoinplusplus.backupWS[getFLOId]==="object" if (typeof localbitcoinplusplus.backupWS[getFLOId]==="object"
&& localbitcoinplusplus.backupWS[getFLOId].ws_connection.readyState==1) { && localbitcoinplusplus.backupWS[getFLOId].ws_connection.readyState==1) {
// This will check if more ws conns are required or not // Connect to next backup
reactor.dispatchEvent('resolve_backup_ws_connections'); reactor.dispatchEvent('switchToBackupWSForSuperNodesOperations', back_ws_url);
} else { } else {
try { try {
if (typeof localbitcoinplusplus.backupWS[getFLOId]!=="object"
|| localbitcoinplusplus.backupWS[getFLOId].ws_connection.readyState>2) {
localbitcoinplusplus.backupWS[getFLOId] = null; localbitcoinplusplus.backupWS[getFLOId] = null;
localbitcoinplusplus.backupWS[getFLOId] = new backupSupernodesWebSocketObject(back_ws_url); localbitcoinplusplus.backupWS[getFLOId] = new backupSupernodesWebSocketObject(back_ws_url);
localbitcoinplusplus.backupWS[getFLOId].connectWS(); localbitcoinplusplus.backupWS[getFLOId].connectWS();
/* Now in connectWS if connection fails call switchToBackupWSForSuperNodesOperations() in onClose() /* Now in connectWS if connection fails call switchToBackupWSForSuperNodesOperations() in onClose()
for next su node, if its success check for max baxkup connection conditon, if required for next su node, if its success check for max baxkup connection conditon, if required
execute 'resolve_backup_ws_connections' in onOpen() or exit */ execute 'resolve_backup_ws_connections' in onOpen() or exit */
}
} catch (error) { } catch (error) {
console.error(error); console.error(error);
switchToBackupWSForSuperNodesOperations(back_ws_url); reactor.dispatchEvent('switchToBackupWSForSuperNodesOperations', back_ws_url);
} }
} }
}); });
@ -11266,44 +11304,34 @@
if(!localbitcoinplusplus.master_configurations.supernodesPubKeys if(!localbitcoinplusplus.master_configurations.supernodesPubKeys
.includes(usrPubKey)) return; .includes(usrPubKey)) return;
reactor.dispatchEvent('clean_dead_ws_conections');
try { try {
// Get list of neighbour supernodes // Get list of neighbour supernodes
const myClosestSups = await readAllDB('myClosestSupernodes'); const myClosestSups = await readAllDB('myClosestSupernodes');
// Get list of backup ws connection current status // Get list of backup ws connection current status
const currenctBackupWsList = Object.keys(localbitcoinplusplus.backupWS) let currenctBackupWsList = Object.keys(localbitcoinplusplus.backupWS)
.filter(m=>localbitcoinplusplus.backupWS[m].ws_connection.readyState===1); .filter(m=>localbitcoinplusplus.backupWS[m].ws_connection.readyState<2);
for (let z = 1; z <= myClosestSups.length-1; z++) { for (let z = 1; z <= myClosestSups.length-1; z++) {
const supsObj = myClosestSups[z]; const supsObj = myClosestSups[z];
// Get latest ws connection status (again)
currenctBackupWsList = Object.keys(localbitcoinplusplus.backupWS)
.filter(m=>localbitcoinplusplus.backupWS[m].ws_connection.readyState<2);
// ws conn already present // ws conn already present
if (supsObj.trader_flo_address===currenctBackupWsList[z]) continue; if (supsObj.trader_flo_address===currenctBackupWsList[z]) continue;
if (currenctBackupWsList.length if (currenctBackupWsList.length
== localbitcoinplusplus.master_configurations.MaxBackups) { === localbitcoinplusplus.master_configurations.MaxBackups) break;
// Perhaps its better that a connection is switched off only
// when backup sync has been done successfully.
// Stop any further (and far) ws backup conns
// for (let y = z; y <= myClosestSups.length-1; y++) {
// const extra_conns_flo_id = myClosestSups[y];
// const backup_conns = localbitcoinplusplus.backupWS[extra_conns_flo_id];
// if(typeof backup_conns.ws_connection == "object") {
// localbitcoinplusplus.backupWS[extra_conns_flo_id].ws_connection.close();
// //delete localbitcoinplusplus.backupWS[backup_id];
// }
// }
break;
}
/* Break the loop as soon as this line runs
as any further ws conn releated event will be
taken care in shift_ws_connection event itself. */
reactor.dispatchEvent('shift_ws_connection', supsObj); reactor.dispatchEvent('shift_ws_connection', supsObj);
break;
} }
} catch (error) { } catch (error) {
@ -11314,18 +11342,54 @@
/* Remove WS connections which are not active currently */ /* Remove WS connections which are not active currently */
reactor.addEventListener('clean_dead_ws_conections', function() { reactor.addEventListener('clean_dead_ws_conections', function() {
for (const backup_id in localbitcoinplusplus.backupWS) { // for (const backup_id in localbitcoinplusplus.backupWS) {
// if (localbitcoinplusplus.backupWS.hasOwnProperty(backup_id)) {
// const backup_conns = localbitcoinplusplus.backupWS[backup_id];
// if(typeof backup_conns.ws_connection == "object") {
// let max_conns = 0;
// if(backup_conns.ws_connection.readyState < 2) {
// max_conns++;
// if(max_conns<=localbitcoinplusplus.master_configurations.MaxBackups) continue;
// localbitcoinplusplus.backupWS[backup_id].ws_connection.close();
// delete localbitcoinplusplus.backupWS[backup_id];
// } else {
// localbitcoinplusplus.backupWS[backup_id].ws_connection.close();
// delete localbitcoinplusplus.backupWS[backup_id];
// }
// }
// }
// }
// remove above lines with these
readAllDB(`myClosestSupernodes`).then(sups=>{
sups
.filter(f=>{
const supWSConn = localbitcoinplusplus.backupWS[f.trader_flo_address];
if(typeof supWSConn=="object" && supWSConn.ws_connection.readyState<2) {
return f;
}
})
.map(backup_id=>{
if (localbitcoinplusplus.backupWS.hasOwnProperty(backup_id)) { if (localbitcoinplusplus.backupWS.hasOwnProperty(backup_id)) {
const backup_conns = localbitcoinplusplus.backupWS[backup_id]; const backup_conns = localbitcoinplusplus.backupWS[backup_id];
if(typeof backup_conns.ws_connection == "object") { if(typeof backup_conns.ws_connection == "object") {
if(backup_conns.ws_connection.readyState > 1) { let max_conns = 0;
if(backup_conns.ws_connection.readyState < 2) {
max_conns++;
if(max_conns>localbitcoinplusplus.master_configurations.MaxBackups) {
localbitcoinplusplus.backupWS[backup_id].ws_connection.close(); localbitcoinplusplus.backupWS[backup_id].ws_connection.close();
//delete localbitcoinplusplus.backupWS[backup_id]; delete localbitcoinplusplus.backupWS[backup_id];
} }
} else {
localbitcoinplusplus.backupWS[backup_id].ws_connection.close();
delete localbitcoinplusplus.backupWS[backup_id];
} }
} }
} }
}); });
});
});
/*This function denotes that a user is probably live and is using the system*/ /*This function denotes that a user is probably live and is using the system*/
reactor.addEventListener('user_flo_keys_active', async function(usrObj) { reactor.addEventListener('user_flo_keys_active', async function(usrObj) {
@ -15966,6 +16030,9 @@
if(localbitcoinplusplus.master_configurations.supernodesPubKeys if(localbitcoinplusplus.master_configurations.supernodesPubKeys
.includes(idbData.myLocalFLOPublicKey)) { .includes(idbData.myLocalFLOPublicKey)) {
// Invoke functions
reactor.dispatchEvent('user_flo_keys_active', idbData);
wsUri.map((uri, index)=>{ wsUri.map((uri, index)=>{
// Do not serve to any requests unless data is fully synced. // Do not serve to any requests unless data is fully synced.
@ -16066,6 +16133,9 @@
} }
}); });
// Connect to nearest live backup nodes
reactor.dispatchEvent('resolve_backup_ws_connections');
} }
resolve(true); resolve(true);
@ -16081,9 +16151,12 @@
backupSupernodesWebSocketObject.prototype = { backupSupernodesWebSocketObject.prototype = {
connectWS() { connectWS() {
this.ws_connection = new WebSocket(this.ws_url); this.ws_connection = new WebSocket(this.ws_url);
const switchMyWS = new backupSupernodesWebSocketObject(); const switchMyWS = new backupSupernodesWebSocketObject();
this.ws_connection.onopen = function (evt) { this.ws_connection.onopen = function (evt) {
console.info('lalalala '+evt.srcElement.url);
reactor.addEventListener('backup_supernode_up', async function() { reactor.addEventListener('backup_supernode_up', async function() {
showMessage(`Connected to backup Supernode sever: ${evt.srcElement.url}.`); showMessage(`Connected to backup Supernode sever: ${evt.srcElement.url}.`);
switchMyWS.updateSupernodeAvailabilityStatus(evt.srcElement.url, true); switchMyWS.updateSupernodeAvailabilityStatus(evt.srcElement.url, true);
@ -16106,13 +16179,20 @@
trader_flo_address: localbitcoinplusplus.wallets.my_local_flo_address, trader_flo_address: localbitcoinplusplus.wallets.my_local_flo_address,
receiver_flo_address: conn_su_flo_id, receiver_flo_address: conn_su_flo_id,
db_inst: localbitcoinplusplus.wallets.my_local_flo_address db_inst: localbitcoinplusplus.wallets.my_local_flo_address
}).then(req=>doSend(req)); })
//.then(req=>doSend(req));
} }
// Check if the supernode is backup ws connections satisfy max baxkup master // Check if the number of backup ws connections satisfy max baxkup master
// config condition. If false, request ws connection to next backup supernode. // config condition. If false, request ws connection to next backup supernode.
// Simply execute 'resolve_backup_ws_connections' event. const currenctBackupWsList = Object.keys(localbitcoinplusplus.backupWS)
reactor.dispatchEvent('resolve_backup_ws_connections'); .filter(m=>localbitcoinplusplus.backupWS[m].ws_connection.readyState<2);
if (currenctBackupWsList.length
< localbitcoinplusplus.master_configurations.MaxBackups) {
// Request next backup to connect
reactor.dispatchEvent('switchToBackupWSForSuperNodesOperations', evt.srcElement.url);
}
} else { } else {
if (typeof conn_su_flo_id == "string") { if (typeof conn_su_flo_id == "string") {
@ -16128,15 +16208,15 @@
} }
}); });
reactor.dispatchEvent('backup_supernode_up'); reactor.dispatchEvent('backup_supernode_up');
reactor.dispatchEvent('clean_dead_ws_conections'); //reactor.dispatchEvent('clean_dead_ws_conections');
}.bind(this); }.bind(this);
this.ws_connection.onclose = function (evt) { this.ws_connection.onclose = function (evt) {
reactor.addEventListener('backup_supernode_down', async function() { reactor.addEventListener('backup_supernode_down', async function() {
showMessage(`Disconnected to backup Supernode sever: ${evt.srcElement.url}.`); showMessage(`Disconnected to backup Supernode sever: ${evt.srcElement.url}.`);
switchMyWS.updateSupernodeAvailabilityStatus(evt.srcElement.url, false); switchMyWS.updateSupernodeAvailabilityStatus(evt.srcElement.url, false);
// Invoke next backup server to connect // Invoke next backup server to connect
await switchToBackupWSForSuperNodesOperations(evt.srcElement.url); await reactor.dispatchEvent('switchToBackupWSForSuperNodesOperations', evt.srcElement.url);
reactor.dispatchEvent('clean_dead_ws_conections'); //reactor.dispatchEvent('clean_dead_ws_conections');
}); });
reactor.dispatchEvent('backup_supernode_down'); reactor.dispatchEvent('backup_supernode_down');
}.bind(this); }.bind(this);
@ -16325,34 +16405,7 @@
}, },
async switchToBackupWSForSuperNodesOperations(disconnected_url='') {
const user_data = await readDB('localbitcoinUser', '00-01');
const user_flo_address = user_data.myLocalFLOAddress;
disconnected_url = disconnected_url.replace(/\/$/, '');
if(typeof user_flo_address !== "string"
|| !localbitcoinplusplus.master_configurations.supernodesPubKeys
.includes(user_flo_address)) return false;
let ideal_supernode = '';
const myClosestSupernodesArray = await readAllDB(`myClosestSupernodes`);
let nextClosestSupernodeElem = myClosestSupernodesArray
.filter((wew, index)=>{
let ww = `ws://${wew.ip}:${wew.port}`;
if(typeof z =='boolean' && z) {
z = false;
localbitcoinplusplus.MY_SUPERNODE_FLO_ADDRESS = wew.trader_flo_address;
return ww;
}
if(ww==disconnected_url) z = true;
});
reactor.dispatchEvent('shift_ws_connection', nextClosestSupernodeElem[0]);
},
} }
function startWebSocket(wsUri) { function startWebSocket(wsUri) {