diff --git a/index.html b/index.html index 3ca3e15..203cb36 100644 --- a/index.html +++ b/index.html @@ -5858,14 +5858,45 @@ this.addContact(decodedId, address, KB); }, isNodePresent: function (flo_id, KB = this.supernodeKBucket) { + let kArray = KB.toArray(); + let kArrayFloIds = kArray.map(k => k.floID); + if (kArrayFloIds.includes(flo_id)) + return true; + else + return false; + }, + + getInnerNodes: function(flo_addr1, flo_addr2, KB = this.supernodeKBucket){ return new Promise((resolve, reject) => { - let kArray = KB.toArray(); - let kArrayFloIds = kArray.map(k => k.data.id); - if (kArrayFloIds.includes(flo_id)) { - resolve(true); - } else { - reject(false); - } + let kArrayFloIds = KB.toArray().map(k => k.floID); + var innerNodes = [] + if(kArrayFloIds.includes(flo_addr1) && kArrayFloIds.includes(flo_addr2)){ + for(var i = kArrayFloIds.indexOf(flo_addr1); i!= flo_addr2; i++){ + if(i >= kArrayFloIds.length) + i = -1 + else + innerNodes.push(kArrayFloIds[i]) + } + resolve(innerNodes) + }else + reject('Given nodes are not in KBucket') + }); + }, + + getOuterNodes: function(flo_addr1, flo_addr2, KB = this.supernodeKBucket){ + return new Promise((resolve, reject) => { + let kArrayFloIds = KB.toArray().map(k => k.floID); + var outterNodes = [] + if(kArrayFloIds.includes(flo_addr1) && kArrayFloIds.includes(flo_addr2)){ + for(var i = kArrayFloIds.indexOf(flo_addr2); i!= flo_addr1; i++){ + if(i >= kArrayFloIds.length) + i = -1 + else + outterNodes.push(kArrayFloIds[i]) + } + resolve(outterNodes) + }else + reject('Given nodes are not in KBucket') }); }, @@ -6812,7 +6843,7 @@ if(!indexArr) return `${type} credentials not found!\n` indexArr = JSON.parse(indexArr) - indexArr.forEach(i => compactIDB.removeData('credentials', indexArr[i])) + indexArr.forEach(i => compactIDB.removeData('credentials', i)) localStorage.removeItem(type) return `${type} credentials deleted!\n` } @@ -7310,48 +7341,70 @@ //stop serving the revived node reactor.dispatchEvent("stop_backup_serve", snfloID) //inform the revived node to serve the other applicable dead nodes - var kBucketArray = floSupernode.kBucket.supernodeKBucket.toArray - for(var i=0; i < floGlobals.serveList.length; i++) - if(kBucketArray.indexOf(floGlobals.serveList[i]) < kBucketArray.indexOf(snfloID)){ - var backupMsg = { - type: "startBackupServe", - snfloID: floGlobals.serveList[i], - time: Date.now() + floSupernode.kBucket.getInnerNodes(snfloID, myFloID).then(innerNodes => { + for(var i=0; i < floGlobals.serveList.length; i++) + if(!innerNodes.includes(floGlobals.serveList[i])){ + var backupMsg = { + type: "startBackupServe", + snfloID: floGlobals.serveList[i], + time: Date.now() + } + reactor.dispatchEvent("send_message_to_node", {snfloID:snfloID, backupMsg:backupMsg}) + reactor.dispatchEvent("stop_backup_serve", floGlobals.serveList[i]) + i--; //reduce iterator as an element is removed } - reactor.dispatchEvent("send_message_to_node", {snfloID:snfloID, backupMsg:backupMsg}) - reactor.dispatchEvent("stop_backup_serve", floGlobals.serveList[i]) - i--; //reduce iterator as an element is removed - } + }) } if(floGlobals.storedList.includes(snfloID)){ - var lastBackup = floGlobals.storedList.pop() - //inform the revived node to store the backup - var backupMsg1 = { - type: "startBackupStore", - snfloID:lastBackup, - time: Date.now() + if(floGlobals.backupNodes.length < floGlobals.supernodeConfig.backupDepth){ + //when less supernodes available, just connect to the revived node + var index = floGlobals.backupNodes.length + let kArrayFloIds = this.getNextSupernode(myFloID, KB.toArray().length).map(k => k.floID) + for(var i = 0; i < floGlobals.backupNodes.length; i++){ + if(snfloID == floGlobals.backupNodes[i].floID){ //revived node is already connected + index = false + break; + } + else if(kArrayFloIds.indexOf(snfloID) < kArrayFloIds.indexOf(floGlobals.backupNodes[i].floID)){ + index = i; + break; + } + } + if(index !== false){ + initateBackupWebsocket(snfloID).then(result => { + floGlobals.backupNodes.splice(index, 0, result) // add revived node as backup node + }).catch(error => console.log(error)) + } + }else{ + var lastBackup = floGlobals.storedList.pop() + //inform the revived node to store the backup + var backupMsg1 = { + type: "startBackupStore", + snfloID:lastBackup, + time: Date.now() + } + reactor.dispatchEvent("send_message_to_node", {snfloID:snfloID, backupMsg:backupMsg1}) + //inform the backup node that a node is revived + var backupMsg2 = { + type: "supernodeUp", + snfloID:snfloID, + time: Date.now() + } + reactor.dispatchEvent("send_message_to_node", {snfloID:lastBackup, backupMsg:backupMsg2}) } - reactor.dispatchEvent("send_message_to_node", {snfloID:snfloID, backupMsg:backupMsg1}) - //inform the backup node that a node is revived - var backupMsg2 = { - type: "supernodeUp", - snfloID:snfloID, - time: Date.now() - } - reactor.dispatchEvent("send_message_to_node", {snfloID:lastBackup, backupMsg:backupMsg2}) } else { - //connect to the revived node as backup if needed - var kBucketArray = floSupernode.kBucket.supernodeKBucket.toArray + //connect to the revived node as backup if needed var index = false + let kArrayFloIds = this.getNextSupernode(myFloID, KB.toArray().length).map(k => k.floID) for(var i = 0; i < floGlobals.backupNodes.length; i++){ - if(kBucketArray.indexOf(floGlobals.backupNodes[i].floID) == kBucketArray.indexOf(snfloID)) //revived node is already connected + if(snfloID == floGlobals.backupNodes[i].floID) //revived node is already connected break; - else if(kBucketArray.indexOf(floGlobals.backupNodes[i].floID) > kBucketArray.indexOf(snfloID)){ + else if(kArrayFloIds.indexOf(snfloID) < kArrayFloIds.indexOf(floGlobals.backupNodes[i].floID)){ index = i; break; } } - if(index){ + if(index !== false){ initateBackupWebsocket(snfloID).then(result => { floGlobals.backupNodes.splice(index, 0, result) // add revived node as backup node floGlobals.backupNodes.pop() // remove the last extra backup node