diff --git a/index.html b/index.html index 2f93325..6b155e3 100644 --- a/index.html +++ b/index.html @@ -5218,6 +5218,50 @@ } }); }, + getPrevSupernode: function(flo_addr, n = 1, KB = this.supernodeKBucket){ + return new Promise((resolve, reject) => { + try { + let isFloIdUint8 = flo_addr instanceof Uint8Array; + if (!isFloIdUint8) + flo_addr = this.floIdToKbucketId(flo_addr); + const KA = KB.toArray(); + let pos = KB._indexOf(KB.root,flo_addr) + var prevSupernode = [] + for(var i = 1; i <= n; i++){ + if(pos - i < 0) + var prev = pos - i + KA.length + else + var prev = pos - i + prevSupernode.push(KA[prev]) + } + resolve(prevSupernode); + } catch (error) { + reject(error); + } + }); + }, + getNextSupernode: function(flo_addr, n = 1, KB = this.supernodeKBucket){ + return new Promise((resolve, reject) => { + try { + let isFloIdUint8 = flo_addr instanceof Uint8Array; + if (!isFloIdUint8) + flo_addr = this.floIdToKbucketId(flo_addr); + const KA = KB.toArray(); + let pos = KB._indexOf(KB.root,flo_addr) + var nextSupernode = [] + for(var i = 1; i <= n; i++){ + if(pos + i >= KA.length) + var next = pos + i - KA.length + else + var next = pos + i + nextSupernode.push(KA[next]) + } + resolve(nextSupernode); + } catch (error) { + reject(error); + } + }); + }, determineClosestSupernode: function (flo_addr, n = 1, KB = this.supernodeKBucket) { return new Promise((resolve, reject) => { try { @@ -5233,42 +5277,78 @@ } }, + sendDataToSN(data, snfloID){ + return new Promise((resolve, reject) => { + console.log(snfloID) + var websocket = new WebSocket("wss://" + floGlobals.supernodes[snfloID].uri + "/ws"); + websocket.onmessage = (evt => { + if(evt.data == '$+'){ + websocket.send(data); + resolve(`Data sent to supernode : ${snfloID}`); + }else if(evt.data == '$-'){ + this.kBucket.getNextSupernode(snfloID) + .then(nextnode => this.sendDataToSN(data, nextnode[0].floID)) + .catch(error => reject(error)) + }else{ + console.log(evt.data) + reject(evt.data) + } + websocket.close(); + }) + websocket.onerror = (evt) => { + this.kBucket.getNextSupernode(snfloID) + .then(nextnode => this.sendDataToSN(data, nextnode[0].floID)) + .catch(error => reject(error)) + }; + }) + }, + //Sends data to the supernode sendData: function (data, floID) { return new Promise((resolve, reject) => { this.kBucket.determineClosestSupernode(floID).then(result => { - var websocket = new WebSocket("wss://" + floGlobals.supernodes[result[0].floID].uri + "/ws"); - websocket.onopen = (evt) => { - websocket.send(data); - resolve(`Data sent to ${floID}'s supernode`); - websocket.close(); - }; - websocket.onerror = (evt) => { - reject(evt); - }; + this.sendDataToSN(data, result[0].floID) + .then(result => resolve(result)) + .catch(error => reject(error)) }).catch(error => { - reject(error); + reject(error); }); }); }, + requestDataFromSN(request, snfloID){ + return new Promise((resolve, reject) => { + var websocket = new WebSocket("wss://" + floGlobals.supernodes[snfloID].uri + "/ws"); + websocket.onmessage = (evt => { + if(evt.data == '$+'){ + websocket.send(`?${request}`); + }else if(evt.data == '$-'){ + this.kBucket.getNextSupernode(snfloID) + .then(nextnode => this.requestDataFromSN(request, nextnode[0].floID)) + .catch(error => reject(error)) + websocket.close() + }else{ + resolve(evt.data); + websocket.close(); + } + }) + websocket.onerror = (evt) => { + this.kBucket.getNextSupernode(snfloID) + .then(nextnode => this.requestDataFromSN(request, nextnode[0].floID)) + .catch(error => reject(error)) + }; + }) + }, + //Request data from supernode requestData: function (request, floID) { return new Promise((resolve, reject) => { this.kBucket.determineClosestSupernode(floID).then(result => { - var websocket = new WebSocket("wss://" + floGlobals.supernodes[result[0].floID].uri + "/ws"); - websocket.onopen = (evt) => { - websocket.send(`?${request}`); - }; - websocket.onmessage = (evt) => { - resolve(evt.data); - websocket.close(); - }; - websocket.onerror = (evt) => { - reject(evt); - }; + this.requestDataFromSN(request, result[0].floID) + .then(result => resolve(result)) + .catch(error => reject(error)) }).catch(error => { - reject(error); + reject(error); }); }); }