improved backup ws connection functionality
This commit is contained in:
parent
2b46ed925b
commit
b36e5f980b
@ -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 {
|
||||||
localbitcoinplusplus.backupWS[getFLOId] = null;
|
if (typeof localbitcoinplusplus.backupWS[getFLOId]!=="object"
|
||||||
localbitcoinplusplus.backupWS[getFLOId] = new backupSupernodesWebSocketObject(back_ws_url);
|
|| localbitcoinplusplus.backupWS[getFLOId].ws_connection.readyState>2) {
|
||||||
localbitcoinplusplus.backupWS[getFLOId].connectWS();
|
localbitcoinplusplus.backupWS[getFLOId] = null;
|
||||||
/* Now in connectWS if connection fails call switchToBackupWSForSuperNodesOperations() in onClose()
|
localbitcoinplusplus.backupWS[getFLOId] = new backupSupernodesWebSocketObject(back_ws_url);
|
||||||
for next su node, if its success check for max baxkup connection conditon, if required
|
localbitcoinplusplus.backupWS[getFLOId].connectWS();
|
||||||
execute 'resolve_backup_ws_connections' in onOpen() or exit */
|
/* 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
|
||||||
|
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,17 +11342,53 @@
|
|||||||
|
|
||||||
/* 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)) {
|
// 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;
|
||||||
localbitcoinplusplus.backupWS[backup_id].ws_connection.close();
|
// if(backup_conns.ws_connection.readyState < 2) {
|
||||||
//delete localbitcoinplusplus.backupWS[backup_id];
|
// 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)) {
|
||||||
|
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) {
|
||||||
|
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];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
}
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
/*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*/
|
||||||
@ -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) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user