diff --git a/index.html b/index.html index 2ba0dad..7de6c92 100644 --- a/index.html +++ b/index.html @@ -22,8 +22,8 @@ //Required for blockchain API operators apiURL: { - FLO: 'https://livenet.flocha.in', - FLO_TEST: 'https://testnet-flosight.duckdns.org' + FLO: ['https://explorer.mediciland.com/', 'https://livenet.flocha.in/', 'https://flosight.duckdns.org/', 'http://livenet-explorer.floexperiments.com', 'http://ec2-13-233-133-128.ap-south-1.compute.amazonaws.com/', 'http://ec2-13-233-131-136.ap-south-1.compute.amazonaws.com/', 'http://ec2-13-233-194-1.ap-south-1.compute.amazonaws.com/'], + FLO_TEST: ['https://testnet-flosight.duckdns.org', 'https://testnet.flocha.in/'] }, adminID: "FEzk75EGMPEQMrCuPosGiwuK162hcEu49E", refreshDelay: 3600000, @@ -5615,42 +5615,66 @@ /* FLO Blockchain Operator to send/receive data from blockchain using API calls*/ const floBlockchainAPI = { - //Promised AJAX function to get data from API - promisedAJAX: function (method, uri) { + util: { + serverList: floGlobals.apiURL[floGlobals.blockchain].slice(0), + curPos: floCrypto.randInt(0, floGlobals.apiURL[floGlobals.blockchain].length), + fetch_retry: function(apicall){ + return new Promise((resolve,reject) => { + this.serverList.splice(this.curPos, 1); + this.curPos = floCrypto.randInt(0, this.serverList.length) + this.fetch_api(apicall) + .then(result => resolve(result)) + .catch(error => reject(error)); + }) + }, + fetch_api: function(apicall){ + return new Promise((resolve, reject) => { + if(this.serverList.length === 0) + reject("No floSight server working") + else{ + fetch(this.serverList[this.curPos] + apicall).then(response => { + if(response.ok) + response.json().then(data => resolve(data)); + else{ + this.fetch_retry(apicall) + .then(result => resolve(result)) + .catch(error => reject(error)); + } + }).catch(error => { + this.fetch_retry(apicall) + .then(result => resolve(result)) + .catch(error => reject(error)); + }) + } + }) + } + }, + + //Promised function to get data from API + promisedAPI: function (apicall) { return new Promise((resolve, reject) => { - var request = new XMLHttpRequest(); - var url = `${floGlobals.apiURL[floGlobals.blockchain]}/${uri}`; - console.log(url) - request.open(method, url, true); - request.onload = (evt) => { - if (request.readyState == 4 && request.status == 200) - resolve(request.response); - else - reject(request.response); - }; - request.send(); + console.log(apicall) + this.util.fetch_api(apicall) + .then(result => resolve(result)) + .catch(error => reject(error)); }); }, //Get balance for the given Address getBalance: function (addr) { return new Promise((resolve, reject) => { - this.promisedAJAX("GET", `api/addr/${addr}/balance`).then(balance => { - resolve(parseFloat(balance)); - }).catch(error => { - reject(error); - }); + this.promisedAPI(`api/addr/${addr}/balance`) + .then(balance => resolve(parseFloat(balance))) + .catch(error => reject(error)); }); }, //Write Data into blockchain writeData: function (senderAddr, Data, PrivKey, receiverAddr = floGlobals.adminID) { return new Promise((resolve, reject) => { - this.sendTx(senderAddr, receiverAddr, floGlobals.sendAmt, PrivKey, Data).then(txid => { - resolve(txid); - }).catch(error => { - reject(error); - }); + this.sendTx(senderAddr, receiverAddr, floGlobals.sendAmt, PrivKey, Data) + .then(txid => resolve(txid)) + .catch(error => reject(error)) }); }, @@ -5669,8 +5693,7 @@ var trx = bitjs.transaction(); var utxoAmt = 0.0; var fee = floGlobals.fee; - this.promisedAJAX("GET", `api/addr/${senderAddr}/utxo`).then(response => { - var utxos = JSON.parse(response); + this.promisedAPI(`api/addr/${senderAddr}/utxo`).then(utxos => { for (var i = utxos.length - 1; (i >= 0) && (utxoAmt < sendAmt + fee); i--) { if (utxos[i].confirmations) { @@ -5687,15 +5710,11 @@ trx.addoutput(senderAddr, change); trx.addflodata(floData); var signedTxHash = trx.sign(PrivKey, 1); - this.broadcastTx(signedTxHash).then(txid => { - resolve(txid) - }).catch(error => { - reject(error); - }); + this.broadcastTx(signedTxHash) + .then(txid => resolve(txid)) + .catch(error => reject(error)) } - }).catch(error => { - reject(error); - }); + }).catch(error => reject(error)) } }); }, @@ -5704,7 +5723,7 @@ broadcastTx: function (signedTxHash) { return new Promise((resolve, reject) => { var request = new XMLHttpRequest(); - var url = `${floGlobals.apiURL[floGlobals.blockchain]}/api/tx/send`; + var url = this.util.serverList[this.util.curPos] + 'api/tx/send'; if (signedTxHash.length < 1) reject("Empty Signature"); else { @@ -5727,27 +5746,20 @@ //Read Txs of Address between from and to readTxs: function (addr, from, to) { return new Promise((resolve, reject) => { - this.promisedAJAX("GET", `api/addrs/${addr}/txs?from=${from}&to=${to}`).then(response => { - resolve(JSON.parse(response)); - }).catch(error => { - reject(error); - }); + this.promisedAPI(`api/addrs/${addr}/txs?from=${from}&to=${to}`) + .then(response => resolve(response)) + .catch(error => reject(error)) }); }, //Read All Txs of Address (newest first) readAllTxs: function (addr) { return new Promise((resolve, reject) => { - this.promisedAJAX("GET", `api/addrs/${addr}/txs?from=0&to=1`).then(response => { - var totalItems = JSON.parse(response).totalItems; - this.promisedAJAX("GET", `api/addrs/${addr}/txs?from=0&to=${totalItems}0`).then(response => { - resolve(JSON.parse(response).items); - }).catch(error => { - reject(error); - }); - }).catch(error => { - reject(error); - }); + this.promisedAPI(`api/addrs/${addr}/txs?from=0&to=1`).then(response => { + this.promisedAPI(`api/addrs/${addr}/txs?from=0&to=${response.totalItems}0`) + .then(response => resolve(response.items)) + .catch(error => reject(error)); + }).catch(error => reject(error)) }); }, @@ -5761,13 +5773,12 @@ filter : custom filter funtion for floData (eg . filter: d => {return d[0] == '$'}) */ readData: function(addr,options = {}){ - options.limit = options.limit || 1000 - options.ignoreOld = options.ignoreOld || 0 + options.limit = options.limit | 1000 + options.ignoreOld = options.ignoreOld | 0 return new Promise((resolve, reject) => { - this.promisedAJAX("GET", `api/addrs/${addr}/txs?from=0&to=1`).then(response => { - var newItems = JSON.parse(response).totalItems - options.ignoreOld; - this.promisedAJAX("GET", `api/addrs/${addr}/txs?from=0&to=${newItems*2}`).then(response => { - response = JSON.parse(response) + this.promisedAPI(`api/addrs/${addr}/txs?from=0&to=1`).then(response => { + var newItems = response.totalItems - options.ignoreOld; + this.promisedAPI(`api/addrs/${addr}/txs?from=0&to=${newItems*2}`).then(response => { if (options.limit <= 0) options.limit = response.items.length; var filteredData = [];