diff --git a/standard_Operations.html b/standard_Operations.html index a99e6b5..1fb9791 100644 --- a/standard_Operations.html +++ b/standard_Operations.html @@ -8592,7 +8592,7 @@ Bitcoin.Util = { initIndexedDB: function () { return new Promise((resolve, reject) => { - var obj = { + var obs_g = { //general lastTx: {}, //supernode (cloud list) @@ -8601,7 +8601,9 @@ Bitcoin.Util = { uri: null, pubKey: null } - }, + } + } + var obs_a = { //login credentials credentials: {}, //for Dapps @@ -8613,50 +8615,84 @@ Bitcoin.Util = { } //add other given objectStores for (o in this.appObs) - if (!(o in obj)) - obj[o] = this.appObs[o] - compactIDB.initDB(floGlobals.application, obj).then(result => { + if (!(o in obs_a)) + obs_a[o] = this.appObs[o] + Promise.all([ + compactIDB.initDB(floGlobals.application, obs_a), + compactIDB.initDB("floDapps", obs_g) + ]).then(result => { + compactIDB.setDefaultDB(floGlobals.application) resolve("IndexedDB App Storage Initated Successfully") }).catch(error => reject(error)); }) }, + initUserDB: function (floID) { + return new Promise((resolve, reject) => { + var obs = { + contacts: {}, + pubKeys: {}, + messages: {} + } + compactIDB.initDB(`floDapps#${floID}`, obs).then(result => { + resolve("UserDB Initated Successfully") + }).catch(error => reject(error)); + }) + }, + + loadUserDB: function (floID) { + return new Promise((resolve, reject) => { + var loadData = ["contacts", "pubKeys", "messages"] + var promises = [] + for (var i = 0; i < loadData.length; i++) + promises[i] = compactIDB.readAllData(loadData[i], `floDapps#${floID}`) + Promise.all(promises).then(results => { + for (var i = 0; i < loadData.length; i++) + floGlobals[loadData[i]] = results[i] + resolve("Loaded Data from userDB") + }).catch(error => reject(error)) + }) + }, + startUpFunctions: { readSupernodeListFromAPI: function () { return new Promise((resolve, reject) => { - compactIDB.readData("lastTx", floGlobals.SNStorageID).then(lastTx => { - floBlockchainAPI.readData(floGlobals.SNStorageID, { - ignoreOld: lastTx, - sentOnly: true, - pattern: "SuperNodeStorage" - }).then(result => { - for (var i = result.data.length - 1; i >= 0; i--) { - var content = JSON.parse(result.data[i]) - .SuperNodeStorage; - for (sn in content.removeNodes) - compactIDB.removeData("supernodes", sn); - for (sn in content.addNodes) - compactIDB.writeData("supernodes", content - .addNodes[sn], sn); - } - compactIDB.writeData("lastTx", result.totalTxs, - floGlobals.SNStorageID); - compactIDB.readAllData("supernodes").then(result => { - floGlobals.supernodes = result; - floCloudAPI.util.kBucket.launch() - .then(result => resolve( - "Loaded Supernode list\n" + - result)) + compactIDB.readData("lastTx", floGlobals.SNStorageID, "floDapps").then( + lastTx => { + floBlockchainAPI.readData(floGlobals.SNStorageID, { + ignoreOld: lastTx, + sentOnly: true, + pattern: "SuperNodeStorage" + }).then(result => { + for (var i = result.data.length - 1; i >= 0; i--) { + var content = JSON.parse(result.data[i]) + .SuperNodeStorage; + for (sn in content.removeNodes) + compactIDB.removeData("supernodes", sn, + "floDapps"); + for (sn in content.addNodes) + compactIDB.writeData("supernodes", content + .addNodes[sn], sn, "floDapps"); + } + compactIDB.writeData("lastTx", result.totalTxs, + floGlobals.SNStorageID, "floDapps"); + compactIDB.readAllData("supernodes", "floDapps").then( + result => { + floGlobals.supernodes = result; + floCloudAPI.util.kBucket.launch() + .then(result => resolve( + "Loaded Supernode list\n" + + result)) + }) }) - }) - }).catch(error => reject(error)) + }).catch(error => reject(error)) }) }, readAppConfigFromAPI: function () { return new Promise((resolve, reject) => { - compactIDB.readData("lastTx", floGlobals.adminID).then(lastTx => { + compactIDB.readData("lastTx", floGlobals.adminID, "floDapps").then(lastTx => { floBlockchainAPI.readData(floGlobals.adminID, { ignoreOld: lastTx, sentOnly: true, @@ -8683,7 +8719,7 @@ Bitcoin.Util = { .settings[l], l) } compactIDB.writeData("lastTx", result.totalTxs, - floGlobals.adminID); + floGlobals.adminID, "floDapps"); compactIDB.readAllData("subAdmins").then(result => { floGlobals.subAdmins = Object.keys(result); compactIDB.readAllData("settings").then( @@ -8699,7 +8735,7 @@ Bitcoin.Util = { }) }, - loadDataFromIDB: function () { + loadDataFromAppIDB: function () { return new Promise((resolve, reject) => { var loadData = ["appObjects", "generalData", "lastVC"] var promises = [] @@ -8708,7 +8744,7 @@ Bitcoin.Util = { Promise.all(promises).then(results => { for (var i = 0; i < loadData.length; i++) floGlobals[loadData[i]] = results[i] - resolve("Loaded Data from IDB") + resolve("Loaded Data from app IDB") }).catch(error => reject(error)) }) }, @@ -8871,10 +8907,15 @@ Bitcoin.Util = { var promises = [] for (fn in this.util.startUpFunctions) promises.push(this.util.callStartUpFunction(fn)) - Promise.all(promises) - .then(results => resolve('App Startup finished successful')) - .catch(errors => reject('App StartUp failed')) - }) + Promise.all(promises).then(results => { + this.util.initUserDB(myFloID).then(result => { + this.util.loadUserDB(myFloID) + .then(result => resolve( + 'App Startup finished successful')) + .catch(error => reject('load userDB failed')) + }).catch(error => reject('init userDB failed')) + }).catch(errors => reject('App StartUp failed')) + }).catch(error => reject('init indexedDB failed')) }) }, @@ -8892,6 +8933,71 @@ Bitcoin.Util = { this.util.appObs = appObs }, + storeContact(floID, name) { + return new Promise((resolve, reject) => { + if (!floCrypto.validateAddr(floID)) + return reject("Invalid floID!") + compactIDB.writeData("contacts", name, floID, `floDapps#${myFloID}`).then(result => { + floGlobals.contacts[floID] = name; + resolve(result) + }).catch(error => reject(error)) + }); + }, + + storePubKey(floID, pubKey) { + return new Promise((resolve, reject) => { + if (floID in floGlobals.pubKey) + return resolve("pubKey already stored") + if (!floCrypto.validateAddr(floID)) + return reject("Invalid floID!") + if (floCrypto.getFloID(pubKey) != floID) + return reject("Incorrect pubKey") + compactIDB.writeData("pubKeys", pubKey, floID, `floDapps#${myFloID}`).then(result => { + floGlobals.pubKeys[floID] = pubKey; + resolve(result) + }).catch(error => reject(error)) + }); + }, + + sendMessage(floID, message) { + return new Promise((resolve, reject) => { + let options = { + receiverID: floID, + application: "floDapps", + comment: floGlobals.application + } + if (floID in floGlobals.pubKeys) + message = floCrypto.encryptData(JSON.stringify(message), floGlobals.pubKeys[floID]) + floCloudAPI.sendApplicationData(message, "Message", options) + .then(result => resolve(result)) + .catch(error => reject(error)) + }) + }, + + requestInbox(callback) { + return new Promise((resolve, reject) => { + let lastVC = Object.keys(floGlobals.messages).sort().pop() + let options = { + receiverID: myFloID, + application: "floDapps", + lowerVectorClock: lastVC + 1 + } + options.callback = (d, e) => { + for (let v in d) { + if ("secret" in d[v].message) + d[v].message = floCrypto.decryptData(d[v].message, myPrivKey) + compactIDB.writeData("messages", d[v], v, `floDapps#${myFloID}`) + floGlobals.messages[v] = d[v] + } + if (callback instanceof Function) + callback(d, e) + } + floCloudAPI.requestApplicationData("Message", options) + .then(result => resolve(result)) + .catch(error => reject(error)) + }) + }, + manageAppConfig(adminPrivKey, addList, rmList, settings) { return new Promise((resolve, reject) => { if (!Array.isArray(addList) || !addList.length) addList = undefined; @@ -8938,8 +9044,7 @@ Bitcoin.Util = { let shares = floCrypto.createShamirsSecretShares(encryptedKey, threshold, threshold) let promises = []; for (var i = 0; i < threshold; i++) - promises.push(compactIDB.writeData("credentials", shares[i], indexArr[i], floGlobals - .application)); + promises.push(compactIDB.writeData("credentials", shares[i], indexArr[i])); Promise.all(promises) .then(results => resolve("Private Key Secured")) .catch(error => reject(error)) @@ -8994,6 +9099,57 @@ Bitcoin.Util = { } this.getNextGeneralData[fk] = Object.keys(filteredResult).sort().pop(); return filteredResult; + }, + + syncData: { + oldDevice: function () { + return new Promise((resolve, reject) => { + let sync = { + contacts: floGlobals.contacts, + pubKeys: floGlobals.pubKeys, + messages: floGlobals.messages + } + let message = Crypto.AES.encrypt(JSON.stringify(sync), myPrivKey) + let options = { + receiverID: myFloID, + application: "floDapps" + } + floCloudAPI.sendApplicationData(message, "syncData", options) + .then(result => resolve(result)) + .catch(error => reject(error)) + }) + }, + + newDevice() { + return new Promise((resolve, reject) => { + var options = { + receiverID: myFloID, + senderIDs: myFloID, + application: "floDapps", + mostRecent: true, + } + floCloudAPI.requestApplicationData("syncData", options).then(response => { + let vc = Object.keys(response).sort().pop() + let sync = JSON.parse(Crypto.AES.decrypt(response[vc].message, myPrivKey)) + let promises = [] + for (let i in sync.contacts) { + promises.push(compactIDB.writeData("contacts", sync.contacts[i], i)) + floGlobals.contacts[i] = sync.contacts[i] + } + for (let i in sync.pubKeys) { + promises.push(compactIDB.writeData("pubKeys", sync.pubKeys[i], i)) + floGlobals.pubKeys[i] = sync.pubKeys[i] + } + for (let i in sync.messages) { + promises.push(compactIDB.writeData("messages", sync.messages[i], i)) + floGlobals.messages[i] = sync.messages[i] + } + Promise.all(promises) + .then(results => resolve("Sync data successful")) + .catch(error => reject(error)) + }).catch(error => reject(error)) + }) + } } }