diff --git a/app/web/app.js b/app/web/app.js index 20ba838..a4fd2f7 100644 --- a/app/web/app.js +++ b/app/web/app.js @@ -6,7 +6,8 @@ window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || window.ms if (!window.indexedDB) { window.alert("Your browser doesn't support a stable version of IndexedDB.") } - +var supernodeKBucket; +var superNodeList; var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']; var encrypt = { @@ -14,7 +15,7 @@ var encrypt = { p: BigInteger("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", 16), exponent1: function () { - return encrypt.p.add(BigInteger.ONE).divide(BigInteger("4")) + return this.p.add(BigInteger.ONE).divide(BigInteger("4")) }, calculateY: function (x) { @@ -159,6 +160,34 @@ var encrypt = { var floID = key.getBitcoinAddress(); return floID; }, + validateAddr: function (value) { + try{ + var addr = new Bitcoin.Address(value); + if (addr == value) + return true; + else + return false; + }catch(error){ + return false; + } + }, + verifyWIF: function (wif,addr){ + try { + var key = new Bitcoin.ECKey(wif); + if(key.priv == null){ + return false; + } + key.setCompressed(true); + var bitcoinAddress = key.getBitcoinAddress(); + if (addr == bitcoinAddress) + return true; + else + return false; + } + catch (error) { + console.log(error); + } + }, sign: function (msg, privateKeyHex) { var key = new Bitcoin.ECKey(privateKeyHex); key.setCompressed(true); @@ -255,11 +284,9 @@ function getTime(time){ function logout(){ sessionStorage.clear(); - location.reload(); + window.location.href = "index.html"; } -var supernodeKBucket; -var superNodeList; /*Kademlia DHT K-bucket implementation as a binary tree.*/ if (typeof reactor == "undefined" || !reactor) { @@ -317,25 +344,6 @@ reactor.addEventListener('bucket_full', function (someObject) { console.log('Bucket full ' + someObject); }); -/* -//Sample Usage -//Creating and defining the event -reactor.registerEvent('big bang'); -reactor.addEventListener('big bang', function(someObject){ -console.log('This is big bang listener yo!'+ someObject.a); -}); - -//Firing the event -reactor.dispatchEvent('big bang'); -reactor.dispatchEvent('big bang',{a:1}); -reactor.dispatchEvent('big bang',{a:55}); - -*/ - - -//Checking if existing NodeID can be used -//This first block of if will initialize the configuration of KBucket -//Add Events, Messaging between different K-Buckets, and attach relevant distributed data /** * @param {Uint8Array} array1 @@ -984,6 +992,35 @@ kBucketObj = { } } +/* 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"); @@ -996,4 +1033,159 @@ function sendDataToSuperNode(floID,data){ }).catch(e => { console.log(e.message); }); - } \ No newline at end of file +} + +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) }; +} \ No newline at end of file diff --git a/app/web/home.html b/app/web/home.html index b0f30e2..7d72347 100644 --- a/app/web/home.html +++ b/app/web/home.html @@ -8,12 +8,12 @@ - + - + ` profileList.appendChild(element); } } function initselfWebSocket(){ selfWebsocket = new WebSocket("ws://"+location.host+"/ws"); - selfWebsocket.onopen = function(evt){ + selfWebsocket.onopen = (event) => { console.log("Connecting"); var serverPass = encrypt.retrieveShamirSecret(JSON.parse(sessionStorage.serverPass)); selfWebsocket.send("$"+serverPass); }; - selfWebsocket.onclose = function(evt){ - console.log("DISCONNECTED"); - }; - selfWebsocket.onmessage = function(evt){ - console.log(evt.data); - if(evt.data[0] == '$') + selfWebsocket.onclose = (event) => { console.log("DISCONNECTED") }; + selfWebsocket.onmessage = (event) => { + console.log(event.data); + if(event.data[0] == '$') return; try{ - data = JSON.parse(evt.data); + data = JSON.parse(event.data); if(data.follow && encrypt.verify(selfID, data.sign, profiles[data.floID].pubKey)){ var idb = indexedDB.open("FLO_Tweet"); - idb.onsuccess = function(event) { + idb.onsuccess = (event) => { var db = event.target.result; var obs = db.transaction("followers", "readwrite").objectStore("followers"); obs.add(data.sign,data.floID); @@ -76,7 +76,7 @@ function initselfWebSocket(){ selfWebsocket.send(`F${data.floID}-${data.sign}`); }else if(data.unfollow && encrypt.verify(selfID, data.sign, profiles[data.floID].pubKey)){ var idb = indexedDB.open("FLO_Tweet"); - idb.onsuccess = function(event) { + idb.onsuccess = (event) => { var db = event.target.result; var obs = db.transaction("followers", "readwrite").objectStore("followers"); obs.delete(data.floID); @@ -89,19 +89,18 @@ function initselfWebSocket(){ createMsgElement(data.from,data.time,msg,'R') storeMsg({time:data.time,floID:data.from,text:msg,type:'R'}); } + }else if(modSuperNode){ + superNodeMode(data); } }catch(error){ console.log(error.message) } }; - selfWebsocket.onerror = function(evt){ - console.log(evt); - }; + selfWebsocket.onerror = (event) => { console.log(event) }; } function readMsgfromIDB(){ - return new Promise( - function(resolve,reject){ + return new Promise((resolve,reject) => { var disp = document.getElementById("msgsContainer"); for(floID in profiles){ var element = document.createElement('div'); @@ -110,13 +109,11 @@ function readMsgfromIDB(){ disp.appendChild(element); } var idb = indexedDB.open("FLO_Tweet"); - idb.onerror = function(event) { - reject("Error in opening IndexedDB!"); - }; - idb.onsuccess = function(event) { + idb.onerror = (event) => { reject("Error in opening IndexedDB!") }; + idb.onsuccess = (event) => { var db = event.target.result; var obs = db.transaction("messages", "readwrite").objectStore("messages"); - obs.openCursor().onsuccess = function(event) { + obs.openCursor().onsuccess = (event) => { var cursor = event.target.result; if(cursor) { createMsgElement(cursor.value.floID,cursor.value.time,cursor.value.text,cursor.value.type); @@ -128,8 +125,7 @@ function readMsgfromIDB(){ }; db.close(); }; - } - ); + }); } function changeReceiver(floID){ @@ -148,9 +144,9 @@ function changeReceiver(floID){ document.getElementById(receiverID).style.display = 'block'; try{ receiverWebSocket = new WebSocket("ws://"+profiles[receiverID].onionAddr+"/ws"); - receiverWebSocket.onopen = function(ev){ recStat = true; }; - receiverWebSocket.onerror = function(ev) { recStat = false;}; - receiverWebSocket.onclose = function(ev) { recStat = false; }; + receiverWebSocket.onopen = (event) => { recStat = true; }; + receiverWebSocket.onerror = (event) => { recStat = false;}; + receiverWebSocket.onclose = (event) => { recStat = false; }; }catch(e){ console.log(e); } @@ -161,23 +157,22 @@ function sendMsg(){ alert("Select a contact and send message"); return; } - var inp = document.getElementById('sendMsgInput') - var msg = inp.value - inp.value = "" - console.log(msg) - var time = Date.now() - var sign = encrypt.sign(msg,privKey) - var msgEncrypt = encrypt.encryptMessage(msg,profiles[receiverID].pubKey) + var inp = document.getElementById('sendMsgInput'); + var msg = inp.value; + inp.value = ""; + console.log(msg); + var time = Date.now(); + var sign = encrypt.sign(msg,privKey); + var msgEncrypt = encrypt.encryptMessage(msg,profiles[receiverID].pubKey); var data = JSON.stringify({message:true,from:selfID,to:receiverID,time:time,secret:msgEncrypt.secret,sign:sign,pubVal:msgEncrypt.senderPublicKeyString}); - if(recStat) receiverWebSocket.send(data); else{ - var SNdata = JSON.stringify({viaSuperNodeMsg:true,from:selfID,to:receiverID,data:data}) - sendDataToSuperNode(receiverID,SNdata) + var SNdata = JSON.stringify({viaSuperNodeMsg:true,from:selfID,to:receiverID,data:data}); + sendDataToSuperNode(receiverID,SNdata); } console.log(`sentMsg : ${data}`); - createMsgElement(receiverID,time,msg,'S') + createMsgElement(receiverID,time,msg,'S'); storeMsg({time:time,floID:receiverID,text:msg,type:'S'}); } @@ -194,17 +189,3 @@ function createMsgElement(floID,time,msg,type){ `; msgField.appendChild(element); } - -function storeMsg(data){ - var idb = indexedDB.open("FLO_Tweet"); - idb.onerror = function(event) { - console.log("Error in opening IndexedDB!"); - }; - idb.onsuccess = function(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(); - }; -} \ No newline at end of file diff --git a/app/web/profile.html b/app/web/profile.html index 4fd9dd7..eef8929 100644 --- a/app/web/profile.html +++ b/app/web/profile.html @@ -8,7 +8,7 @@ - + diff --git a/app/web/profile.js b/app/web/profile.js index f32c19f..8c4d9ed 100644 --- a/app/web/profile.js +++ b/app/web/profile.js @@ -1,12 +1,12 @@ var profileWebsocket, selfWebsocket,profileServerStatus; var profiles; -var profileID, privKey, selfID; +var profileID, privKey, selfID, modSuperNode; function viewProfile(){ - if( sessionStorage.profiles === undefined || sessionStorage.privKey === undefined || sessionStorage.selfID === undefined || sessionStorage.serverPass === undefined){ - alert("Login credentials failed! Returning to home page!"); - window.location.href = "home.html"; + if( sessionStorage.profiles === undefined || sessionStorage.privKey === undefined || sessionStorage.selfID === undefined || sessionStorage.serverPass === undefined || sessionStorage.superNodeList === undefined ){ + alert("Login credentials failed! Returning to login page!"); + window.location.href = "index.html"; return; } profiles = JSON.parse(sessionStorage.profiles); @@ -16,11 +16,13 @@ function viewProfile(){ var url = new URL(window.location.href); profileID = url.searchParams.get("floID"); superNodeList = JSON.parse(sessionStorage.superNodeList); - kBucketObj.launchKBucket().then(function(result){ + if(superNodeList.includes(selfID)) + modSuperNode = true; + kBucketObj.launchKBucket().then(result => { console.log(result) listProfiles(); displayProfile(profileID); - }).catch(function(error){ + }).catch(error => { console.log(error.message); }); } @@ -30,7 +32,7 @@ function displayProfile(profileID){ var errorMsg; if(!profileID) errorMsg = "Select a Profile to display"; - else if(!validateAddr(profileID)) + else if(!encrypt.validateAddr(profileID)) errorMsg = "Invalid FLO ID"; else if(!(profileID in profiles)) errorMsg = "FLO ID not registered to FLO Tweet"; @@ -44,32 +46,29 @@ function displayProfile(profileID){ document.getElementById("profileName").innerHTML=profiles[profileID].name; document.getElementById("profileFloID").innerHTML='@'+profileID; initselfWebSocket(); - displayTweetFromIDB(profileID).then(function(result){ - connectToX(profileID).then(function(result){ + displayTweetFromIDB(profileID).then(result => { + connectToProfileServer(profileID).then(result => { console.log(result); profileServerStatus = true; - getTweetsFromX(profileID); - }).catch(function(error){ + pingProfileServerforNewTweets(profileID); + }).catch(error => { console.log(error); pingSuperNodeforNewTweets(profileID); profileServerStatus = false; }); - }).catch(function(error){ + }).catch(error => { console.log(error.message); }); } function displayTweetFromIDB(floID){ - return new Promise( - function(resolve,reject){ + return new Promise((resolve,reject) => { var idb = indexedDB.open("FLO_Tweet"); - idb.onerror = function(event) { - reject("Error in opening IndexedDB!"); - }; - idb.onsuccess = function(event) { + idb.onerror = (event) => { reject("Error in opening IndexedDB!") }; + idb.onsuccess = (event) => { var db = event.target.result; var obj = db.transaction("following", "readwrite").objectStore("following"); - obj.get(floID).onsuccess = function (event) { + obj.get(floID).onsuccess = (event) => { var followBtn = document.getElementById("follow-button"); if(event.target.result === undefined){ followBtn.innerHTML = "+ Follow"; @@ -81,7 +80,7 @@ function displayTweetFromIDB(floID){ followBtn.disabled = false; } var obs = db.transaction("tweets", "readwrite").objectStore("tweets"); - obs.openCursor().onsuccess = function(event) { + obs.openCursor().onsuccess = (event) => { var cursor = event.target.result; if(cursor) { //console.log(cursor.value) @@ -94,8 +93,7 @@ function displayTweetFromIDB(floID){ } db.close(); }; - } - ); + }); } function listProfiles(){ @@ -111,7 +109,6 @@ function listProfiles(){ ` profileList.appendChild(element); } - //document.getElementById("profileInfo").style.display = "none"; } function createTweetElement(floID,time,tweet){ @@ -133,23 +130,16 @@ function createTweetElement(floID,time,tweet){ tweetDisplay.insertBefore(element, tweetDisplay.firstChild); } -function connectToX(floID){ - return new Promise( - function(resolve,reject){ +function connectToProfileServer(floID){ + return new Promise((resolve,reject) => { profileWebsocket = new WebSocket("ws://"+profiles[floID].onionAddr+"/ws"); - profileWebsocket.onopen = function(ev){ - resolve("Connected to Profile Server!"); - }; - profileWebsocket.onerror = function(ev) { - reject("Profile Server is offline!"); - }; - profileWebsocket.onclose = function(ev) { - console.log("Disconnected from Profile Server!") - }; - profileWebsocket.onmessage = function(evt){ - console.log(evt.data); + profileWebsocket.onopen = (event) => { resolve("Connected to Profile Server!") }; + profileWebsocket.onerror = (event) => { reject("Profile Server is offline!") }; + profileWebsocket.onclose = (event) => { console.log("Disconnected from Profile Server!") }; + profileWebsocket.onmessage = (event) => { + console.log(event.data); try{ - var data = JSON.parse(evt.data); + var data = JSON.parse(event.data); var id = data.id; data = data.data; if( floID!=data.floID || !encrypt.verify(data.tweet,data.sign,profiles[floID].pubKey)) @@ -160,73 +150,38 @@ function connectToX(floID){ console.log(error.message); } } - } - ); -} - -function storeTweet(data,id){ - var idb = indexedDB.open("FLO_Tweet"); - idb.onerror = function(event) { - console.log("Error in opening IndexedDB!"); - }; - idb.onsuccess = function(event) { - var db = event.target.result; - var obs = db.transaction("tweets", "readwrite").objectStore("tweets"); - data.tweetID = `${data.time}_${data.floID}`; - obs.add(data); - var obsL = db.transaction("lastTweet", "readwrite").objectStore("lastTweet"); - obsL.put(id,data.floID); - db.close(); - }; -} - -function storeMsg(data){ - var idb = indexedDB.open("FLO_Tweet"); - idb.onerror = function(event) { - console.log("Error in opening IndexedDB!"); - }; - idb.onsuccess = function(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(); - }; + }); } function pingSuperNodeforNewTweets(floID){ - getLastTweetCount(floID).then(function(result){ - var data = JSON.stringify({reqNewTweets:true,floID:floID,tid:result,requestor:selfID}) - sendDataToSuperNode(floID,data); - }).catch(function(error){ - console.log(error.message); - }); + getLastTweetCount(floID).then(result => { + var data = JSON.stringify({reqNewTweets:true,floID:floID,tid:result,requestor:selfID}) + sendDataToSuperNode(floID,data); + }).catch(error => { + console.log(error.message); + }); } -function getTweetsFromX(floID){ - return new Promise( - function (resolve,reject){ - getLastTweetCount(floID).then(function(result){ - console.log(profileWebsocket); - profileWebsocket.send(`>${result}`); - console.log("sent"); - resolve('Sent New tweet request to user server!'); - }).catch(function(error){ - console.log(error.message); - }); - } - ); +function pingProfileServerforNewTweets(floID){ + getLastTweetCount(floID).then(result => { + console.log(profileWebsocket); + profileWebsocket.send(`>${result}`); + console.log("sent"); + resolve('Sent New tweet request to user server!'); + }).catch(error => { + console.log(error.message); + }); } function getLastTweetCount(floid){ - return new Promise( - function(resolve,reject){ + return new Promise((resolve,reject) => { var idb = indexedDB.open("FLO_Tweet"); - idb.onsuccess = function(event) { + idb.onerror = (event) => { reject("Error in opening IndexedDB!") }; + idb.onsuccess = (event) => { var db = event.target.result; var lastTweet = db.transaction('lastTweet', "readwrite").objectStore('lastTweet'); var lastTweetReq = lastTweet.get(floid); - lastTweetReq.onsuccess = function(event){ + lastTweetReq.onsuccess = (event) => { var result = event.target.result; if(result === undefined) result = 0; @@ -234,29 +189,26 @@ function getLastTweetCount(floid){ } db.close(); }; - } - ); + }); } function initselfWebSocket(){ selfWebsocket = new WebSocket("ws://"+location.host+"/ws"); - selfWebsocket.onopen = function(evt){ + selfWebsocket.onopen = (event) => { console.log("Connecting"); var serverPass = encrypt.retrieveShamirSecret(JSON.parse(sessionStorage.serverPass)); selfWebsocket.send("$"+serverPass); }; - selfWebsocket.onclose = function(evt){ - console.log("DISCONNECTED"); - }; - selfWebsocket.onmessage = function(evt){ - console.log(evt.data); - if(evt.data[0] == '$') + selfWebsocket.onclose = (event) => { console.log("DISCONNECTED") }; + selfWebsocket.onmessage = (event) => { + console.log(event.data); + if(event.data[0] == '$') return; try{ - data = JSON.parse(evt.data); + data = JSON.parse(event.data); if(data.follow && encrypt.verify(selfID, data.sign, profiles[data.floID].pubKey)){ var idb = indexedDB.open("FLO_Tweet"); - idb.onsuccess = function(event) { + idb.onsuccess = (event) => { var db = event.target.result; var obs = db.transaction("followers", "readwrite").objectStore("followers"); obs.add(data.sign,data.floID); @@ -265,7 +217,7 @@ function initselfWebSocket(){ selfWebsocket.send(`F${data.floID}-${data.sign}`); }else if(data.unfollow && encrypt.verify(selfID, data.sign, profiles[data.floID].pubKey)){ var idb = indexedDB.open("FLO_Tweet"); - idb.onsuccess = function(event) { + idb.onsuccess = (event) => { var db = event.target.result; var obs = db.transaction("followers", "readwrite").objectStore("followers"); obs.delete(data.floID); @@ -283,14 +235,14 @@ function initselfWebSocket(){ storeTweet({floID:data.floID,time:data.time,data:data.tweet},tid); createTweetElement(data.floID,data.time,data.tweet); } + }else if(modSuperNode){ + superNodeMode(data); } }catch(error){ console.log(error.message) } }; - selfWebsocket.onerror = function(evt){ - console.log(evt); - }; + selfWebsocket.onerror = (event) => { console.log(event) }; } function follow(){ @@ -301,12 +253,12 @@ function follow(){ if(profileServerStatus) profileWebsocket.send(data); else{ - var SNdata = JSON.stringify({viaSuperNodeMsg:true,from:selfID,to:profileID,data:data}) - sendDataToSuperNode(profileID,SNdata) + var SNdata = JSON.stringify({viaSuperNodeMsg:true,from:selfID,to:profileID,data:data}); + sendDataToSuperNode(profileID,SNdata); } selfWebsocket.send(`f${profileID}-${sign}`) var idb = indexedDB.open("FLO_Tweet"); - idb.onsuccess = function(event) { + idb.onsuccess = (event) => { var db = event.target.result; var obs = db.transaction("following", "readwrite").objectStore("following"); obs.add(sign,profileID); @@ -321,12 +273,12 @@ function follow(){ if(profileServerStatus) profileWebsocket.send(data); else{ - var SNdata = JSON.stringify({viaSuperNodeMsg:true,from:selfID,to:profileID,data:data}) - sendDataToSuperNode(profileID,SNdata) + var SNdata = JSON.stringify({viaSuperNodeMsg:true,from:selfID,to:profileID,data:data}); + sendDataToSuperNode(profileID,SNdata); } selfWebsocket.send(`u${profileID}`) var idb = indexedDB.open("FLO_Tweet"); - idb.onsuccess = function(event) { + idb.onsuccess = (event) => { var db = event.target.result; var obs = db.transaction("following", "readwrite").objectStore("following"); obs.delete(profileID); @@ -336,4 +288,3 @@ function follow(){ followBtn.innerHTML = "+ Follow"; } } -