From 174b9fddf68104a9b67f51e77e54a447a811e48b Mon Sep 17 00:00:00 2001 From: sairajzero Date: Wed, 24 Jul 2019 03:01:29 +0530 Subject: [PATCH] Improved user login and stability of funtions Old prompt based user login and server connect are replaced with login page Improved stability and simplification of functions Moved all superNode functions to app.js Supernode mode will now work in all pages (home,profile,msg) instead of just home --- app/web/app.js | 242 +- app/web/home.html | 4 +- app/web/home.js | 665 +- app/web/index.html | 147 +- app/web/{registerID.js => init.js} | 13418 +++++++++++++-------------- app/web/login.js | 379 + app/web/msg.html | 2 +- app/web/msg.js | 105 +- app/web/profile.html | 2 +- app/web/profile.js | 181 +- 10 files changed, 7581 insertions(+), 7564 deletions(-) rename app/web/{registerID.js => init.js} (95%) mode change 100755 => 100644 create mode 100644 app/web/login.js 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"; } } -