Adding reverse option to address history query

- Using option `reverse` as true will query the latest 1000 (max val) tx instead of the 1st 1000 tx.
This commit is contained in:
sairajzero 2023-04-23 02:55:49 +05:30
parent 158d5aefc2
commit e180672583

View File

@ -195,9 +195,13 @@ AddressService.prototype.getAddressHistory = function(addresses, options, stream
options.mempoolOnly = false;
}
if(_.isUndefined(options.reverse)) {
options.reverse = false;
}
var old_support = false;
//Quick support for `from` and `to` options (DEPRECATED! Not recommeded to use)
if( !_.isUndefined(options.from) || !_.isUndefined(options.to)) {
if(!_.isUndefined(options.from) || !_.isUndefined(options.to)) {
old_support = true;
options.from = options.from || 0;
options.to = options.to || 0xffffffff; //Max value of to will actually be MAX_TX_QUERY_LIMIT_HISTORY
@ -223,13 +227,18 @@ AddressService.prototype.getAddressHistory = function(addresses, options, stream
addr_count++;
if(!results.items.some(x => x.txid() === tx.txid())) //push only if tx not already in array
results.items.unshift(tx); //using unshift, so that recent tx (low) are at front
if(!results.items.some(x => x.txid() === tx.txid())) {//add only if tx not already in array
if(!options.reverse)
results.items.unshift(tx); //using unshift, so that recent tx (low) are at front
else
results.items.push(tx);
}
if(results.items.length > MAX_TX_QUERY_LIMIT_HISTORY) { //remove items from array when overflown
results.items.sort((a, b) => (b.__height || 0xffffffff) - (a.__height || 0xffffffff) || b.txid().localeCompare(a.txid()));
let del_count = results.items.length - MAX_TX_QUERY_LIMIT_HISTORY;
let start_index = old_support ? MAX_TX_QUERY_LIMIT_HISTORY : 0;
let start_index = (old_support || options.reverse) ? MAX_TX_QUERY_LIMIT_HISTORY : 0;
results.items.splice(start_index, del_count);
results.incomplete = true;
@ -884,7 +893,9 @@ AddressService.prototype._getTxidStream = function(address, options) {
//reverse: true // txids stream from low confirmations to high confirmations
};
//NOTE: commentted reverse to keep the order in asc when reading to preserve continuity when using `after` option
//reverse option can be used explictly when latest tx are required
if(options.reverse)
criteria.reverse = true;
// txid stream
var txidStream = this._db.createKeyStream(criteria);
@ -1020,6 +1031,10 @@ AddressService.prototype._streamAddressSummary = function(address, options, stre
options.mempoolOnly = false;
}
if (_.isUndefined(options.reverse)) {
options.reverse = false;
}
//declare the queue to process tx data
var tmpTxList = {}; //store processed txid temporarily to ignore duplication
@ -1081,10 +1096,11 @@ AddressService.prototype._streamAddressSummary = function(address, options, stre
}
async.waterfall([
const waterfall_array = [];
waterfall_array.push(
//Find start height if `after` option is passed
function(next){
function start_fall(next){
if(_.isUndefined(options.after)) {
return next();
@ -1106,10 +1122,10 @@ AddressService.prototype._streamAddressSummary = function(address, options, stre
});
},
});
// stream the rest of the confirmed txids out of the address index
function(next) {
// stream the confirmed txids out of the address index
function query_confirmed_txids(next) {
if (options.mempoolOnly) { //Option to query from mempool only (ie, unconfirmed txs only)
return next();
@ -1145,31 +1161,38 @@ AddressService.prototype._streamAddressSummary = function(address, options, stre
var txidStream = self._getTxidStream(address, options);
txidStream.pipe(txIdTransformStream);
},
}
// query the mempool for relevant txs for this address
function(next) {
function query_mempool_txids(next) {
if (!options.queryMempool) {
return next(null, []);
}
self._mempool.getTxidsByAddress(address, 'both', next);
},
self._mempool.getTxidsByAddress(address, 'both', function(mempoolTxids) {
// add the meta data such as input values, etc.
function(mempoolTxids, next) {
if (mempoolTxids.length <= 0) {
return next();
}
mempoolTxids.map(id => q.push(id, chunkCallback));
next();
});
if (mempoolTxids.length <= 0) {
return next();
}
}
mempoolTxids.map(id => q.push(id, chunkCallback));
next();
},
if(options.reverse){ //when queried txs in reverse key order, mempool first then confirmed
waterfall_array.push(query_mempool_txids);
waterfall_array.push(query_confirmed_txids);
} else { //when queried tx in key order, confirmed tx 1st, then mempool
waterfall_array.push(query_confirmed_txids);
waterfall_array.push(query_mempool_txids);
}
waterfall_array.push(
//wait for queue to complete
function(next) {
function end_fall(next) {
if(!q.started || q.idle()) //No tx in query (or) already finished querying
return next();
@ -1177,9 +1200,9 @@ AddressService.prototype._streamAddressSummary = function(address, options, stre
else
q.drain = () => next();
}
});
], callback);
async.waterfall(waterfall_array, callback);
}