Skip to content

Commit

Permalink
wallet: options for list history methods
Browse files Browse the repository at this point in the history
  • Loading branch information
braydonf committed Jun 27, 2019
1 parent 99a396e commit 2c5ddb0
Show file tree
Hide file tree
Showing 3 changed files with 105 additions and 76 deletions.
22 changes: 13 additions & 9 deletions lib/wallet/rpc.js
Original file line number Diff line number Diff line change
Expand Up @@ -1282,11 +1282,11 @@ class RPC extends RPCBase {
if (limit > 100)
throw new RPCError(errs.INVALID_PARAMETER, 'Limit above max of 100.');

const txrecords = await wallet.listHistory(name, limit, reverse);
const recs = await wallet.listHistory(name, {limit, reverse});

const out = [];
for (let i = 0; i < txrecords.length; i++)
out.push(await this._toListTX(txrecords[i]));
for (let i = 0; i < recs.length; i++)
out.push(await this._toListTX(recs[i]));

return out;
}
Expand All @@ -1307,11 +1307,15 @@ class RPC extends RPCBase {
if (limit > 100)
throw new RPCError(errs.INVALID_PARAMETER, 'Limit above max of 100.');

const txrecords = await wallet.listHistoryAfter(name, txid.reverse(), limit, reverse);
const recs = await wallet.listHistoryAfter(name, {
txid: txid.reverse(),
limit,
reverse
});

const out = [];
for (let i = 0; i < txrecords.length; i++)
out.push(await this._toListTX(txrecords[i]));
for (let i = 0; i < recs.length; i++)
out.push(await this._toListTX(recs[i]));

return out;
}
Expand All @@ -1338,11 +1342,11 @@ class RPC extends RPCBase {

const time = util.time(date);

const txrecords = await wallet.listHistoryByTime(name, time, limit, reverse);
const recs = await wallet.listHistoryByTime(name, {time, limit, reverse});

const out = [];
for (let i = 0; i < txrecords.length; i++)
out.push(await this._toListTX(txrecords[i]));
for (let i = 0; i < recs.length; i++)
out.push(await this._toListTX(recs[i]));

return out;
}
Expand Down
128 changes: 75 additions & 53 deletions lib/wallet/txdb.js
Original file line number Diff line number Diff line change
Expand Up @@ -1663,24 +1663,26 @@ class TXDB {
* Get all transactions in ascending or decending order
* limited at a max of 100 transactions.
* @param {Number} acct
* @param {Number} limit
* @param {Boolean} reverse
* @param {Object} options
* @param {Number} options.limit
* @param {Boolean} options.reverse
* @returns {Promise} - Returns {@link TX}[].
*/

async listHistory(acct, limit, reverse) {
async listHistory(acct, options) {
assert(typeof acct === 'number');
assert(typeof limit === 'number');
assert(typeof reverse === 'boolean');
assert(typeof options === 'object');
assert(typeof options.limit === 'number');
assert(typeof options.reverse === 'boolean');

if (limit > 100)
if (options.limit > 100)
throw new Error('Limit exceeds max of 100.')

const hashes = await this.bucket.values({
gte: layout.x.min(acct),
lte: layout.x.max(acct),
limit: limit,
reverse: reverse // TODO: Verify that `bdb` supports `reverse`
limit: options.limit,
reverse: options.reverse
});

return Promise.all(hashes.map(async (hash) => await this.getTX(hash)));
Expand All @@ -1691,37 +1693,39 @@ class TXDB {
* order from a time (inclusive) and limited at a max
* of 100 transactions.
* @param {Number} acct
* @param {Buffer} txid
* @param {Number} limit
* @param {Boolean} reverse
* @param {Object} options
* @param {Buffer} options.time
* @param {Number} options.limit
* @param {Boolean} options.reverse
* @returns {Promise} - Returns {@link TX}[].
*/

async listHistoryByTime(acct, time, limit, reverse) {
async listHistoryByTime(acct, options) {
assert(typeof acct === 'number');
assert(typeof time === 'number');
assert(typeof limit === 'number');
assert(typeof reverse === 'boolean');
assert(typeof options === 'object');
assert(typeof options.time === 'number');
assert(typeof options.limit === 'number');
assert(typeof options.reverse === 'boolean');

if (limit > 100)
if (options.limit > 100)
throw new Error('Limit exceeds max of 100.');

let max = null;
let min = null;

if (reverse) {
if (options.reverse) {
min = layout.G.min();
max = layout.G.max(acct, time);
max = layout.G.max(acct, options.time);
} else {
min = layout.G.min(acct, time);
min = layout.G.min(acct, options.time);
max = layout.G.max();
}

const keys = await this.bucket.keys({
gte: min,
lte: max,
limit: 1,
reverse: reverse, // TODO: Verify that `bdb` supports `reverse`
reverse: options.reverse,
parse: (key) => {
const [,,hash] = layout.G.decode(key);
return hash;
Expand All @@ -1732,37 +1736,53 @@ class TXDB {
if (!txid)
throw new Error('No transactions found.');

return this.listHistoryFrom(acct, txid, limit, reverse);
return this.listHistoryFrom(acct, {
txid,
limit: options.limit,
reverse: options.reverse
});
}

/**
* Get all transactions in ascending or decending
* order after a txid (exclusive) and limited at a max
* of 100 transactions.
* @param {Number} acct
* @param {Buffer} txid
* @param {Number} limit
* @param {Boolean} reverse
* @param {Object} options
* @param {Buffer} options.txid
* @param {Number} options.limit
* @param {Boolean} options.reverse
* @returns {Promise} - Returns {@link TX}[].
*/

async listHistoryAfter(acct, txid, limit, reverse) {
return this._listHistory(acct, txid, limit, reverse, false);
async listHistoryAfter(acct, options) {
return this._listHistory(acct, {
txid: options.txid,
limit: options.limit,
reverse: options.reverse,
inclusive: false
});
}

/**
* Get all transactions in ascending or decending
* order after a txid (inclusive) and limited at a max
* of 100 transactions.
* @param {Number} acct
* @param {Buffer} txid
* @param {Number} limit
* @param {Boolean} reverse
* @param {Object} options
* @param {Buffer} options.txid
* @param {Number} options.limit
* @param {Boolean} options.reverse
* @returns {Promise} - Returns {@link TX}[].
*/

async listHistoryFrom(acct, txid, limit, reverse) {
return this._listHistory(acct, txid, limit, reverse, true);
async listHistoryFrom(acct, options) {
return this._listHistory(acct, {
txid: options.txid,
limit: options.limit,
reverse: options.reverse,
inclusive: true
});
}

/**
Expand All @@ -1771,42 +1791,44 @@ class TXDB {
* and limited at a max of 100 transactions per call.
* @private
* @param {Number} acct
* @param {Buffer} txid
* @param {Number} limit
* @param {Boolean} reverse
* @param {Boolean} inclusive
* @param {Number} options
* @param {Buffer} options.txid
* @param {Number} options.limit
* @param {Boolean} options.reverse
* @param {Boolean} options.inclusive
* @returns {Promise} - Returns {@link TX}[].
*/

async _listHistory(acct, txid, limit, reverse, inclusive) {
async _listHistory(acct, options) {
assert(typeof acct === 'number');
assert(Buffer.isBuffer(txid));
assert(typeof limit === 'number');
assert(typeof reverse === 'boolean');
assert(typeof inclusive === 'boolean');
assert(typeof options === 'object');
assert(Buffer.isBuffer(options.txid));
assert(typeof options.limit === 'number');
assert(typeof options.reverse === 'boolean');
assert(typeof options.inclusive === 'boolean');

if (limit > 100)
if (options.limit > 100)
throw new Error('Limit exceeds max of 100.');

const count = await this.getAccountCountForTX(acct, txid);
const count = await this.getAccountCountForTX(acct, options.txid);

let options = {
limit: limit,
reverse: reverse // TODO: Verify that `bdb` supports `reverse`
let xopts = {
limit: options.limit,
reverse: options.reverse
}

let lesser = inclusive ? 'lte' : 'lt';
let greater = inclusive ? 'gte' : 'gt';
let lesser = options.inclusive ? 'lte' : 'lt';
let greater = options.inclusive ? 'gte' : 'gt';

if (reverse) {
options['gte'] = layout.x.min(acct);
options[lesser] = layout.x.encode(acct, count);
if (xopts.reverse) {
xopts['gte'] = layout.x.min(acct);
xopts[lesser] = layout.x.encode(acct, count);
} else {
options[greater] = layout.x.encode(acct, count);
options['lte'] = layout.x.max(acct);
xopts[greater] = layout.x.encode(acct, count);
xopts['lte'] = layout.x.max(acct);
}

const hashes = await this.bucket.values(options);
const hashes = await this.bucket.values(xopts);

return Promise.all(hashes.map(async (hash) => await this.getTX(hash)));
}
Expand Down
31 changes: 17 additions & 14 deletions lib/wallet/wallet.js
Original file line number Diff line number Diff line change
Expand Up @@ -1997,37 +1997,40 @@ class Wallet extends EventEmitter {

/**
* @param {(String|Number)?} acct
* @param {Number?} limit
* @param {Boolean?} reverse
* @param {Object} options
* @param {Number?} options.limit
* @param {Boolean?} options.reverse
* @returns {Promise} - Returns Number.
*/
async listHistory(acct, limit, reverse) {
async listHistory(acct, options) {
const account = await this.ensureIndex(acct);
return this.txdb.listHistory(account, limit, reverse);
return this.txdb.listHistory(account, options);
}

/**
* @param {(String|Number)} acct
* @param {String} txid
* @param {Number?} limit
* @param {Boolean?} reverse
* @param {Object} options
* @param {String} options.txid
* @param {Number?} options.limit
* @param {Boolean?} options.reverse
* @returns {Promise} - Returns Number.
*/
async listHistoryAfter(acct, txid, limit, reverse) {
async listHistoryAfter(acct, options) {
const account = await this.ensureIndex(acct);
return this.txdb.listHistoryAfter(account, txid, limit, reverse);
return this.txdb.listHistoryAfter(account, options);
}

/**
* @param {(String|Number)} acct
* @param {Date} time - Time in seconds
* @param {Number?} limit
* @param {Boolean?} reverse
* @param {Object} options
* @param {Number} options.time - Time in seconds.
* @param {Number?} options.limit
* @param {Boolean?} options.reverse
* @returns {Promise} - Returns Number.
*/
async listHistoryByTime(acct, time, limit, reverse) {
async listHistoryByTime(acct, options) {
const account = await this.ensureIndex(acct);
return this.txdb.listHistoryByTime(account, time, limit, reverse);
return this.txdb.listHistoryByTime(account, options);
}

/**
Expand Down

0 comments on commit 2c5ddb0

Please sign in to comment.