exchangemarket/src/main.js
sairajzero 821de1a6d7 inscribing marketID in floExchangeAPI.js
- Inscribed marketID and market name inside floExchange.js
- Added getter for floExchangeAPI
  .adminID
  .application
  .nodeList
2022-10-29 03:46:55 +05:30

210 lines
8.7 KiB
JavaScript

'use strict';
global.floGlobals = require('../docs/scripts/floGlobals');
require('./set_globals');
require('../docs/scripts/lib');
global.floCrypto = require('../docs/scripts/floCrypto');
global.floBlockchainAPI = require('../docs/scripts/floBlockchainAPI');
global.floTokenAPI = require('../docs/scripts/floTokenAPI');
global.btcOperator = require('../docs/scripts/btcOperator');
(function () {
const { adminID, application } = require("../docs/scripts/floExchangeAPI");
floGlobals.adminID = adminID;
floGlobals.application = application;
})();
const Database = require("./database");
const App = require('./app');
const backup = require('./backup/head');
const {
BLOCKCHAIN_REFRESH_INTERVAL
} = require("./_constants")["app"];
var DB, app;
function refreshData(startup = false) {
return new Promise((resolve, reject) => {
refreshDataFromBlockchain().then(result => {
loadDataFromDB(result, startup).then(_ => {
app.refreshData(backup.nodeList);
resolve("Data refresh successful")
}).catch(error => reject(error))
}).catch(error => reject(error))
})
}
function refreshDataFromBlockchain() {
return new Promise((resolve, reject) => {
DB.query("SELECT num FROM LastTx WHERE floID=?", [floGlobals.adminID]).then(result => {
let lastTx = result.length ? result[0].num : 0;
floBlockchainAPI.readData(floGlobals.adminID, {
ignoreOld: lastTx,
sentOnly: true,
pattern: floGlobals.application
}).then(result => {
let promises = [],
nodes_change = false,
assets_change = false,
trusted_change = false;
result.data.reverse().forEach(data => {
var content = JSON.parse(data)[floGlobals.application];
//Node List
if (content.Nodes) {
nodes_change = true;
if (content.Nodes.remove)
for (let n of content.Nodes.remove)
promises.push(DB.query("DELETE FROM NodeList WHERE floID=?", [n]));
if (content.Nodes.add)
for (let n in content.Nodes.add)
promises.push(DB.query("INSERT INTO NodeList (floID, uri) VALUE (?) ON DUPLICATE KEY UPDATE uri=?", [[n, content.Nodes.add[n]], content.Nodes.add[n]]));
}
//Asset List
if (content.Assets) {
assets_change = true;
for (let a in content.Assets)
promises.push(DB.query("INSERT INTO AssetList (asset, initialPrice) VALUE (?) ON DUPLICATE KEY UPDATE initialPrice=?", [[a, content.Assets[a]], content.Assets[a]]));
}
//Trusted List
if (content.Trusted) {
trusted_change = true;
if (content.Trusted.remove)
for (let id of content.Trusted.remove)
promises.push(DB.query("DELETE FROM TrustedList WHERE floID=?", [id]));
if (content.Trusted.add)
for (let id of content.Trusted.add)
promises.push(DB.query("INSERT INTO TrustedList (floID) VALUE (?) ON DUPLICATE KEY UPDATE floID=floID", [id]));
}
//Tag List with priority
if (content.Tag) {
if (content.Tag.remove)
for (let t of content.Tag.remove)
promises.push(DB.query("DELETE FROM TagList WHERE tag=?", [t]));
if (content.Tag.add)
for (let t in content.Tag.add)
promises.push(DB.query("INSERT INTO TagList (tag, sellPriority, buyPriority) VALUE (?) ON DUPLICATE KEY UPDATE tag=tag", [[t, content.Tag.add[t].sellPriority, content.Tag.add[t].buyPriority]]));
if (content.Tag.update)
for (let t in content.Tag.update)
for (let a in content.Tag.update[t])
promises.push(`UPDATE TagList WHERE tag=? SET ${a}=?`, [t, content.Tag.update[t][a]]);
}
});
promises.push(DB.query("INSERT INTO LastTx (floID, num) VALUE (?) ON DUPLICATE KEY UPDATE num=?", [[floGlobals.adminID, result.totalTxs], result.totalTxs]));
//Check if all save process were successful
Promise.allSettled(promises).then(results => {
//console.debug(results.filter(r => r.status === "rejected"));
if (results.reduce((a, r) => r.status === "rejected" ? ++a : a, 0))
console.warn("Some blockchain data might not have been saved in database correctly");
resolve({
nodes: nodes_change,
assets: assets_change,
trusted: trusted_change
});
});
}).catch(error => reject(error));
}).catch(error => reject(error))
})
}
function loadDataFromDB(changes, startup) {
return new Promise((resolve, reject) => {
let promises = [];
if (startup || changes.nodes)
promises.push(loadDataFromDB.nodeList());
if (startup || changes.assets)
promises.push(loadDataFromDB.assetList());
if (startup || changes.trusted)
promises.push(loadDataFromDB.trustedIDs());
Promise.all(promises)
.then(_ => resolve("Data load successful"))
.catch(error => reject(error))
})
}
loadDataFromDB.nodeList = function () {
return new Promise((resolve, reject) => {
DB.query("SELECT floID, uri FROM NodeList").then(result => {
let nodes = {}
for (let i in result)
nodes[result[i].floID] = result[i].uri;
//update dependents
backup.nodeList = nodes;
resolve(nodes);
}).catch(error => reject(error))
})
}
loadDataFromDB.assetList = function () {
return new Promise((resolve, reject) => {
DB.query("SELECT asset FROM AssetList").then(result => {
let assets = [];
for (let i in result)
assets.push(result[i].asset);
//update dependents
backup.assetList = assets;
app.assetList = assets;
resolve(assets);
}).catch(error => reject(error))
})
}
loadDataFromDB.trustedIDs = function () {
return new Promise((resolve, reject) => {
DB.query("SELECT * FROM TrustedList").then(result => {
let trustedIDs = [];
for (let i in result)
trustedIDs.push(result[i].floID);
//update dependents
app.trustedIDs = trustedIDs;
resolve(trustedIDs);
}).catch(error => reject(error))
})
}
function setDB(db) {
DB = db;
backup.DB = DB;
}
module.exports = function startServer(public_dir) {
let _pass, _I = "";
for (let arg of process.argv) {
if (/^-I=/.test(arg))
_I = arg.split(/=(.*)/s)[1];
else if (/^-password=/i.test(arg))
_pass = arg.split(/=(.*)/s)[1];
}
const config = require(`../args/config${_I}.json`);
try {
var _tmp = require(`../args/keys${_I}.json`);
_tmp = floCrypto.retrieveShamirSecret(_tmp);
if (!_pass) {
console.error('Password not entered!');
process.exit(1);
}
global.myPrivKey = Crypto.AES.decrypt(_tmp, _pass);
global.myPubKey = floCrypto.getPubKeyHex(global.myPrivKey);
global.myFloID = floCrypto.getFloID(global.myPubKey);
if (!global.myFloID || !global.myPubKey || !global.myPrivKey)
throw "Invalid Keys";
} catch (error) {
console.error('Unable to load private key!');
process.exit(1);
}
global.PUBLIC_DIR = public_dir;
console.log("Logged in as", global.myFloID);
Database(config["sql_user"], config["sql_pwd"], config["sql_db"], config["sql_host"]).then(db => {
setDB(db);
app = new App(config['secret'], DB);
refreshData(true).then(_ => {
app.start(config['port']).then(result => {
console.log(result);
backup.init(app);
setInterval(refreshData, BLOCKCHAIN_REFRESH_INTERVAL)
}).catch(error => console.error(error))
}).catch(error => console.error(error))
}).catch(error => console.error(error));
};