Compare commits

..

No commits in common. "0c8d78f6aee07642373579d20467d506acd28085" and "da5c5143ba5565e7269d880e19ad46f7d6f6a142" have entirely different histories.

4 changed files with 31 additions and 249 deletions

View File

@ -22,20 +22,12 @@ AddressController.prototype.show = function(req, res) {
noTxList: parseInt(req.query.noTxList)
};
self.common.bindStopFlagOnClose(res, options);
/*DEPRECATED
if (req.query.from && req.query.to) {
options.from = parseInt(req.query.from);
options.to = parseInt(req.query.to);
}*/
}
if (req.query.after)
options.after = req.query.after;
if (req.query.before)
options.before = req.query.before;
self._address.getAddressSummary(req.addr, options, function(err, data) {
this._address.getAddressSummary(req.addr, options, function(err, data) {
if(err) {
return self.common.handleErrors(err, res);
}
@ -48,97 +40,53 @@ AddressController.prototype.show = function(req, res) {
});
};
AddressController.prototype.show_ws = function(ws, req) {
var self = this;
var options = { noTxList: true };
if (req.query.after)
options.after = req.query.after;
if (req.query.before)
options.before = req.query.before;
self.common.bindStopFlagOnClose(ws, options);
self._address.getAddressSummary(req.addr, options, function (err, data) {
if(err) {
return self.common.handleErrors_ws(err, ws);
}
ws.send({data});
}, function(err, result) {
if(err) {
return self.common.handleErrors_ws(err, ws);
}
if(ws.readyState === ws.OPEN){
ws.send({result});
ws.close();
}
});
};
AddressController.prototype.balance = function(req, res) {
this.addressSummarySubQuery(req, res, 'balance');
this.addressSummarySubQuery(req, res, 'balanceSat');
};
AddressController.prototype.totalReceived = function(req, res) {
this.addressSummarySubQuery(req, res, 'totalReceived');
this.addressSummarySubQuery(req, res, 'totalReceivedSat');
};
AddressController.prototype.totalSent = function(req, res) {
this.addressSummarySubQuery(req, res, 'totalSent');
this.addressSummarySubQuery(req, res, 'totalSentSat');
};
AddressController.prototype.unconfirmedBalance = function(req, res) {
this.addressSummarySubQuery(req, res, 'unconfirmedBalance');
this.addressSummarySubQuery(req, res, 'unconfirmedBalanceSat');
};
AddressController.prototype.addressSummarySubQuery = function(req, res, param) {
var self = this;
var options = { noTxList: true };
if (req.query.after)
options.after = req.query.after;
if (req.query.before)
options.before = req.query.before;
self.common.bindStopFlagOnClose(res, options);
self._address.getAddressSummary(req.addr, options, function(err, data) {
this.getAddressSummary(req.addr, {}, function(err, data) {
if(err) {
return self.common.handleErrors(err, res);
}
if(data.incomplete)
res.jsonp({lastItem: data.lastItem, data: data[param]});
else
res.jsonp(data[param]);
res.jsonp(data[param]);
});
};
AddressController.prototype.getAddressSummary = function(address, options, callback) {
var self = this;
self._address.getAddressSummary(address, options, function(err, summary) {
this._address.getAddressSummary(address, options, function(err, summary) {
if(err) {
return callback(err);
}
var transformed = {
address: self.common.translateOutputAddress(address),
balance: summary.balance,
balanceSat: summary.balanceSat,
totalReceived: summary.totalReceived,
balance: Unit.fromSatoshis(summary.balance).toBTC(),
balanceSat: summary.balance,
totalReceived: Unit.fromSatoshis(summary.totalReceived).toBTC(),
totalReceivedSat: summary.totalReceivedSat,
totalSent: summary.totalSent,
totalSent: Unit.fromSatoshis(summary.totalSent).toBTC(),
totalSentSat: summary.totalSentSat,
unconfirmedBalance: summary.unconfirmedBalance,
unconfirmedBalanceSat: summary.unconfirmedBalanceSat,
unconfirmedTxApperances: summary.unconfirmedTxApperances,
txApperances: summary.txApperances,
unconfirmedBalance: Unit.fromSatoshis(summary.unconfirmedBalance).toBTC(),
unconfirmedBalanceSat: summary.unconfirmedBalance,
unconfirmedTxApperances: summary.unconfirmedAppearances, // misspelling - ew
txApperances: summary.txApperances, // yuck
transactions: summary.transactions
};
@ -166,7 +114,7 @@ AddressController.prototype.checkAddrs = function(req, res, next) {
}
if(!_.isArray(req.addrs) || _.compact(req.addrs).length < 1) {
return self.common.handleErrors({
return this.common.handleErrors({
message: 'Must include address',
code: 1
}, res);
@ -177,7 +125,7 @@ AddressController.prototype.checkAddrs = function(req, res, next) {
req.addr = req.addrs[0];
} catch(e) {
console.log('[addresses.js.130]', e); //TODO
return self.common.handleErrors({
return this.common.handleErrors({
message: 'Invalid address: ' + e,
code: 1
}, res);
@ -189,7 +137,7 @@ console.log('[addresses.js.130]', e); //TODO
AddressController.prototype.utxo = function(req, res) {
var self = this;
self._address.getAddressUnspentOutputs(req.addr, {}, function(err, utxos) {
this._address.getAddressUnspentOutputs(req.addr, {}, function(err, utxos) {
var results;
if(err) {
return self.common.handleErrors(err, res);
@ -297,52 +245,11 @@ AddressController.prototype.multiutxo = function(req, res) {
AddressController.prototype.multitxs = function(req, res) {
var self = this;
var options = {};
var options = {
from: parseInt(req.query.from) || parseInt(req.body.from) || 0
};
options.after = req.query.after || req.body.after || undefined;
options.before = req.query.before || req.body.before || undefined;
//mempool options
if(!_.isUndefined(req.query.mempool) || !_.isUndefined(req.body.mempool)){
var mempool = !_.isUndefined(req.query.mempool) ? req.query.mempool : req.body.mempool;
if(mempool == 'true') { //DEFAULT config in query fn
options.mempoolOnly = false;
options.queryMempool = true;
} else if(mempool == 'false') {
options.mempoolOnly = false;
options.queryMempool = false;
} else if(mempool == 'only') {
options.mempoolOnly = true;
options.queryMempool = true;
}
}
if(!_.isUndefined(req.query.latest)) {
let latest_query_int = parseInt(req.query.latest);
if(!isNaN(latest_query_int))
options.reverse = ( latest_query_int ? true : false);
else if(req.query.latest == 'true' || req.query.latest == '') //empty string (ie, ?latest)
options.reverse = true;
else if(req.query.latest == 'false')
options.reverse = false;
} else if(!_.isUndefined(req.body.latest)) {
if(req.body.latest)
options.reverse = true;
else
options.reverse = false;
}
//Temporary support
if(req.query.from || req.body.from) {
options.from = parseInt(req.query.from) || parseInt(req.body.from) || undefined;
}
//Temporary support
if(req.query.to || req.body.to) {
options.to = parseInt(req.query.to) || parseInt(req.body.to) || undefined;
}
self.common.bindStopFlagOnClose(res, options);
options.to = parseInt(req.query.to) || parseInt(req.body.to) || parseInt(options.from) + 10;
self._address.getAddressHistory(req.addrs, options, function(err, result) {
@ -358,19 +265,10 @@ AddressController.prototype.multitxs = function(req, res) {
return self.common.handleErrors(err, res);
}
var lastItem = items.find(a => a.confirmations !== 0); //assuming items is recent tx first order
lastItem = typeof lastItem === 'object' ? lastItem.txid: undefined;
var initItem = items[items.length -1]; //oldest tx in array
initItem = (typeof initItem === 'object' && initItem.confirmations !== 0) ? initItem.txid : undefined;
var ret = {
totalItems: result.totalCount,
lastItem: lastItem,
initItem: initItem,
incomplete: result.incomplete,
//from: options.from,
//to: Math.min(options.to, result.totalCount),
from: options.from,
to: Math.min(options.to, result.totalCount),
items: items
};
@ -380,90 +278,6 @@ AddressController.prototype.multitxs = function(req, res) {
});
};
AddressController.prototype.multitxs_ws = function(ws, req) {
var self = this;
var options = {};
if (req.query.after)
options.after = req.query.after;
if (req.query.before)
options.before = req.query.before;
//mempool options
if(!_.isUndefined(req.query.mempool) || !_.isUndefined(req.body.mempool)){
var mempool = !_.isUndefined(req.query.mempool) ? req.query.mempool : req.body.mempool;
if(mempool == 'true') { //DEFAULT config in query fn
options.mempoolOnly = false;
options.queryMempool = true;
} else if(mempool == 'false') {
options.mempoolOnly = false;
options.queryMempool = false;
} else if(mempool == 'only') {
options.mempoolOnly = true;
options.queryMempool = true;
}
}
if(!_.isUndefined(req.query.latest)){
let latest_query_int = parseInt(req.query.latest);
if(!isNaN(latest_query_int))
options.reverse = ( latest_query_int ? true : false);
else if(req.query.latest == 'true' || req.query.latest == '') //empty string (ie, ?latest)
options.reverse = true;
else if(req.query.latest == 'false')
options.reverse = false;
}
options.txNotNeeded = true;
var transformOptions = self._getTransformOptions(req);
self.common.bindStopFlagOnClose(ws, options);
var lastItem = {id: '', height: 0};
self._address.getAddressHistory(req.addrs, options, function (err, data) {
if(err) {
return self.common.handleErrors_ws(err, ws, false);
}
self.txController.transformTransaction(data, transformOptions, function(err, tx){
if(err) {
return self.common.handleErrors_ws(err, ws, false);
}
//finding the last key (useful for `after`/'before' option on next request call)
if(tx.confirmations)
if(lastItem.height < tx.blockheight || (lastItem.height == tx.blockheight && lastItem.id < tx.txid)){
lastItem.id = tx.txid;
lastItem.height = tx.blockheight;
}
ws.send({data: tx})
});
}, function(err, result) {
if(err) {
return self.common.handleErrors_ws(err, ws);
}
var ret = {
totalItems: result.totalCount,
lastItem: lastItem.id
}
if(ws.readyState === ws.OPEN){
ws.send({result: ret});
ws.close();
}
});
};
AddressController.prototype.transformAddressHistoryForMultiTxs = function(txs, options, callback) {
var self = this;

View File

@ -13,17 +13,6 @@ Common.prototype.notReady = function (err, res, p) {
res.status(503).send('Server not yet ready. Sync Percentage:' + p);
};
Common.prototype.notReady_ws = function (err, ws, p) {
if(ws.readyState !== ws.OPEN)
return;
ws.send({error: {message: 'Server not yet ready. Sync Percentage:' + p, code: 503}});
ws.close();
};
Common.prototype.bindStopFlagOnClose = function (res_ws, obj) {
res_ws.on("close", () => obj.flag_stop = true);
};
Common.prototype.handleErrors = function (err, res) {
if (err) {
if (err.code) {
@ -40,22 +29,6 @@ Common.prototype.handleErrors = function (err, res) {
}
};
Common.prototype.handleErrors_ws = function (err, ws, close = true) {
if(ws.readyState !== ws.OPEN)
return;
if (err) {
if (err.code)
ws.send({error: {message: err.message, code: err.code}});
else {
this.log.error(err.stack);
ws.send({error: {message: err.message, code: 503}});
}
} else {
ws.send({error: {message: 'Not found', code: 404}});
}
if(close)
ws.close();
}
Common.prototype.translateInputAddresses= function(addresses) {
var self = this;

View File

@ -143,7 +143,7 @@ FlosightAPI.prototype._getRateLimiter = function() {
return limiter;
};
FlosightAPI.prototype.setupRoutes = function(app, express, express_ws) {
FlosightAPI.prototype.setupRoutes = function(app) {
var self = this;
@ -184,9 +184,6 @@ FlosightAPI.prototype.setupRoutes = function(app, express, express_ws) {
}
});
//Add ws listener to app
var expressWS = express_ws(app);
//Block routes
var blockOptions = {
node: this.node,
@ -219,12 +216,10 @@ FlosightAPI.prototype.setupRoutes = function(app, express, express_ws) {
// Address routes
var addresses = new AddressController(this.node, this.translateAddresses);
app.get('/addr/:addr', this.cacheShort(), addresses.checkAddrs.bind(addresses), addresses.show.bind(addresses));
app.ws('/addr/:addr', this.cacheShort(), addresses.checkAddrs.bind(addresses), addresses.show_ws.bind(addresses));
app.get('/addr/:addr/utxo', this.cacheShort(), addresses.checkAddrs.bind(addresses), addresses.utxo.bind(addresses));
app.get('/addrs/:addrs/utxo', this.cacheShort(), addresses.checkAddrs.bind(addresses), addresses.multiutxo.bind(addresses));
app.post('/addrs/utxo', this.cacheShort(), addresses.checkAddrs.bind(addresses), addresses.multiutxo.bind(addresses));
app.get('/addrs/:addrs/txs', this.cacheShort(), addresses.checkAddrs.bind(addresses), addresses.multitxs.bind(addresses));
app.ws('/addrs/:addrs/txs', this.cacheShort(), addresses.checkAddrs.bind(addresses), addresses.multitxs_ws.bind(addresses));
app.post('/addrs/txs', this.cacheShort(), addresses.checkAddrs.bind(addresses), addresses.multitxs.bind(addresses));
// Address property routes

View File

@ -1,12 +1,12 @@
{
"name": "flosight-api",
"description": "A Florincoin blockchain REST and web socket API service for Flocore Node.",
"version": "5.1.1-beta-rm",
"repository": "git://github.com/ranchimall/flosight-api.git",
"version": "5.1.0-beta.75",
"repository": "git://github.com/oipwg/flosight-api.git",
"bugs": {
"url": "https://github.com/ranchimall/flosight-api/issues"
"url": "https://github.com/oipwg/flosight-api/issues"
},
"homepage": "https://github.com/ranchimall/flosight-api",
"homepage": "https://github.com/oipwg/flosight-api",
"license": "MIT",
"keywords": [
"flosight",