This commit is contained in:
sairajzero 2020-01-05 19:11:15 +05:30
parent bfefea5215
commit 964f29e916

View File

@ -5903,18 +5903,15 @@
getPrevSupernode: function(flo_addr, n = 1, KB = this.supernodeKBucket){ getPrevSupernode: function(flo_addr, n = 1, KB = this.supernodeKBucket){
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
try { try {
let isFloIdUint8 = flo_addr instanceof Uint8Array; let kArrayFloIds = KB.toArray().map(k => k.floID);
if (!isFloIdUint8) let pos = kArrayFloIds.indexOf(flo_addr)
flo_addr = this.floIdToKbucketId(flo_addr);
const KA = KB.toArray();
let pos = KB._indexOf(KB.root,flo_addr)
var prevSupernode = [] var prevSupernode = []
for(var i = 1; i <= n; i++){ for(var i = 1; i <= n; i++){
if(pos - i < 0) if(pos - i < 0)
var prev = pos - i + KA.length var prev = pos - i + kArrayFloIds.length
else else
var prev = pos - i var prev = pos - i
prevSupernode.push(KA[prev]) prevSupernode.push(kArrayFloIds[prev])
} }
resolve(prevSupernode); resolve(prevSupernode);
} catch (error) { } catch (error) {
@ -5926,18 +5923,15 @@
getNextSupernode: function(flo_addr, n = 1, KB = this.supernodeKBucket){ getNextSupernode: function(flo_addr, n = 1, KB = this.supernodeKBucket){
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
try { try {
let isFloIdUint8 = flo_addr instanceof Uint8Array; let kArrayFloIds = KB.toArray().map(k => k.floID);
if (!isFloIdUint8) let pos = kArrayFloIds.indexOf(flo_addr)
flo_addr = this.floIdToKbucketId(flo_addr);
const KA = KB.toArray();
let pos = KB._indexOf(KB.root,flo_addr)
var nextSupernode = [] var nextSupernode = []
for(var i = 1; i <= n; i++){ for(var i = 1; i <= n; i++){
if(pos + i >= KA.length) if(pos + i >= kArrayFloIds.length)
var next = pos + i - KA.length var next = pos + i - kArrayFloIds.length
else else
var next = pos + i var next = pos + i
nextSupernode.push(KA[next]) nextSupernode.push(kArrayFloIds[next])
} }
resolve(nextSupernode); resolve(nextSupernode);
} catch (error) { } catch (error) {
@ -5952,7 +5946,8 @@
let isFloIdUint8 = flo_addr instanceof Uint8Array; let isFloIdUint8 = flo_addr instanceof Uint8Array;
if (!isFloIdUint8) if (!isFloIdUint8)
flo_addr = this.floIdToKbucketId(flo_addr); flo_addr = this.floIdToKbucketId(flo_addr);
const closestSupernode = KB.closest(flo_addr, n); var closestSupernode = KB.closest(flo_addr, n);
closestSupernode = closestSupernode.map(k => k.floID);
resolve(closestSupernode); resolve(closestSupernode);
} catch (error) { } catch (error) {
reject(error); reject(error);
@ -5964,8 +5959,8 @@
//Sends data to the supernode //Sends data to the supernode
sendData: function (data, floID) { sendData: function (data, floID) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.kBucket.determineClosestSupernode(floID).then(result => { this.kBucket.determineClosestSupernode(floID).then(closestNode => {
var websocket = new WebSocket("wss://" + floGlobals.supernodes[result[0].floID].uri + "/ws"); var websocket = new WebSocket("wss://" + floGlobals.supernodes[closestNode[0]].uri + "/ws");
websocket.onopen = (evt) => { websocket.onopen = (evt) => {
websocket.send(data); websocket.send(data);
resolve(`Data sent to ${floID}'s supernode`); resolve(`Data sent to ${floID}'s supernode`);
@ -5983,8 +5978,8 @@
//Request data from supernode //Request data from supernode
requestData: function (request, floID) { requestData: function (request, floID) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.kBucket.determineClosestSupernode(floID).then(result => { this.kBucket.determineClosestSupernode(floID).then(closestNode => {
var websocket = new WebSocket("wss://" + floGlobals.supernodes[result[0].floID].uri + "/ws"); var websocket = new WebSocket("wss://" + floGlobals.supernodes[closestNode[0]].uri + "/ws");
websocket.onopen = (evt) => { websocket.onopen = (evt) => {
websocket.send(`?${request}`); websocket.send(`?${request}`);
}; };
@ -6074,8 +6069,8 @@
request = request.split(" "); request = request.split(" ");
requestor = request[0]; requestor = request[0];
request = JSON.parse(request[1]); request = JSON.parse(request[1]);
floSupernode.kBucket.determineClosestSupernode(request.receiverID).then(result => { floSupernode.kBucket.determineClosestSupernode(request.receiverID).then(closestNode => {
if(floGlobals.serveList.includes(result[0].floID)){ if(floGlobals.serveList.includes(closestNode[0])){
var filterOptions = { var filterOptions = {
lowerKey: request.lowerVectorClock, lowerKey: request.lowerVectorClock,
upperKey: request.upperVectorClock, upperKey: request.upperVectorClock,
@ -6083,7 +6078,7 @@
atKey: request.atVectorClock, atKey: request.atVectorClock,
patternEval: (k, v) => { return (v.application == request.application && v.receiverID == request.receiverID && (!request.comment || v.comment == request.comment) && (!request.type || v.type == request.type) && (!request.senderIDs || request.senderIDs.includes(v.senderID))) } patternEval: (k, v) => { return (v.application == request.application && v.receiverID == request.receiverID && (!request.comment || v.comment == request.comment) && (!request.type || v.type == request.type) && (!request.senderIDs || request.senderIDs.includes(v.senderID))) }
} }
compactIDB.searchData( floGlobals.diskList.includes(request.application) ? request.application : floGlobals.defaultDisk, filterOptions, `SN_${result[0].floID}`) compactIDB.searchData( floGlobals.diskList.includes(request.application) ? request.application : floGlobals.defaultDisk, filterOptions, `SN_${closestNode[0]}`)
.then(result => floSupernode.supernodeClientWS.send(`${requestor} ${JSON.stringify(result)}`)) .then(result => floSupernode.supernodeClientWS.send(`${requestor} ${JSON.stringify(result)}`))
.catch(error => console.log(error)) .catch(error => console.log(error))
} }
@ -6100,8 +6095,8 @@
try { try {
data = JSON.parse(data) data = JSON.parse(data)
if(!data.backupMsg){ //Serving Users if(!data.backupMsg){ //Serving Users
floSupernode.kBucket.determineClosestSupernode(data.receiverID).then(result => { floSupernode.kBucket.determineClosestSupernode(data.receiverID).then(closestNode => {
if (floGlobals.serveList.includes(result[0].floID) if (floGlobals.serveList.includes(closestNode[0])
&& data.senderID == floCrypto.getFloIDfromPubkeyHex(data.pubKey) && data.senderID == floCrypto.getFloIDfromPubkeyHex(data.pubKey)
&& floCrypto.verifySign(JSON.stringify(data.message), data.sign, data.pubKey)){ && floCrypto.verifySign(JSON.stringify(data.message), data.sign, data.pubKey)){
var key = `${Date.now()}_${data.senderID}` var key = `${Date.now()}_${data.senderID}`
@ -6115,8 +6110,8 @@
type: data.type, type: data.type,
comment: data.comment comment: data.comment
} }
compactIDB.addData(floGlobals.diskList.includes(value.application) ? value.application:floGlobals.defaultDisk , value ,key,`SN_${result[0].floID}`) compactIDB.addData(floGlobals.diskList.includes(value.application) ? value.application:floGlobals.defaultDisk , value ,key,`SN_${closestNode[0]}`)
reactor.dispatchEvent("send_backup",{ key:key, value:value, snfloID: result[0].floID}) reactor.dispatchEvent("send_backup",{ key:key, value:value, snfloID: closestNode[0]})
} }
}).catch(error => console.log(error)) }).catch(error => console.log(error))
}else if(data.from in floGlobals.supernodes) }else if(data.from in floGlobals.supernodes)
@ -7008,11 +7003,11 @@
if(i >= floGlobals.supernodeConfig.backupDepth) if(i >= floGlobals.supernodeConfig.backupDepth)
resolve("Connected to all backup nodes") resolve("Connected to all backup nodes")
else{ else{
floSupernode.kBucket.getNextSupernode(curNode).then(nextBackupNode => { floSupernode.kBucket.getNextSupernode(curNode).then(nextNode => {
if(myFloID === nextBackupNode[0].floID) if(myFloID === nextNode[0])
reject("Not enough supernodes available") reject("Not enough supernodes available")
else{ else{
connectToBackupSupernode(nextBackupNode[0].floID).then(backupConn => { connectToBackupSupernode(nextNode[0]).then(backupConn => {
floGlobals.backupNodes[i] = backupConn floGlobals.backupNodes[i] = backupConn
connectToAllBackupSupernode(backupConn.floID, i+1) connectToAllBackupSupernode(backupConn.floID, i+1)
.then(result => resolve(result)) .then(result => resolve(result))
@ -7030,8 +7025,8 @@
.then(result => resolve(result)) .then(result => resolve(result))
.catch(error => { .catch(error => {
console.log(error) console.log(error)
floSupernode.kBucket.getNextSupernode(backupNodeID).then(nextBackupNode => { floSupernode.kBucket.getNextSupernode(backupNodeID).then(nextNode => {
connectToBackupSupernode(nextBackupNode[0].floID).then(result => resolve(result)) connectToBackupSupernode(nextNode[0]).then(result => resolve(result))
}).catch(error => console.log(error)) }).catch(error => console.log(error))
}) })
}) })
@ -7358,23 +7353,24 @@
if(floGlobals.storedList.includes(snfloID)){ if(floGlobals.storedList.includes(snfloID)){
if(floGlobals.backupNodes.length < floGlobals.supernodeConfig.backupDepth){ if(floGlobals.backupNodes.length < floGlobals.supernodeConfig.backupDepth){
//when less supernodes available, just connect to the revived node //when less supernodes available, just connect to the revived node
var index = floGlobals.backupNodes.length floSupernode.kBucket.getNextSupernode(myFloID, floSupernode.kBucket.supernodeKBucket.toArray().length).then(kArrayFloIds => {
let kArrayFloIds = this.getNextSupernode(myFloID, KB.toArray().length).map(k => k.floID) var index = floGlobals.backupNodes.length
for(var i = 0; i < floGlobals.backupNodes.length; i++){ for(var i = 0; i < floGlobals.backupNodes.length; i++){
if(snfloID == floGlobals.backupNodes[i].floID){ //revived node is already connected if(snfloID == floGlobals.backupNodes[i].floID){ //revived node is already connected
index = false index = false
break; break;
}
else if(kArrayFloIds.indexOf(snfloID) < kArrayFloIds.indexOf(floGlobals.backupNodes[i].floID)){
index = i;
break;
}
} }
else if(kArrayFloIds.indexOf(snfloID) < kArrayFloIds.indexOf(floGlobals.backupNodes[i].floID)){ if(index !== false){
index = i; initateBackupWebsocket(snfloID).then(result => {
break; floGlobals.backupNodes.splice(index, 0, result) // add revived node as backup node
}).catch(error => console.log(error))
} }
} }).catch(error => console.log(error))
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{ }else{
var lastBackup = floGlobals.storedList.pop() var lastBackup = floGlobals.storedList.pop()
//inform the revived node to store the backup //inform the revived node to store the backup
@ -7394,22 +7390,23 @@
} }
} else { } else {
//connect to the revived node as backup if needed //connect to the revived node as backup if needed
var index = false floSupernode.kBucket.getNextSupernode(myFloID, floSupernode.kBucket.supernodeKBucket.toArray().length).then(kArrayFloIds => {
let kArrayFloIds = this.getNextSupernode(myFloID, KB.toArray().length).map(k => k.floID) var index = false
for(var i = 0; i < floGlobals.backupNodes.length; i++){ for(var i = 0; i < floGlobals.backupNodes.length; i++){
if(snfloID == floGlobals.backupNodes[i].floID) //revived node is already connected if(snfloID == floGlobals.backupNodes[i].floID) //revived node is already connected
break; break;
else if(kArrayFloIds.indexOf(snfloID) < kArrayFloIds.indexOf(floGlobals.backupNodes[i].floID)){ else if(kArrayFloIds.indexOf(snfloID) < kArrayFloIds.indexOf(floGlobals.backupNodes[i].floID)){
index = i; index = i;
break; break;
}
} }
} if(index !== false){
if(index !== false){ initateBackupWebsocket(snfloID).then(result => {
initateBackupWebsocket(snfloID).then(result => { floGlobals.backupNodes.splice(index, 0, result) // add revived node as backup node
floGlobals.backupNodes.splice(index, 0, result) // add revived node as backup node floGlobals.backupNodes.pop() // remove the last extra backup node
floGlobals.backupNodes.pop() // remove the last extra backup node }).catch(error => console.log(error))
}).catch(error => console.log(error)) }
} }).catch(error => console.log(error))
} }
}) })