diff --git a/supernode/index.html b/supernode/index.html
index d432ba7..8f532c7 100644
--- a/supernode/index.html
+++ b/supernode/index.html
@@ -14871,7 +14871,8 @@
newKeys.address.length > 0) {
localbitcoinplusplusObj.myLocalFLOAddress = newKeys.address;
localbitcoinplusplusObj.myLocalFLOPublicKey = newKeys.pubKeyHex;
-
+ localbitcoinplusplusObj.lastConnectedTime = + new Date();
+
// launch KBuckets
launchKBuckects = await localbitcoinplusplus.kademlia.launchKBucket(newKeys.address);
@@ -14881,8 +14882,6 @@
throw new Error(kmsg);
}
- updateinDB("localbitcoinUser", localbitcoinplusplusObj, "00-01");
-
wsUri = await localbitcoinplusplus.kademlia.getSupernodeSeed(
localbitcoinplusplusObj.myLocalFLOAddress);
@@ -14927,6 +14926,10 @@
BACKUP_DB[uri.trader_flo_address].createNewDB();
});
+ localbitcoinplusplus.MY_SUPERNODE_FLO_ADDRESS = wsUri[0].trader_flo_address;
+
+ updateinDB("localbitcoinUser", localbitcoinplusplusObj, "00-01");
+
resolve(true);
return;
@@ -14965,12 +14968,21 @@
localbitcoinplusplus.kademlia.restoreSupernodeKBucket();
- // Get the most ideal supernode to connect
-
-
// Connect with primary supernodes
await startWebSocket(`ws://${wsUri[0].ip}:${wsUri[0].port}`);
+ // Check last connected supernode, if not primary then
+ // update the user data from other su first
+ if (typeof idbData.lastConnectedSupernode == "string"
+ && idbData.lastConnectedSupernode !== wsUri[0].trader_flo_address) {
+ showMessage(`INFO: We are fetching your latest data. This could take some time. Do not close the window until then.`);
+ reactor.dispatchEvent('primarySupernodeUpdatingLatestDataForItsUserFromOtherSupernodes',
+ { requesting_user_id: idbData.myLocalFLOAddress});
+ await localbitcoinplusplus.actions.delay(180000).then(()=>{
+ showMessage(`INFO: Data syncing is complete.`);
+ });
+ }
+
// rebuild private key
await privateKeyBuilder();
@@ -15501,9 +15513,24 @@
this.ws_connection = new WebSocket(this.ws_url);
const switchMyWS = new backupSupernodesWebSocketObject();
this.ws_connection.onopen = function (evt) {
- reactor.addEventListener('backup_supernode_up', function() {
+ reactor.addEventListener('backup_supernode_up', async function() {
showMessage(`Connected to backup Supernode sever: ${evt.srcElement.url}.`);
switchMyWS.updateSupernodeAvailabilityStatus(evt.srcElement.url, true);
+ let my_local_data = await readDB('localbitcoinUser', '00-01');
+ if (typeof my_local_data == "object"
+ && localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(my_local_data.myLocalFLOAddress)) {
+ const conn_su_flo_id = await switchMyWS.getFloIdFromWSUrl(evt.srcElement.url);
+
+ if (typeof conn_su_flo_id == "string") {
+ my_local_data.lastConnectedTime = + new Date();
+ my_local_data.lastConnectedSupernode = conn_su_flo_id;
+ updateinDB('localbitcoinUser', my_local_data);
+ } else {
+ mss = `WARNING: Failed to update current supernode connected status in localbitcoinUser.`;
+ showMessage(mss);
+ throw new Error(mss);
+ }
+ }
});
reactor.dispatchEvent('backup_supernode_up');
}.bind(this);
@@ -15647,13 +15674,7 @@
}
function onOpen(evt) {
- reactor.addEventListener('primary_supernode_up', function() {
- const switchMyWS = new backupSupernodesWebSocketObject();
- switchMyWS.updateSupernodeAvailabilityStatus(evt.srcElement.url, true);
- showMessage(`Connected successfully to Supernode: ${evt.srcElement.url}`);
- writeToScreen("CONNECTED");
- });
- reactor.dispatchEvent('primary_supernode_up');
+ reactor.dispatchEvent('new_supernode_connected', evt);
}
function onClose(evt) {
@@ -16661,7 +16682,7 @@
(async function() {
let getPrimarySuObj = await localbitcoinplusplus.kademlia
- .determineClosestSupernode(subjectUser);
+ .determineClosestSupernode(res_obj.params[0].trader_flo_address);
let primarySupernode = getPrimarySuObj[0].data.id;
@@ -16684,36 +16705,9 @@
showMessage(mss);
throw new Error(mss);
}
- if (data.vectorClock < myOwnDBData.vectorClock) {
- // You have the latest data, send it to other supernodes
-
- let getNextClosestSuObj = await localbitcoinplusplus.kademlia
- .determineClosestSupernode(req_dt.leaving_supernode_flo_id, 3);
-
- getNextClosestSuObj.map((nextSu, i)=>{
- if(nextSu.data.id !==localbitcoinplusplus.wallets.my_local_flo_address) {
- let nextSuConn = localbitcoinplusplus.backupWS[nextSu.data.id];
- if(typeof nextSuConn !== "object") {
- let msg = `WARNING: Failed to open a backup WS connection with Supernode ${nextSu}.`;
- showMessage(msg);
- throw new Error(msg);
- }
- let server_response = RM_RPC
- .send_rpc
- .call(this, "sync_data_by_vector_clock", {
- trader_flo_address: data.trader_flo_address,
- receiver_flo_address: nextSu.data.id,
- leaving_supernode_flo_id: req_dt.leaving_supernode_flo_id,
- data: myOwnDBData,
- dbTable: dbTable
- });
- doSend(server_response, nextSu.data.id);
- }
-
- })
-
- } else if(data.vectorClock > myOwnDBData.vectorClock) {
+ if(data.vectorClock > myOwnDBData.vectorClock) {
// You have old data, update respective DB.
+ data.increaseVectorClock = false;
updateinDB(dbTable, data).then(()=>{
showMessage(`INFO: Data updated in ${dbTable} for id ${data.id}.`);
});
@@ -18111,6 +18105,8 @@
myLocalFLOAddress: "",
myLocalFLOPublicKey: "",
myAddressTrustLevel: 1,
+ lastConnectedSupernode: "",
+ lastConnectedTime: "",
};
const userPublicData = {
@@ -18498,6 +18494,9 @@
try {
if(typeof Obj.vectorClock == "undefined") {
Obj.vectorClock = 0;
+ } else if(typeof Obj.increaseVectorClock == "boolean"
+ && Obj.increaseVectorClock === false) {
+ // leave the vector clock field unchanged
} else {
Obj.vectorClock += 1;
}
@@ -19729,12 +19728,17 @@
+