diff --git a/supernode/index.html b/supernode/index.html
index d553a6f..4b831e5 100644
--- a/supernode/index.html
+++ b/supernode/index.html
@@ -12644,7 +12644,7 @@
msg_obj.protocol = '__ALL_SUPERNODES_MSG__';
msg_obj.event = 'supernode_went_down';
msg_obj.data = {down_flo_id: getFLOId};
- msg_obj.subject_flo_id = getFLOId;
+ 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(
@@ -13471,16 +13471,17 @@
}
}
- /* ADD A CONDITION SO THAT ONLY ONE SUPERNODE IN THE LEFT CAN RUN THIS */
- const mcsFloIds = Object.keys(localbitcoinplusplus.myClosestSupernodes)
- .map(m=>m.trader_flo_address);
- const idx = mcsFloIds.indexOf(getFLOId);
- if(idx>=0) {
- // Get the list of left Supernodes of disconnected Supernodes
- console.table(mcs);
- let getLeftSusOfDisconnectedSu = mcs
- .filter((f,i)=>(i<=idx
- && localbitcoinplusplus.wallets.my_local_flo_address!==f.trader_flo_address));
+ /* ADD A CONDITION SO THAT ONLY ONE SUPERNODE IN THE LEFT CAN INFORM RIGHT BACKUP SUPERNODE OF DEAD SUPERNODE */
+ const subjectFloIdClosestNodes = await localbitcoinplusplus.kademlia.determineClosestSupernode('','','', getFLOId);
+ //const alowed_supernodes = subjectFloIdClosestNodes.slice(-localbitcoinplusplus.master_configurations.MaxBackups);
+ //const alowed_supernodes_flo_ids = alowed_supernodes.map(m=>m.trader_flo_address);
+ //const my_idx = subjectFloIdClosestNodes.indexOf(localbitcoinplusplus.wallets.my_local_flo_address);
+ const idx = Object.keys(localbitcoinplusplus.myClosestSupernodes).indexOf(getFLOId);
+ //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 = Object
+ .values(localbitcoinplusplus.myClosestSupernodes)
+ .slice(0, idx);
console.table(getLeftSusOfDisconnectedSu);
@@ -13488,6 +13489,11 @@
for (let ln = 0; ln < getLeftSusOfDisconnectedSu.length; ln++) {
const leftNodeObj = getLeftSusOfDisconnectedSu[ln];
+ if(localbitcoinplusplus.wallets.my_local_flo_address
+ === leftNodeObj.trader_flo_address) continue;
+ // First Check
+ aNearerLeftSupernodeIsAlive=leftNodeObj.is_live||false;
+ // Second check
let conns = localbitcoinplusplus.backupWS[leftNodeObj.trader_flo_address];
if(typeof conns === "object"
&& leftNodeObj.trader_flo_address !== getFLOId
@@ -13500,7 +13506,7 @@
if(!aNearerLeftSupernodeIsAlive) {
localbitcoinplusplus.actions.informAllANodeLeft(getFLOId);
}
- }
+ //}
msg = `INFO: Supernode ${getFLOId} left.`;
}
@@ -14174,14 +14180,23 @@
if (localbitcoinplusplus.master_configurations.supernodesPubKeys
.includes(localbitcoinplusplus.wallets.my_local_flo_public_key)) {
- const suList = await getNextSupernode();
+ let suList = await getNextSupernode();
let sn = suList.trader_flo_address;
+ if(sn===msg_obj.data.down_flo_id || sn===localbitcoinplusplus.wallets.my_local_flo_address) {
+ suList = await getNextSupernode(sn);
+ sn = suList.trader_flo_address;
+ }
+
+ if(typeof sn !== "string") return;
+
+ msg_obj.receiverFloAddress = sn;
+
tempWS = {};
//for(let sn in localbitcoinplusplus.myClosestSupernodes) {
(function informOneSupernode(sn) {
- if((sn!==localbitcoinplusplus.wallets.my_local_flo_address
- || sn!==msg_obj.subject_flo_id)
+ if(sn!==localbitcoinplusplus.wallets.my_local_flo_address
+ && sn!==msg_obj.data.down_flo_id
&& websocket.readyState===1) {
const url = `ws://${localbitcoinplusplus.myClosestSupernodes[sn].ip}:${localbitcoinplusplus.myClosestSupernodes[sn].port}`;
@@ -14200,7 +14215,7 @@
let closedFloId = await switchMyWS.getFloIdFromWSUrl(evt.srcElement.url);
let nxtSu = await getNextSupernode(closedFloId);
if ((nxtSu.trader_flo_address==localbitcoinplusplus.wallets.my_local_flo_address
- || nxtSu.trader_flo_address==msg_obj.subject_flo_id)) {
+ || nxtSu.trader_flo_address==msg_obj.data.down_flo_id)) {
let nxtSu2 = await getNextSupernode(nxtSu.trader_flo_address);
informOneSupernode(nxtSu2.trader_flo_address);
} else if(typeof nxtSu !== "undefined") {
@@ -20814,6 +20829,11 @@
if(res_obj.protocol === "__ALL_SUPERNODES_MSG__") {
if (!localbitcoinplusplus.master_configurations.supernodesPubKeys
.includes(res_obj.su_pubKey)) return;
+
+ // Break any possiblity of a loop
+ if(typeof res_obj.initialSender==="string"
+ && res_obj.initialSender===
+ localbitcoinplusplus.my_local_flo_address.my_local_flo_address) return;
const msg_obj = {};
msg_obj.protocol = res_obj.protocol;
@@ -20830,7 +20850,25 @@
switch (res_obj.event) {
case "supernode_went_down":
+ // This should be run by only 1 Supernode who is the reciever
+ if(localbitcoinplusplus.my_local_flo_address.my_local_flo_address
+ !== res_obj.receiverFloAddress) return;
reactor.dispatchEvent('fireNodeGoodByeEvent', res_obj.data.down_flo_id);
+
+ // SYNC DATA OF ALL SUPERNODES IN MIDDLE OF SENDER AND RECEIVER
+ // Get the Supernodes in between sender and receiver of this message
+ const total_supernodes = Object.keys(localbitcoinplusplus.myClosestSupernodes).length;
+ for (let q = total_supernodes-1; q>=0; q--) {
+ const su_obj = localbitcoinplusplus.myClosestSupernodes[q];
+ if(su_obj.trader_flo_address===res_obj.receiverFloAddress) break;
+ if(su_obj.trader_flo_address===localbitcoinplusplus.wallets.my_local_flo_address
+ || su_obj.is_live===true) continue;
+ localbitcoinplusplus.actions.sync_backup_supernode_from_backup_supernode(
+ localbitcoinplusplus.wallets.my_local_flo_address,
+ "",
+ su_obj.trader_flo_address
+ );
+ }
break;
default: