var profiles = [] var receiverID,tweeterID,recStat; var selfwebsocket,receiverWebSocket; var privKey; function userDataStartUp(){ console.log("StartUp"); /*document.getElementById("sendMsgInput").addEventListener("keyup",function(event){ if(event.keyCode === 13){ event.preventDefault(); sendMsg(); } });*/ getDatafromAPI().then(function (result) { console.log(result); getDatafromIDB().then(function (result){ profiles = arrayToObject(result); console.log(profiles); sessionStorage.profiles = JSON.stringify(profiles); getuserID().then(function(result){ console.log(result); tweeterID = result; sessionStorage.privKey = privKey; alert(`${tweeterID}\nWelcome ${profiles[tweeterID].name}`) //readMsgfromIDB().then(function(result){ //console.log(result); initselfWebSocket(); //displayprofiles(); //const createClock = setInterval(checkStatusInterval, 30000); //}).catch(function(error){ //console.log(error.message); //}); }).catch(function (error) { console.log(error.message); }); }).catch(function (error) { console.log(error.message); }); }).catch(function (error) { console.log(error.message); }); } function storedata(data){ return new Promise( function(resolve, reject) { 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('profiles', "readwrite").objectStore('profiles'); objectRequest = obs.put(data); objectRequest.onerror = function(event) { reject(Error('Error occured: Unable to store data')); }; objectRequest.onsuccess = function(event) { resolve('Data saved OK'); db.close(); }; }; } ); } function getDatafromAPI(){ return new Promise( function(resolve, reject) { var addr = "F6LUnwRRjFuEW97Y4av31eLqqVMK9FrgE2"; var idb = indexedDB.open("FLO_Tweet"); idb.onerror = function(event) { reject("Error in opening IndexedDB!"); }; idb.onupgradeneeded = function(event) { var objectStore = event.target.result.createObjectStore("profiles",{ keyPath: 'floID' }); objectStore.createIndex('onionAddr', 'onionAddr', { unique: false }); objectStore.createIndex('name', 'name', { unique: false }); objectStore.createIndex('pubKey', 'pubKey', { unique: false }); var objectStore2 = event.target.result.createObjectStore("lastTx"); }; idb.onsuccess = function(event) { var db = event.target.result; //window["wait"] = addrList.length; var lastTx = db.transaction('lastTx', "readwrite").objectStore('lastTx'); //addrList.forEach(function(addr){ console.log(addr); new Promise(function(res,rej){ var lastTxReq = lastTx.get(addr); lastTxReq.onsuccess = function(event){ var lasttx = event.target.result; if(lasttx === undefined){ lasttx = 0; } res(lasttx); } }).then(function(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(function(tx){ try { //if (tx.vin[0].addr != addr) //return; 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}; storedata(data).then(function (response) { }).catch(function (error) { console.log(error.message); }); } } catch (e) { //console.log(e) } }); var obs = db.transaction('lastTx', "readwrite").objectStore('lastTx'); obs.put(response.totalItems,addr); break; } db.close(); resolve('retrived data from API'); }); }; } ); } function getuserID(){ return new Promise( function(resolve,reject){ privKey = sessionStorage.privKey || prompt("Enter FLO Private Key : "); var key = new Bitcoin.ECKey(privKey); while(key.priv == null){ privKey = prompt("Invalid FLO Private Key! Retry : ") key = Bitcoin.ECKey(privKey); } key.setCompressed(true); var userID = key.getBitcoinAddress(); if (profiles[userID] === undefined) var reg = confirm(`${userID} is not registers to FLO Tweet!\nRegister FLO ID to this onion?`); else if (profiles[userID].onionAddr == window.location.host) resolve(userID) else var reg = confirm(`${userID} is registered to another onion!\nChange to this onion?`); if(reg){ var name = prompt("Enter your name :"); var pubKey = key.getPubKeyHex(); if(registerID(userID,window.location.host,privKey,pubKey,name)){ profiles[userID] = {onionAddr : window.location.host, name : name, pubKey : pubKey}; resolve(userID); } } reject(`Unable to bind ${userID} to this onionAddress!\nTry again later!`); } ); } function getDatafromIDB(){ return new Promise( function(resolve,reject){ var idb = indexedDB.open("FLO_Tweet"); idb.onerror = function(event) { reject("Error in opening IndexedDB!"); }; idb.onsuccess = function(event) { var db = event.target.result; var obs = db.transaction("profiles", "readwrite").objectStore("profiles"); var getReq = obs.getAll(); getReq.onsuccess = function(event){ resolve(event.target.result); } getReq.onerror = function(event){ reject('Unable to read profiles!') } db.close(); }; } ); } function readMsgfromIDB(){ return new Promise( function(resolve,reject){ var disp = document.getElementById("conversation"); for(floID in profiles){ var createLi = document.createElement('div'); createLi.setAttribute("id", floID); createLi.setAttribute("class", "message-inner"); createLi.style.display = 'none'; disp.appendChild(createLi); } var idb = indexedDB.open("FLO_Tweet",2); idb.onerror = function(event) { reject("Error in opening IndexedDB!"); }; idb.onupgradeneeded = function(event) { var objectStore = event.target.result.createObjectStore("messages",{ keyPath: 'time' }); objectStore.createIndex('text', 'text', { unique: false }); objectStore.createIndex('floID', 'floID', { unique: false }); objectStore.createIndex('type', 'type', { unique: false }); }; idb.onsuccess = function(event) { var db = event.target.result; var obs = db.transaction("messages", "readwrite").objectStore("messages"); obs.openCursor().onsuccess = function(event) { var cursor = event.target.result; if(cursor) { var chat = document.getElementById(cursor.value.floID); if(cursor.value.type == "R"){ var msgdiv = document.createElement('div'); msgdiv.setAttribute("class", "row message-body"); msgdiv.innerHTML = `
`; chat.appendChild(msgdiv); }else if(cursor.value.type == "S"){ var msgdiv = document.createElement('div'); msgdiv.setAttribute("class", "row message-body"); msgdiv.innerHTML = ``; chat.appendChild(msgdiv); } cursor.continue(); } else { console.log('Entries all displayed.'); resolve("Read Msg from IDB"); } }; db.close(); }; } ); } function storeMsg(data){ var idb = indexedDB.open("FLO_Tweet",2); idb.onerror = function(event) { console.log("Error in opening IndexedDB!"); }; idb.onupgradeneeded = function(event) { var objectStore = event.target.result.createObjectStore("messages",{ keyPath: 'time' }); objectStore.createIndex('text', 'text', { unique: false }); objectStore.createIndex('floID', 'floID', { unique: false }); objectStore.createIndex('type', 'type', { unique: false }); }; idb.onsuccess = function(event) { var db = event.target.result; var obs = db.transaction("messages", "readwrite").objectStore("messages"); obs.add(data); db.close(); }; } function displayProfiles(){ console.log('displayProfiles'); var listElement = document.getElementById('contact-display'); for(floID in profiles){ var createLi = document.createElement('div'); createLi.setAttribute("name", floID); createLi.setAttribute("onClick", 'changeReceiver(this)'); createLi.setAttribute("class", "row sideBar-body"); createLi.innerHTML = `