Adding reload API data button

The reload API data button (top-right) refreshes the API for new data
The refreshed API data are added to memory as well as stored in IDB.
The kBucket is reloaded
This commit is contained in:
sairajzero 2019-07-24 15:01:21 +05:30
parent 174b9fddf6
commit 20c8f124e5
7 changed files with 383 additions and 306 deletions

View File

@ -148,7 +148,7 @@ var encrypt = {
getPubKeyHex: function(privateKeyHex){
var key = new Bitcoin.ECKey(privateKeyHex);
if(key.priv == null){
alert("Invalid Private key");
console.log("Invalid Private key");
return;
}
key.setCompressed(true);
@ -287,9 +287,349 @@ function logout(){
window.location.href = "index.html";
}
/*Refresh profile and superNode data from API */
function ajax(method, uri){
var request = new XMLHttpRequest();
var url = `${api_url}/${uri}`
console.log(url)
var result;
request.open(method,url , false);
request.onload = function () {
if (request.readyState == 4 && request.status == 200)
result = this.response;
else {
console.log('error');
result = false;
}
};
request.send();
console.log(result);
return result;
}
function reloadInitData(){
refreshAPIdata.then(result => {
console.log(result);
kBucketObj.launchKBucket().then(result => {
console.log(result)
}).catch(error => {
console.log(error);
});
}).catch(error => {
console.log(error);
});
}
function refreshAPIdata(){
return new Promise((resolve,reject) => {
var addr = adminID;
var idb = indexedDB.open("FLO_Tweet");
idb.onerror = (event) => { reject("Error in opening IndexedDB!") };
idb.onsuccess = (event) => {
var db = event.target.result;
var lastTx = db.transaction('lastTx', "readwrite").objectStore('lastTx');
console.log(addr);
new Promise((res,rej) => {
var lastTxReq = lastTx.get(addr);
lastTxReq.onsuccess = (event) => {
var lasttx = event.target.result;
if(lasttx === undefined){
lasttx = 0;
}
res(lasttx);
}
}).then(lasttx => {
var response = ajax("GET",`api/addrs/${addr}/txs`);
var nRequired = JSON.parse(response).totalItems - lasttx;
console.log(nRequired);
while(true && nRequired){
var response = ajax("GET",`api/addrs/${addr}/txs?from=0&to=${nRequired}`);
response = JSON.parse(response);
if (nRequired + lasttx != response.totalItems ){
nRequired = response.totalItems - lasttx;
continue;
}
response.items.reverse().forEach(tx => {
try {
if (tx.vin[0].addr == addr){
var data = JSON.parse(tx.floData).FLO_Tweet_SuperNode;
if(data !== undefined){
if(data.addNodes)
for(var i=0; i<data.addNodes.length; i++)
superNodeList.add(data.addNodes[i])
if(data.removeNodes)
for(var i=0; i<data.removeNodes.length; i++)
superNodeList.delete(data.removeNodes[i])
storeSuperNodeData(data).then(function (response) {
}).catch(error => {
console.log(error);
});
}
}else{
var data = JSON.parse(tx.floData).FLO_Tweet;
if(data !== undefined){
if(encrypt.getFLOIDfromPubkeyHex(data.pubKey)!=tx.vin[0].addr)
throw("PublicKey doesnot match with floID")
data = {floID : tx.vin[0].addr, onionAddr : data.onionAddr, name : data.name, pubKey:data.pubKey};
profiles[data.floID] = {onionAddr : data.onionAddr, name : data.name, pubKey : data.pubKey};
storeProfile(data).then(function (response) {
}).catch(error => {
console.log(error);
});
}
}
} catch (error) {
//console.log(error)
}
});
var obs = db.transaction('lastTx', "readwrite").objectStore('lastTx');
obs.put(response.totalItems,addr);
break;
}
db.close();
resolve('retrived data from API');
});
};
});
}
/* Common IDB functions */
function storeProfile(data){
return new Promise((resolve,reject) => {
var idb = indexedDB.open("FLO_Tweet");
idb.onerror = (event) => { console.log("Error in opening IndexedDB!") };
idb.onsuccess = (event) => {
var db = event.target.result;
var obs = db.transaction('profiles', "readwrite").objectStore('profiles');
objectRequest = obs.put(data);
objectRequest.onerror = (event) => { reject(Error('Error occured: Unable to store data'))};
objectRequest.onsuccess = (event) => { resolve('Data saved OK') };
db.close();
};
});
}
function storeSuperNodeData(data){
return new Promise((resolve,reject) => {
var idb = indexedDB.open("FLO_Tweet");
idb.onerror = (event) => { reject("Error in opening IndexedDB!"); };
idb.onsuccess = (event) => {
var db = event.target.result;
var obs = db.transaction('superNodes', "readwrite").objectStore('superNodes');
if(data.addNodes)
for(var i=0; i<data.addNodes.length; i++)
obs.add(true,data.addNodes[i])
if(data.removeNodes)
for(var i=0; i<data.removeNodes.length; i++)
obs.delete(data.removeNodes[i])
db.close();
resolve('Updated superNodes list in IDB');
};
});
}
function storeTweet(data,tid){
var idb = indexedDB.open("FLO_Tweet");
idb.onerror = (event) => { console.log("Error in opening IndexedDB!") };
idb.onsuccess = (event) => {
var db = event.target.result;
var obs = db.transaction("tweets", "readwrite").objectStore("tweets");
data.tweetID = `${data.time}_${data.floID}`;
data.tid = tid;
obs.add(data);
var obsL = db.transaction("lastTweet", "readwrite").objectStore("lastTweet");
obsL.put(tid,data.floID);
db.close();
};
}
function storeMsg(data){
var idb = indexedDB.open("FLO_Tweet");
idb.onerror = (event) => { console.log("Error in opening IndexedDB!") };
idb.onsuccess = (event) => {
var db = event.target.result;
var obs = db.transaction("messages", "readwrite").objectStore("messages");
data.msgID = `${data.time}_${data.floID}`;
obs.add(data);
db.close();
};
}
/* SuperNode functions */
function sendDataToSuperNode(floID,data){
kBucketObj.determineClosestSupernode(floID).then(result=>{
var superNodeWS = new WebSocket("ws://"+profiles[result[0].floID].onionAddr+"/ws");
superNodeWS.onopen = function(ev){
console.log(`Connected to ${floID}'s SuperNode!`);
superNodeWS.send(data);
};
superNodeWS.onerror = function(ev) {console.log(`${floid}'s SuperNode is offline!`);};
superNodeWS.onclose = function(ev) {console.log(`Disconnected from ${floid}'s SuperNode!`);};
}).catch(e => {
console.log(e.message);
});
}
function superNodeMode(data){
if(data.reqNewTweets){
kBucketObj.determineClosestSupernode(data.floID).then(result => {
if(result[0].floID == selfID)
SuperNode_sendTweetsFromIDB(data.floID,data.tid,data.requestor);
}).catch(error => {
console.log(error);
});
}else if(data.newSuperNodeTweet){
kBucketObj.determineClosestSupernode(data.floID).then(result => {
if(result[0].floID == selfID)
SuperNode_storeSuperNodeTweet(data.data,data.tid);
}).catch(error => {
console.log(error);
});
}else if(data.viaSuperNodeMsg){
kBucketObj.determineClosestSupernode(data.to).then(result => {
if(result[0].floID == selfID)
SuperNode_storeViaSuperNodeMsg(data.from,data.to,data.data);
}).catch(error => {
console.log(error);
});
}else if(data.viaMsgreq){
kBucketObj.determineClosestSupernode(data.floID).then(result => {
if(result[0].floID == selfID)
SuperNode_sendviaMsgFromIDB(data.floID);
}).catch(error => {
console.log(error);
});
}
}
function SuperNode_sendTweetsFromIDB(floID,tid,requestor){
return new Promise((resolve,reject) => {
var requestorWS = new WebSocket("ws://"+profiles[requestor].onionAddr+"/ws");
requestorWS.onopen = (event) => {
console.log(`sending ${floID} tweets to ${requestor} Server!`);
var idb = indexedDB.open("FLO_Tweet",2);
idb.onerror = (event) => { reject("Error in opening IndexedDB!") };
idb.onupgradeneeded = (event) => {
var objectStore1 = event.target.result.createObjectStore("superNodeTweet",{ keyPath: 'tweetID' });
objectStore1.createIndex('floID', 'floID', { unique: false });
objectStore1.createIndex('tid', 'tid', { unique: false });
objectStore1.createIndex('data', 'data', { unique: false });
var objectStore2 = event.target.result.createObjectStore("viaSuperNodeMsg",{ keyPath: 'id',autoIncrement:true });
objectStore2.createIndex('from', 'from', { unique: false });
objectStore2.createIndex('to', 'to', { unique: false });
objectStore2.createIndex('data', 'data', { unique: false });
}
idb.onsuccess = (event) => {
var db = event.target.result;
var obs = db.transaction("superNodeTweet", "readwrite").objectStore("superNodeTweet");
var curReq = obs.openCursor();
curReq.onsuccess = (event) => {
var cursor = event.target.result;
if(cursor) {
if(cursor.value.floID == floID && cursor.value.tid > tid){
data = JSON.stringify({fromSuperNode:true, floID:cursor.value.floID,tid:cursor.value.tid,data:cursor.value.data})
requestorWS.send(data);
}
cursor.continue();
}else{
resolve("Displayed Tweets from IDB!");
}
}
curReq.onerror = (event) => { reject("Error in Reading tweets from IDB!") }
db.close();
};
};
requestorWS.onerror = (event) => { console.log(`${requestor} Server is offline!`) };
requestorWS.onclose = (event) => { console.log(`Disconnected from ${requestor} Server!`) };
});
}
function SuperNode_storeSuperNodeTweet(data,tid){
var idb = indexedDB.open("FLO_Tweet",2);
idb.onerror = (event) => { console.log("Error in opening IndexedDB!") };
idb.onupgradeneeded = (event) => {
var objectStore1 = event.target.result.createObjectStore("superNodeTweet",{ keyPath: 'tweetID' });
objectStore1.createIndex('floID', 'floID', { unique: false });
objectStore1.createIndex('tid', 'tid', { unique: false });
objectStore1.createIndex('data', 'data', { unique: false });
var objectStore2 = event.target.result.createObjectStore("viaSuperNodeMsg",{ keyPath: 'id',autoIncrement:true });
objectStore2.createIndex('from', 'from', { unique: false });
objectStore2.createIndex('to', 'to', { unique: false });
objectStore2.createIndex('data', 'data', { unique: false });
}
idb.onsuccess = (event) => {
var db = event.target.result;
var obs = db.transaction("superNodeTweet", "readwrite").objectStore("superNodeTweet");
var parsedData = JSON.parse(data);
var tweetID = ''+parsedData.floID+'_'+parsedData.time;
obs.add({tweetID:tweetID,floID:parsedData.floID,tid:tid,data:data});
db.close();
};
}
function SuperNode_storeViaSuperNodeMsg(from,to,data){
var idb = indexedDB.open("FLO_Tweet",2);
idb.onerror = (event) => { console.log("Error in opening IndexedDB!") };
idb.onupgradeneeded = (event) => {
var objectStore1 = event.target.result.createObjectStore("superNodeTweet",{ keyPath: 'tweetID' });
objectStore1.createIndex('floID', 'floID', { unique: false });
objectStore1.createIndex('tid', 'tid', { unique: false });
objectStore1.createIndex('data', 'data', { unique: false });
var objectStore2 = event.target.result.createObjectStore("viaSuperNodeMsg",{ keyPath: 'id',autoIncrement :true });
objectStore2.createIndex('from', 'from', { unique: false });
objectStore2.createIndex('to', 'to', { unique: false });
objectStore2.createIndex('data', 'data', { unique: false });
}
idb.onsuccess = (event) => {
var db = event.target.result;
var obs = db.transaction("viaSuperNodeMsg", "readwrite").objectStore("viaSuperNodeMsg");
obs.add({from:from,to:to,data:data});
db.close();
};
}
function SuperNode_sendviaMsgFromIDB(floID){
var receiverWS = new WebSocket("ws://"+profiles[floID].onionAddr+"/ws");
receiverWS.onopen = (event) => {
var idb = indexedDB.open("FLO_Tweet",2);
idb.onerror = (event) => { console.log("Error in opening IndexedDB!") };
idb.onupgradeneeded = (event) => {
var objectStore1 = event.target.result.createObjectStore("superNodeTweet",{ keyPath: 'tweetID' });
objectStore1.createIndex('floID', 'floID', { unique: false });
objectStore1.createIndex('tid', 'tid', { unique: false });
objectStore1.createIndex('data', 'data', { unique: false });
var objectStore2 = event.target.result.createObjectStore("viaSuperNodeMsg",{ keyPath: 'id',autoIncrement:true });
objectStore2.createIndex('from', 'from', { unique: false });
objectStore2.createIndex('to', 'to', { unique: false });
objectStore2.createIndex('data', 'data', { unique: false });
};
idb.onsuccess = (event) => {
var db = event.target.result;
var obs = db.transaction("viaSuperNodeMsg", "readwrite").objectStore("viaSuperNodeMsg");
obs.openCursor().onsuccess = (event) => {
var cursor = event.target.result;
if(cursor) {
if(cursor.value.to == floID){
receiverWS.send(cursor.value.data);
cursor.delete();
}
cursor.continue();
}else{
console.log('Sent All messages to '+floID)
}
}
db.close();
};
};
receiverWS.onerror = (event) => { console.log('Connection Error to '+floID) };
receiverWS.onclose = (event) => { console.log('Disconnected from '+floID) };
}
/* ---end of app.js --- */
/*Kademlia DHT K-bucket implementation as a binary tree.*/
if (typeof reactor == "undefined" || !reactor) {
if (typeof reactor == "undefined" || !reactor) {
(function () {
function Event(name) {
@ -761,7 +1101,7 @@ reactor.addEventListener('bucket_full', function (someObject) {
kBucketObj = {
decodeBase58Address: function (blockchain, address) {
decodeBase58Address: function (address) {
let k = bitjs.Base58.decode(address)
k.shift()
k.splice(-4, 4)
@ -772,12 +1112,12 @@ kBucketObj = {
try {
//const master_flo_pubKey = localbitcoinplusplus.master_configurations.masterFLOPubKey;
const master_flo_addr = adminID;
const SuKBucketId = this.floIdToKbucketId(crypto, master_flo_addr);
const SuKBucketId = this.floIdToKbucketId(master_flo_addr);
const SukbOptions = { localNodeId: SuKBucketId }
supernodeKBucket = new BuildKBucket(SukbOptions);
for(var i=0; i<superNodeList.length ; i++){
this.addNewUserNodeInKbucket(crypto,superNodeList[i],supernodeKBucket)
}
var SNArray = Array.from(superNodeList);
for(var i=0; i<SNArray.length ; i++)
this.addNewUserNodeInKbucket(SNArray[i],supernodeKBucket)
resolve('SuperNode KBucket formed');
} catch (error) {
reject(error);
@ -791,7 +1131,7 @@ kBucketObj = {
try {
let flo_id = bitjs.pubkey2address(pubKey);
let kname = `SKBucket_${pubKey}`;
const KBucketId = this.floIdToKbucketId(crypto, flo_id)
const KBucketId = this.floIdToKbucketId(flo_id)
const kbOptions = { localNodeId: KBucketId }
window[kname] = new BuildKBucket(kbOptions);
resolve(true);
@ -808,18 +1148,18 @@ kBucketObj = {
};
KB.add(contact)
},
addNewUserNodeInKbucket: function(blockchain, address, KB=supernodeKBucket) {
addNewUserNodeInKbucket: function(address, KB=supernodeKBucket) {
let decodedId = address;
try {
decodedId = this.floIdToKbucketId(blockchain, address);
decodedId = this.floIdToKbucketId(address);
} catch(e) {
decodedId = address;
}
const addNewUserNode = this.addContact(decodedId, address, KB);
return {decodedId:decodedId, address:address};
},
floIdToKbucketId: function (blockchain, address) {
const decodedId = this.decodeBase58Address(blockchain, address);
floIdToKbucketId: function (address) {
const decodedId = this.decodeBase58Address(address);
const nodeIdBigInt = new BigInteger(decodedId, 16);
const nodeIdBytes = nodeIdBigInt.toByteArrayUnsigned();
const nodeIdNewInt8Array = new Uint8Array(nodeIdBytes);
@ -843,7 +1183,7 @@ kBucketObj = {
let pubKeyBytes = Crypto.util.hexToBytes(pubKey);
return Crypto.util.bytesToBase64(pubKeyBytes);
},
restoreKbucket: function(flo_addr, blockchain="FLO_TEST", KB=KBucket) {
restoreKbucket: function(flo_addr, KB=KBucket) {
return new Promise((resolve, reject)=>{
readAllDB('kBucketStore')
.then(dbObject => {
@ -854,7 +1194,7 @@ kBucketObj = {
dbObject
.filter(f=>!su_flo_addr_array.includes(f.data.id))
.map(dbObj=>{
this.addNewUserNodeInKbucket(blockchain, flo_addr, dbObj.data, KB);
this.addNewUserNodeInKbucket(flo_addr, dbObj.data, KB);
});
} else {
reject(`Failed to restore kBucket.`);
@ -870,7 +1210,7 @@ kBucketObj = {
let supernodeSeedsObj = JSON.parse(supernodeSeeds);
Object.entries(supernodeSeedsObj).map(seedObj=>{
let kbuck = this.addNewUserNodeInKbucket(crypto, seedObj[1].kbucketId,
let kbuck = this.addNewUserNodeInKbucket(seedObj[1].kbucketId,
{ id: seedObj[1].kbucketId }, supernodeKBucket);
});
@ -948,7 +1288,7 @@ kBucketObj = {
}
let isFloIdUint8 = flo_addr instanceof Uint8Array;
if (!isFloIdUint8) {
flo_addr = this.floIdToKbucketId(crypto, flo_addr);
flo_addr = this.floIdToKbucketId(flo_addr);
}
const closestSupernode = supernodeKBucket.closest(flo_addr, n);
resolve(closestSupernode);
@ -959,233 +1299,5 @@ kBucketObj = {
return false;
}
})
},
addClosestSupernodeInDB: function(flo_addr, KB=KBucket) {
return new Promise(async (resolve, reject)=>{
const supernodeSeeds = localbitcoinplusplus.master_configurations.supernodeSeeds;
if (typeof supernodeSeeds !== "object") reject("Failed to get supernode seeds.");
let supernodeSeedsObj = JSON.parse(supernodeSeeds);
Object.entries(supernodeSeedsObj).map(seedObj=>{
console.log(seedObj);
this.addNewUserNodeInKbucketAndDB(
crypto, seedObj[1].kbucketId,
{ id: seedObj[1].kbucketId });
});
let primarySu = await this.determineClosestSupernode(flo_addr);
let nearestSupernode = await this.determineClosestSupernode(flo_addr="", n=1, supernodeKBucket, primarySu[0].data.id);
let nearestSupernodeIds = nearestSupernode.map(f=>f.data.id);
let supernodeSeedsArray = Object.values(supernodeSeedsObj)
.filter(seed=>nearestSupernodeIds.includes(seed.kbucketId))
.sort(function(a, b){
return nearestSupernodeIds.indexOf(a.kbucketId) - nearestSupernodeIds.indexOf(b.kbucketId);
});
if (supernodeSeedsArray.length>0) {
resolve(supernodeSeedsArray);
} else {
reject(false);
}
})
}
}
/* Common IDB functions */
function storeTweet(data,tid){
var idb = indexedDB.open("FLO_Tweet");
idb.onerror = (event) => { console.log("Error in opening IndexedDB!") };
idb.onsuccess = (event) => {
var db = event.target.result;
var obs = db.transaction("tweets", "readwrite").objectStore("tweets");
data.tweetID = `${data.time}_${data.floID}`;
data.tid = tid;
obs.add(data);
var obsL = db.transaction("lastTweet", "readwrite").objectStore("lastTweet");
obsL.put(tid,data.floID);
db.close();
};
}
function storeMsg(data){
var idb = indexedDB.open("FLO_Tweet");
idb.onerror = (event) => { console.log("Error in opening IndexedDB!") };
idb.onsuccess = (event) => {
var db = event.target.result;
var obs = db.transaction("messages", "readwrite").objectStore("messages");
data.msgID = `${data.time}_${data.floID}`;
obs.add(data);
db.close();
};
}
/* SuperNode functions */
function sendDataToSuperNode(floID,data){
kBucketObj.determineClosestSupernode(floID).then(result=>{
var superNodeWS = new WebSocket("ws://"+profiles[result[0].floID].onionAddr+"/ws");
superNodeWS.onopen = function(ev){
console.log(`Connected to ${floID}'s SuperNode!`);
superNodeWS.send(data);
};
superNodeWS.onerror = function(ev) {console.log(`${floid}'s SuperNode is offline!`);};
superNodeWS.onclose = function(ev) {console.log(`Disconnected from ${floid}'s SuperNode!`);};
}).catch(e => {
console.log(e.message);
});
}
function superNodeMode(data){
if(data.reqNewTweets){
kBucketObj.determineClosestSupernode(data.floID).then(result => {
if(result[0].floID == selfID)
SuperNode_sendTweetsFromIDB(data.floID,data.tid,data.requestor);
}).catch(error => {
console.log(error);
});
}else if(data.newSuperNodeTweet){
kBucketObj.determineClosestSupernode(data.floID).then(result => {
if(result[0].floID == selfID)
SuperNode_storeSuperNodeTweet(data.data,data.tid);
}).catch(error => {
console.log(error);
});
}else if(data.viaSuperNodeMsg){
kBucketObj.determineClosestSupernode(data.to).then(result => {
if(result[0].floID == selfID)
SuperNode_storeViaSuperNodeMsg(data.from,data.to,data.data);
}).catch(error => {
console.log(error);
});
}else if(data.viaMsgreq){
kBucketObj.determineClosestSupernode(data.floID).then(result => {
if(result[0].floID == selfID)
SuperNode_sendviaMsgFromIDB(data.floID);
}).catch(error => {
console.log(error);
});
}
}
function SuperNode_sendTweetsFromIDB(floID,tid,requestor){
return new Promise((resolve,reject) => {
var requestorWS = new WebSocket("ws://"+profiles[requestor].onionAddr+"/ws");
requestorWS.onopen = (event) => {
console.log(`sending ${floID} tweets to ${requestor} Server!`);
var idb = indexedDB.open("FLO_Tweet",2);
idb.onerror = (event) => { reject("Error in opening IndexedDB!") };
idb.onupgradeneeded = (event) => {
var objectStore1 = event.target.result.createObjectStore("superNodeTweet",{ keyPath: 'tweetID' });
objectStore1.createIndex('floID', 'floID', { unique: false });
objectStore1.createIndex('tid', 'tid', { unique: false });
objectStore1.createIndex('data', 'data', { unique: false });
var objectStore2 = event.target.result.createObjectStore("viaSuperNodeMsg",{ keyPath: 'id',autoIncrement:true });
objectStore2.createIndex('from', 'from', { unique: false });
objectStore2.createIndex('to', 'to', { unique: false });
objectStore2.createIndex('data', 'data', { unique: false });
}
idb.onsuccess = (event) => {
var db = event.target.result;
var obs = db.transaction("superNodeTweet", "readwrite").objectStore("superNodeTweet");
var curReq = obs.openCursor();
curReq.onsuccess = (event) => {
var cursor = event.target.result;
if(cursor) {
if(cursor.value.floID == floID && cursor.value.tid > tid){
data = JSON.stringify({fromSuperNode:true, floID:cursor.value.floID,tid:cursor.value.tid,data:cursor.value.data})
requestorWS.send(data);
}
cursor.continue();
}else{
resolve("Displayed Tweets from IDB!");
}
}
curReq.onerror = (event) => { reject("Error in Reading tweets from IDB!") }
db.close();
};
};
requestorWS.onerror = (event) => { console.log(`${requestor} Server is offline!`) };
requestorWS.onclose = (event) => { console.log(`Disconnected from ${requestor} Server!`) };
});
}
function SuperNode_storeSuperNodeTweet(data,tid){
var idb = indexedDB.open("FLO_Tweet",2);
idb.onerror = (event) => { console.log("Error in opening IndexedDB!") };
idb.onupgradeneeded = (event) => {
var objectStore1 = event.target.result.createObjectStore("superNodeTweet",{ keyPath: 'tweetID' });
objectStore1.createIndex('floID', 'floID', { unique: false });
objectStore1.createIndex('tid', 'tid', { unique: false });
objectStore1.createIndex('data', 'data', { unique: false });
var objectStore2 = event.target.result.createObjectStore("viaSuperNodeMsg",{ keyPath: 'id',autoIncrement:true });
objectStore2.createIndex('from', 'from', { unique: false });
objectStore2.createIndex('to', 'to', { unique: false });
objectStore2.createIndex('data', 'data', { unique: false });
}
idb.onsuccess = (event) => {
var db = event.target.result;
var obs = db.transaction("superNodeTweet", "readwrite").objectStore("superNodeTweet");
var parsedData = JSON.parse(data);
var tweetID = ''+parsedData.floID+'_'+parsedData.time;
obs.add({tweetID:tweetID,floID:parsedData.floID,tid:tid,data:data});
db.close();
};
}
function SuperNode_storeViaSuperNodeMsg(from,to,data){
var idb = indexedDB.open("FLO_Tweet",2);
idb.onerror = (event) => { console.log("Error in opening IndexedDB!") };
idb.onupgradeneeded = (event) => {
var objectStore1 = event.target.result.createObjectStore("superNodeTweet",{ keyPath: 'tweetID' });
objectStore1.createIndex('floID', 'floID', { unique: false });
objectStore1.createIndex('tid', 'tid', { unique: false });
objectStore1.createIndex('data', 'data', { unique: false });
var objectStore2 = event.target.result.createObjectStore("viaSuperNodeMsg",{ keyPath: 'id',autoIncrement :true });
objectStore2.createIndex('from', 'from', { unique: false });
objectStore2.createIndex('to', 'to', { unique: false });
objectStore2.createIndex('data', 'data', { unique: false });
}
idb.onsuccess = (event) => {
var db = event.target.result;
var obs = db.transaction("viaSuperNodeMsg", "readwrite").objectStore("viaSuperNodeMsg");
obs.add({from:from,to:to,data:data});
db.close();
};
}
function SuperNode_sendviaMsgFromIDB(floID){
var receiverWS = new WebSocket("ws://"+profiles[floID].onionAddr+"/ws");
receiverWS.onopen = (event) => {
var idb = indexedDB.open("FLO_Tweet",2);
idb.onerror = (event) => { console.log("Error in opening IndexedDB!") };
idb.onupgradeneeded = (event) => {
var objectStore1 = event.target.result.createObjectStore("superNodeTweet",{ keyPath: 'tweetID' });
objectStore1.createIndex('floID', 'floID', { unique: false });
objectStore1.createIndex('tid', 'tid', { unique: false });
objectStore1.createIndex('data', 'data', { unique: false });
var objectStore2 = event.target.result.createObjectStore("viaSuperNodeMsg",{ keyPath: 'id',autoIncrement:true });
objectStore2.createIndex('from', 'from', { unique: false });
objectStore2.createIndex('to', 'to', { unique: false });
objectStore2.createIndex('data', 'data', { unique: false });
};
idb.onsuccess = (event) => {
var db = event.target.result;
var obs = db.transaction("viaSuperNodeMsg", "readwrite").objectStore("viaSuperNodeMsg");
obs.openCursor().onsuccess = (event) => {
var cursor = event.target.result;
if(cursor) {
if(cursor.value.to == floID){
receiverWS.send(cursor.value.data);
cursor.delete();
}
cursor.continue();
}else{
console.log('Sent All messages to '+floID)
}
}
db.close();
};
};
receiverWS.onerror = (event) => { console.log('Connection Error to '+floID) };
receiverWS.onclose = (event) => { console.log('Disconnected from '+floID) };
}

View File

@ -35,10 +35,13 @@
<input type="text" class="form-control-nav" id="search" aria-describedby="search1">
<span class="glyphicon glyphicon-search form-control-feedback" aria-hidden="true"></span>
</div>
<button class="btn btn-default btn-sm" onclick="reloadInitData()">
<span class="glyphicon glyphicon-refresh"> </span>
</button>
<button class="btn btn-default btn-sm" onclick="logout()">
<span class="glyphicon glyphicon-log-out"> </span> Log out
</button>
</div>
</div>
</div>

View File

@ -12,10 +12,10 @@ function viewHome(){
console.log(profiles);
privKey = encrypt.retrieveShamirSecret(JSON.parse(sessionStorage.privKey));
selfID = sessionStorage.selfID;
superNodeList = JSON.parse(sessionStorage.superNodeList);
if(superNodeList.includes(selfID))
superNodeList = new Set(JSON.parse(sessionStorage.superNodeList));
if(superNodeList.has(selfID))
modSuperNode = true;
kBucketObj.launchKBucket().then(function(result){
kBucketObj.launchKBucket().then(result => {
console.log(result);
initselfWebSocket();
listProfiles();
@ -33,8 +33,8 @@ function viewHome(){
}).catch(error => {
console.log(error);
})
}).catch(function(error){
console.log(error.message);
}).catch(error => {
console.log(error);
});
}
@ -85,7 +85,7 @@ function initselfWebSocket(){
superNodeMode(data);
}
}catch(error){
console.log(error.message);
console.log(error);
}
};
selfWebsocket.onerror = (event) => { console.log(event) };
@ -214,7 +214,7 @@ function connectToAllFollowing(){
storeTweet({floID:data.floID,time:data.time,data:data.tweet},id);
createTweetElement(data.floID,data.time,data.tweet);
}catch(error){
console.log(error.message);
console.log(error);
}
};
});

View File

@ -129,7 +129,7 @@ label span {
<script type="text/javascript" src="login.js"></script>
</head>
<body onload="refreshAPIdata();">
<body onload="initAPIdata();">
<div id="alert-container"></div>
<div class="nav">
<form id='serverConnect'>

View File

@ -15,9 +15,9 @@ const fee = 0.0005;
var username,privKey,floID;
var profiles;
function refreshAPIdata(){
function initAPIdata(){
return new Promise((resolve,reject) => {
console.log("refreshAPIdata");
console.log("initAPIdata");
getDatafromAPI().then(result => {
console.log(result);
getProfilesfromIDB().then(result => {
@ -26,8 +26,8 @@ function refreshAPIdata(){
sessionStorage.profiles = JSON.stringify(profiles);
getSuperNodeListfromIDB().then(result => {
console.log(result)
superNodeList = result;
sessionStorage.superNodeList = JSON.stringify(superNodeList);
superNodeList = new Set(result);
sessionStorage.superNodeList = JSON.stringify(Array.from(superNodeList));
resolve('Refresh API data Successful!')
}).catch(error => {
reject(error);
@ -224,40 +224,6 @@ function getDatafromAPI(){
});
}
function storeProfile(data){
return new Promise((resolve,reject) => {
var idb = indexedDB.open("FLO_Tweet");
idb.onerror = (event) => { console.log("Error in opening IndexedDB!") };
idb.onsuccess = (event) => {
var db = event.target.result;
var obs = db.transaction('profiles', "readwrite").objectStore('profiles');
objectRequest = obs.put(data);
objectRequest.onerror = (event) => { reject(Error('Error occured: Unable to store data'))};
objectRequest.onsuccess = (event) => { resolve('Data saved OK') };
db.close();
};
});
}
function storeSuperNodeData(data){
return new Promise((resolve,reject) => {
var idb = indexedDB.open("FLO_Tweet");
idb.onerror = (event) => { reject("Error in opening IndexedDB!"); };
idb.onsuccess = (event) => {
var db = event.target.result;
var obs = db.transaction('superNodes', "readwrite").objectStore('superNodes');
if(data.addNodes)
for(var i=0; i<data.addNodes.length; i++)
obs.add(true,data.addNodes[i])
if(data.removeNodes)
for(var i=0; i<data.removeNodes.length; i++)
obs.delete(data.removeNodes[i])
db.close();
resolve('Updated superNodes list in IDB');
};
});
}
function getProfilesfromIDB(){
return new Promise((resolve,reject) => {
var idb = indexedDB.open("FLO_Tweet");
@ -307,10 +273,6 @@ function initselfWebSocket(serverPass){
});
}
//Script for AJAX, and register functions
function registerID(sender,onionAddr,wif,pubkey,username) {
return new Promise((resolve,reject) => {
var trx = bitjs.transaction();

View File

@ -12,8 +12,8 @@ function initMsgs(){
console.log(profiles);
privKey = encrypt.retrieveShamirSecret(JSON.parse(sessionStorage.privKey));
selfID = sessionStorage.selfID;
superNodeList = JSON.parse(sessionStorage.superNodeList);
if(superNodeList.includes(selfID))
superNodeList = new Set(JSON.parse(sessionStorage.superNodeList));
if(superNodeList.has(selfID))
modSuperNode = true;
kBucketObj.launchKBucket().then(result => {
console.log(result)
@ -93,7 +93,7 @@ function initselfWebSocket(){
superNodeMode(data);
}
}catch(error){
console.log(error.message)
console.log(error)
}
};
selfWebsocket.onerror = (event) => { console.log(event) };

View File

@ -15,15 +15,15 @@ function viewProfile(){
selfID = sessionStorage.selfID;
var url = new URL(window.location.href);
profileID = url.searchParams.get("floID");
superNodeList = JSON.parse(sessionStorage.superNodeList);
if(superNodeList.includes(selfID))
superNodeList = new Set(JSON.parse(sessionStorage.superNodeList));
if(superNodeList.has(selfID))
modSuperNode = true;
kBucketObj.launchKBucket().then(result => {
console.log(result)
listProfiles();
displayProfile(profileID);
}).catch(error => {
console.log(error.message);
console.log(error);
});
}
@ -57,7 +57,7 @@ function displayProfile(profileID){
profileServerStatus = false;
});
}).catch(error => {
console.log(error.message);
console.log(error);
});
}
@ -147,7 +147,7 @@ function connectToProfileServer(floID){
storeTweet({floID:floID,time:data.time,data:data.tweet},id);
createTweetElement(floID,data.time,data.tweet);
}catch(error){
console.log(error.message);
console.log(error);
}
}
});
@ -158,7 +158,7 @@ function pingSuperNodeforNewTweets(floID){
var data = JSON.stringify({reqNewTweets:true,floID:floID,tid:result,requestor:selfID})
sendDataToSuperNode(floID,data);
}).catch(error => {
console.log(error.message);
console.log(error);
});
}
@ -169,7 +169,7 @@ function pingProfileServerforNewTweets(floID){
console.log("sent");
resolve('Sent New tweet request to user server!');
}).catch(error => {
console.log(error.message);
console.log(error);
});
}
@ -239,7 +239,7 @@ function initselfWebSocket(){
superNodeMode(data);
}
}catch(error){
console.log(error.message)
console.log(error)
}
};
selfWebsocket.onerror = (event) => { console.log(event) };