diff --git a/supernode/index.html b/supernode/index.html
index 0323614..b822f0e 100644
--- a/supernode/index.html
+++ b/supernode/index.html
@@ -10522,7 +10522,7 @@
ip: nearestSupernodeAddress.ip,
port: nearestSupernodeAddress.port,
trader_flo_address: nearestSupernodeAddress.kbucketId,
- is_live: true
+ is_live: null
}).then(updatedClosestSupernodes=>{
readAllDB('myClosestSupernodes').then(nearestSupernodeAddresslist=>{
showMessage(`INFO: Updated closest supernodes list successfully.`);
@@ -15258,7 +15258,7 @@
}
// Update backup db as well for all supernodes you're serving as backup
- for (let index = closestSuNodes.length; index > closestSuNodes.length-localbitcoinplusplus.master_configurations.MaxBackups; index--) {
+ for (let index = closestSuNodes.length-1; index >= closestSuNodes.length-localbitcoinplusplus.master_configurations.MaxBackups; index--) {
let firstAliveBackupFloIdForBackupSupernode;
if (closestSuNodes[index].is_live==true && typeof firstAliveBackupFloIdForBackupSupernode !== "string") {
firstAliveBackupFloIdForBackupSupernode = closestSuNodes[index].trader_flo_address;
@@ -15267,7 +15267,7 @@
firstAliveBackupFloIdForBackupSupernode, closestSuNodes[index].trader_flo_address);
} else {
// it will ask backup from backup su next closest
- for (let j = index; j <= index+localbitcoinplusplus.master_configurations.MaxBackups; j++) {
+ for (let j = index-1; j >= index-localbitcoinplusplus.master_configurations.MaxBackups; j--) {
const nextBKSu = closestSuNodes[j].trader_flo_address;
if (nextBKSu !== idbData.myLocalFLOAddress
&& closestSuNodes[index].is_live==true
@@ -15364,6 +15364,12 @@
}.bind(this);
this.ws_connection.onmessage = function (evt) {
let response = evt.data;
+
+ let isItANodeLeavingMessage = response.search(`\\-- left`);
+ if(isItANodeLeavingMessage >= 0) {
+ reactor.dispatchEvent('fireNodeGoodByeEvent', response);
+ }
+
let isRequestToLinkIp = response.search("linkMyLocalIPToMyFloId");
let isRequestToLinkOthersIp = response.search("link_Others_Local_IP_To_Their_Flo_Id");
let incoming_msg_local_ip = ``;
@@ -15385,6 +15391,12 @@
// }
onMessage(response);
}
+ if (res_obj.method==="is_node_alive_request"
+ && localbitcoinplusplus.master_configurations.supernodesPubKeys
+ .includes(localbitcoinplusplus.wallets.my_local_flo_public_key)
+ && (res_obj.params[0].receiver_flo_address == localbitcoinplusplus.wallets.my_local_flo_address)) {
+ reactor.dispatchEvent('nodeIsAlive', res_obj);
+ }
}
}.bind(this);
this.ws_connection.onerror = function (evt) {
@@ -15409,7 +15421,13 @@
},
async updateSupernodeAvailabilityStatus(ws_url, status) {
- const disconnected_su_flo_id = await this.getFloIdFromWSUrl(ws_url);
+ let disconnected_su_flo_id = '';
+ try {
+ disconnected_su_flo_id = await this.getFloIdFromWSUrl(ws_url);
+ } catch(e) {
+ disconnected_su_flo_id = ws_url; // Input is a FLO Id not url
+ }
+
const get_disconnected_su_details_list = await readDBbyIndex('myClosestSupernodes', 'trader_flo_address', disconnected_su_flo_id);
const get_disconnected_su_details = get_disconnected_su_details_list[0];
if(typeof get_disconnected_su_details !== "object") {
@@ -15519,7 +15537,7 @@
async function onMessage(evt) {
var response = evt.data;
- writeToScreen('RESPONSE: ' + response + '');
+ console.log('RESPONSE: ' + response);
// If the message is about leaving of a node determine its FLO Id
// and fire respective events
let isItANodeLeavingMessage = response.search(`\\-- left`);
@@ -16342,21 +16360,21 @@
break;
case "link_My_Local_IP_To_My_Flo_Id":
- if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") {
- const req_params = res_obj.params[0];
- if(typeof req_params.requesters_pub_key !== "string") return;
- let flo_addr_for_pubkey = bitjs.FLO_TEST.pubkey2address(req_params.requesters_pub_key);
- if(typeof flo_addr_for_pubkey !== "string") return;
- if(flo_addr_for_pubkey !== res_obj.globalParams.senderFloId) return;
- updateinDB('ipTable', {
- 'flo_public_key': req_params.requesters_pub_key,
- 'temporary_ip': incoming_msg_local_ip
- }).then((ipRes)=>{
- reactor.dispatchEvent('fireNodeWelcomeBackEvent', ipRes);
- }).finally(()=>{
- linkBackOthersLocalIPToTheirFloId();
- });
- }
+ if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") {
+ const req_params = res_obj.params[0];
+ if(typeof req_params.requesters_pub_key !== "string") return;
+ let flo_addr_for_pubkey = bitjs.FLO_TEST.pubkey2address(req_params.requesters_pub_key);
+ if(typeof flo_addr_for_pubkey !== "string") return;
+ if(flo_addr_for_pubkey !== res_obj.globalParams.senderFloId) return;
+ updateinDB('ipTable', {
+ 'flo_public_key': req_params.requesters_pub_key,
+ 'temporary_ip': incoming_msg_local_ip
+ }).then((ipRes)=>{
+ reactor.dispatchEvent('fireNodeWelcomeBackEvent', ipRes);
+ }).finally(()=>{
+ linkBackOthersLocalIPToTheirFloId();
+ });
+ }
break;
case "link_Others_Local_IP_To_Their_Flo_Id":
@@ -16701,6 +16719,13 @@
}
break;
+ case "is_node_alive_request":
+ if(localbitcoinplusplus.master_configurations.supernodesPubKeys
+ .includes(localbitcoinplusplus.wallets.my_local_flo_public_key)) {
+ reactor.dispatchEvent('nodeIsAlive', res_obj);
+ }
+ break;
+
default:
break;
}
@@ -16713,7 +16738,7 @@
}
async function processBackupUserOnMesssageRequest(response) {
- writeToScreen('RESPONSE: ' + response + '');
+ console.log('processBackupUserOnMesssageRequest RESPONSE: ' + response);
// If the message is about leaving of a node determine its FLO Id
// and fire respective events
let isItANodeLeavingMessage = response.search(`\\-- left`);
@@ -17999,6 +18024,13 @@
}
break;
+ case "is_node_alive_request":
+ if(localbitcoinplusplus.master_configurations.supernodesPubKeys
+ .includes(localbitcoinplusplus.wallets.my_local_flo_public_key)) {
+ reactor.dispatchEvent('nodeIsAlive', res_obj);
+ }
+ break;
+
default:
break;
}
@@ -18013,7 +18045,7 @@
async function handle_backup_server_messages(response) {
//var response = evt.data;
- writeToScreen('backup response: '+response);
+ console.log('backup response: '+response);
let isItANodeLeavingMessage = response.search(`\\-- left`);
@@ -18748,7 +18780,6 @@
}
}
-
function onError(evt) {
let msg = `ERROR: Websocket Connection to ${evt.srcElement.url} returned error.`;
showMessage(msg);
@@ -18823,7 +18854,7 @@
}
}
- writeToScreen("SENT: " + finalMessage);
+ console.log("SENT: " + finalMessage);
}
@@ -18876,14 +18907,6 @@
})
}
- function writeToScreen(message) {
- // var pre = document.createElement("p");
- // pre.style.wordWrap = "break-word";
- // pre.innerHTML = message;
- //output.appendChild(pre);
- console.log(message);
- }
-
/* Websocket Code Ends Here*/
@@ -19921,6 +19944,9 @@
// Upload files to DB
uploadFileToDB();
+ // Get the node cuurent active status
+ reactor.dispatchEvent("get_node_status_request");
+
if (localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(
MY_LOCAL_FLO_PUBLIC_KEY)) {
localbitcoinplusplus.master_configurations.tradableAsset1.forEach(function (
@@ -20615,15 +20641,22 @@
reactor.registerEvent('fireNodeWelcomeBackEvent');
reactor.registerEvent('fireNodeGoodByeEvent');
reactor.registerEvent('primarySupernodeUpdatingLatestDataForItsUserFromOtherSupernodes');
+ reactor.registerEvent('nodeIsAlive');
+ reactor.registerEvent('get_node_status_request');
reactor.addEventListener('fireNodeWelcomeBackEvent', function(evt) {
let getFLOId = bitjs.FLO_TEST.pubkey2address(evt.flo_public_key);
+
if(localbitcoinplusplus.master_configurations.supernodesPubKeys
.includes(evt.flo_public_key)) {
msg = `INFO: Supernode ${getFLOId} joined.`;
- } else {
- msg = `INFO: User node ${getFLOId} joined.`;
- }
+
+ const switchMyWS = new backupSupernodesWebSocketObject();
+ switchMyWS.updateSupernodeAvailabilityStatus(getFLOId, true);
+
+ } else {
+ msg = `INFO: User node ${getFLOId} joined.`;
+ }
showMessage(msg);
});
@@ -20631,7 +20664,7 @@
const switchMyWS = new backupSupernodesWebSocketObject();
switchMyWS.updateSupernodeAvailabilityStatus(evt.srcElement.url, true);
showMessage(`INFO: Connected successfully to Supernode: ${evt.srcElement.url}`);
- writeToScreen("CONNECTED");
+ console.log("CONNECTED");
let my_local_data = await readDB('localbitcoinUser', '00-01');
if (typeof my_local_data == "object"
@@ -20671,13 +20704,26 @@
reactor.addEventListener('fireNodeGoodByeEvent', function(evt_msg) {
let i = evt_msg.indexOf(' ')
- let temp_ip = evt_msg.substr(0, i)
-
+ let temp_ip = evt_msg.substr(0, i);
+
readDBbyIndex('ipTable', 'temporary_ip', temp_ip).then(async op =>{
if(op.length < 1 || typeof op[0].temporary_ip !== 'string') return;
let getFLOId = bitjs.FLO_TEST.pubkey2address(op[0].flo_public_key);
if(localbitcoinplusplus.master_configurations.supernodesPubKeys
.includes(op[0].flo_public_key)) {
+
+ // Update Node availability status to true/false
+ readDBbyIndex('myClosestSupernodes', 'trader_flo_address', getFLOId)
+ .then(cs=>{
+ if(cs.length<1) {
+ console.log(temp_ip, getFLOId);
+ console.error(`WARNING: Failed to update Supernodes status.`);
+ return;
+ }
+ const switchMyWS = new backupSupernodesWebSocketObject();
+ switchMyWS.updateSupernodeAvailabilityStatus(`ws://${cs[0].ip}:${cs[0].port}`, false);
+ });
+
msg = `INFO: Supernode ${getFLOId} left.`;
} else {
msg = `INFO: User node ${getFLOId} left.`;
@@ -20743,6 +20789,35 @@
});
+ reactor.addEventListener('nodeIsAlive', function(res_obj) {
+ try {
+ if (res_obj.params[0].JOB !== "ARE_YOU_ALIVE") return;
+ const params=res_obj.params[0];
+ if (params.receiver_flo_address !== localbitcoinplusplus.wallets.my_local_flo_address) return;
+ const switchMyWS = new backupSupernodesWebSocketObject();
+ switchMyWS.updateSupernodeAvailabilityStatus(params.trader_flo_address, true);
+ } catch(e) {
+ console.warn(e);
+ }
+ });
+
+ reactor.addEventListener('get_node_status_request', function() {
+ readAllDB('myClosestSupernodes').then(nearestSupernodeAddresslist=>{
+ const RM_RPC = new localbitcoinplusplus.rpc;
+ nearestSupernodeAddresslist.map(f=>{
+ if (f.trader_flo_address !== localbitcoinplusplus.wallets.my_local_flo_address) {
+ RM_RPC
+ .send_rpc
+ .call(this, "is_node_alive_request", {
+ JOB: 'ARE_YOU_ALIVE',
+ trader_flo_address: localbitcoinplusplus.wallets.my_local_flo_address,
+ receiver_flo_address: f.trader_flo_address
+ }).then(req=>doSend(req));
+ }
+ });
+ });
+ });
+