diff --git a/supernode/index.html b/supernode/index.html index 0a4878e..0f5c922 100644 --- a/supernode/index.html +++ b/supernode/index.html @@ -13450,8 +13450,8 @@ //if(alowed_supernodes_flo_ids.includes(localbitcoinplusplus.wallets.my_local_flo_address)) { // Get the list of "left side" Supernodes of the disconnected Supernode let getLeftSusOfDisconnectedSu = subjectFloIdClosestNodesFloIdsFromLeft.slice(0, my_idx); - - console.table(getLeftSusOfDisconnectedSu); + if(getLeftSusOfDisconnectedSu.length<1) return; + console.table(getLeftSusOfDisconnectedSu); let aNearerLeftSupernodeIsAlive = false; @@ -13736,9 +13736,10 @@ /*Shifting a WS Connection Function*/ reactor.addEventListener("shift_ws_connection", function(wsSupsObj) { + console.trace(wsSupsObj); const getFLOId = wsSupsObj.trader_flo_address; - if (getFLOId === localbitcoinplusplus.wallets.my_local_flo_address) - return; + if (getFLOId === localbitcoinplusplus.wallets.my_local_flo_address + || typeof getFLOId !== "string") return; const back_ws_url = `ws://${wsSupsObj.ip}:${wsSupsObj.port}`; let currenctBackupWsList = Object.keys( @@ -13747,6 +13748,22 @@ m => localbitcoinplusplus.backupWS[m].ws_connection.readyState < 2 ); + const reqFloIdIndex = Object.keys(localbitcoinplusplus.myClosestSupernodes).indexOf(getFLOId); + + // Get the highest index of connected supernodes + let highestIndexOfConnectedSupernode = -1; + + for(let i=0; i<=currenctBackupWsList.length; i++) { + if(localbitcoinplusplus.myClosestSupernodes.indexOf(currenctBackupWsList[i]) + >highestIndexOfConnectedSupernode) { + highestIndexOfConnectedSupernode + = localbitcoinplusplus.myClosestSupernodes.indexOf(currenctBackupWsList[i]); + } + } + + // Only if a nearer Supernode than any connected Supernode can pass through + if(reqFloIdIndex>=highestIndexOfConnectedSupernode) return; + if ( typeof localbitcoinplusplus.backupWS[getFLOId] === "object" && localbitcoinplusplus.backupWS[getFLOId].ws_connection.readyState == 1 @@ -13846,8 +13863,8 @@ highestIndexOfConnectedSupernode ) { /* 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. */ + as any further ws conn releated event will be + taken care in shift_ws_connection event itself. */ reactor.dispatchEvent("shift_ws_connection", supsObj); break; } else { @@ -13889,28 +13906,22 @@ 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; - return ww; - } - if (ww == disconnected_url) z = true; - } - ); + + const switchMyWS = new backupSupernodesWebSocketObject(); + let dis_floid = await switchMyWS.getFloIdFromWSUrl(disconnected_url); + let nextClosestSupernodeElem = await getNextSupernode(dis_floid); + console.log("nextClosestSupernodeElem", nextClosestSupernodeElem); if ( typeof nextClosestSupernodeElem == "object" && nextClosestSupernodeElem !== null && nextClosestSupernodeElem !== undefined - && nextClosestSupernodeElem[0].trader_flo_address + && nextClosestSupernodeElem.trader_flo_address !== user_data.myLocalFLOAddress ) { reactor.dispatchEvent( "shift_ws_connection", - nextClosestSupernodeElem[0] + nextClosestSupernodeElem ); } else { console.log(nextClosestSupernodeElem); @@ -13958,29 +13969,37 @@ }); /*This function denotes that a user is probably live and is using the system*/ - reactor.addEventListener("user_flo_keys_active", async function(usrObj) { - if ( - localbitcoinplusplus.master_configurations.supernodesPubKeys.includes( - usrObj.myLocalFLOPublicKey - ) - ) { - // Connect to nearest live backup nodes - reactor.dispatchEvent("resolve_backup_ws_connections"); - // Inform left side Supernodes you are back + reactor.addEventListener("user_flo_keys_active", async function(FLOPublicKey="") { + try { + if(typeof localbitcoinplusplus.wallets.MY_SUPERNODE_PRIVATE_KEY!=="string") + throw new Error('Private key is not set.'); const RM_WALLET = new localbitcoinplusplus.wallets; - const msg_obj = {}; - msg_obj.protocol = '__ALL_SUPERNODES_MSG__'; - msg_obj.event = 'supernode_came_back'; - msg_obj.data = { subject_flo_id: localbitcoinplusplus.wallets.my_local_flo_address }; - msg_obj.initialSender = localbitcoinplusplus.wallets.my_local_flo_address; - msg_obj.su_pubKey = localbitcoinplusplus.wallets.my_local_flo_public_key; - msg_obj.hash = Crypto.SHA256(msg_obj); - msg_obj.sign = RM_WALLET.sign( - msg_obj.hash, - localbitcoinplusplus.wallets.MY_SUPERNODE_PRIVATE_KEY - ); - reactor.dispatchEvent("informLeftSuperNode", msg_obj, - n = localbitcoinplusplus.master_configurations.MaxBackups); + const userKeysObj = RM_WALLET.generateFloKeys(localbitcoinplusplus.wallets.MY_SUPERNODE_PRIVATE_KEY); + if ( + typeof userKeysObj==="object" + && localbitcoinplusplus.master_configurations.supernodesPubKeys.includes( + userKeysObj.pubKeyHex + ) + ) { + // Connect to nearest live backup nodes + reactor.dispatchEvent("resolve_backup_ws_connections"); + // Inform left side Supernodes you are back + const msg_obj = {}; + msg_obj.protocol = '__ALL_SUPERNODES_MSG__'; + msg_obj.event = 'supernode_came_back'; + msg_obj.data = { subject_flo_id: userKeysObj.address }; + msg_obj.initialSender = userKeysObj.address; + msg_obj.su_pubKey = userKeysObj.pubKeyHex; + msg_obj.hash = Crypto.SHA256(msg_obj); + msg_obj.sign = RM_WALLET.sign( + msg_obj.hash, + localbitcoinplusplus.wallets.MY_SUPERNODE_PRIVATE_KEY + ); + reactor.dispatchEvent("informLeftSuperNode", msg_obj, + n = localbitcoinplusplus.master_configurations.MaxBackups); + } + } catch (error) { + throw new Error(error); } }); @@ -13989,16 +14008,18 @@ showMessage(`Disconnected to backup Supernode sever: ${evt.srcElement.url}.`); const switchMyWS = new backupSupernodesWebSocketObject(); const disconnected_su_flo_id = await switchMyWS.getFloIdFromWSUrl(evt.srcElement.url); - // switchMyWS.updateSupernodeAvailabilityStatus( - // evt.srcElement.url, - // false - // ); - reactor.dispatchEvent("fireNodeGoodByeEvent", disconnected_su_flo_id); - // Request next backup server to connect - await reactor.dispatchEvent( - "switchToBackupWSForSuperNodesOperations", - evt.srcElement.url + switchMyWS.updateSupernodeAvailabilityStatus( + evt.srcElement.url, + false ); + if(!evt.wasClean) { + reactor.dispatchEvent("fireNodeGoodByeEvent", disconnected_su_flo_id); + // Request next backup server to connect + await reactor.dispatchEvent( + "switchToBackupWSForSuperNodesOperations", + evt.srcElement.url + ); + } }); reactor.addEventListener("backup_supernode_up", async function(url='') { @@ -14166,7 +14187,7 @@ allSus = allSus.filter((f,i)=>i= 0; i--) { + for (let i = allSus.length-1; i >= 0; i--) { let prevSuObj = allSus[i]; let nextSu = prevSuObj.trader_flo_address; if (nextSu===flo_id) continue; @@ -14272,15 +14293,17 @@ }); reactor.addEventListener("informLeftSuperNode", async function(msg_obj={}, n=0) { + const pubkey = localbitcoinplusplus.wallets.my_local_flo_public_key|| msg_obj.su_pubKey; + const usrAddr = localbitcoinplusplus.wallets.my_local_flo_address || bitjs.FLO_TEST.pubkey2address(pubkey); if (localbitcoinplusplus.master_configurations.supernodesPubKeys - .includes(localbitcoinplusplus.wallets.my_local_flo_public_key)) { + .includes(pubkey)) { let m = localbitcoinplusplus.master_configurations.MaxBackups; let successfully_informed=0; if(n>0) m=n; let suList = await getPrevSupernode(); let sn = suList.trader_flo_address; - if(sn===msg_obj.data.subject_flo_id || sn===localbitcoinplusplus.wallets.my_local_flo_address) { + if(sn===msg_obj.data.subject_flo_id || sn===usrAddr) { suList = await getPrevSupernode(sn); sn = suList.trader_flo_address; } @@ -14292,7 +14315,7 @@ tempWSL = {}; //for(let sn in localbitcoinplusplus.myClosestSupernodes) { (function informOneSupernode(sn) { - if(sn!==localbitcoinplusplus.wallets.my_local_flo_address + if(sn!==usrAddr && sn!==msg_obj.data.subject_flo_id && websocket.readyState===1) { const switchMyWS = new backupSupernodesWebSocketObject(); @@ -14302,30 +14325,30 @@ tempWSL[sn].onopen = async function(evt) { await localbitcoinplusplus.actions.delay(5000); tempWSL[sn].send(JSON.stringify(msg_obj)); + successfully_informed++; + console.info("successfully_informed:", successfully_informed); await localbitcoinplusplus.actions.delay(5000); tempWSL[sn].close(); if(successfully_informed { // Do not serve to any requests unless data is fully synced. @@ -20582,8 +20622,6 @@ idbData.myLocalFLOPublicKey ) ) { - // Invoke functions - reactor.dispatchEvent("user_flo_keys_active", idbData); wsUri.map((uri, index) => { // Do not serve to any requests unless data is fully synced. @@ -20891,7 +20929,6 @@ } function onClose(evt) { - reactor.dispatchEvent("primary_supernode_down", evt); // Also close the backup ws conns if(localbitcoinplusplus.master_configurations.supernodesPubKeys .includes(localbitcoinplusplus.wallets.my_local_flo_public_key)) { @@ -20899,6 +20936,7 @@ localbitcoinplusplus.backupWS[conn].ws_connection.close(); } } + reactor.dispatchEvent("primary_supernode_down", evt); } async function onMessage(evt) {