refactor: remote rescanning. misc fixes.

This commit is contained in:
Christopher Jeffrey 2016-09-23 00:42:16 -07:00
parent 02b19824dc
commit 9bbd8de8bf
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD
4 changed files with 41 additions and 51 deletions

View File

@ -213,7 +213,7 @@ HTTPBase.prototype._initIO = function _initIO() {
HTTPBase.prototype._open = function open() { HTTPBase.prototype._open = function open() {
assert(typeof this.options.port === 'number', 'Port required.'); assert(typeof this.options.port === 'number', 'Port required.');
this.listen(this.options.port, this.options.host); return this.listen(this.options.port, this.options.host);
}; };
/** /**

View File

@ -3934,17 +3934,17 @@ RPC.prototype.signmessage = co(function* signmessage(args) {
return sig.toString('base64'); return sig.toString('base64');
}); });
RPC.prototype.walletlock = function walletlock(args) { RPC.prototype.walletlock = co(function* walletlock(args) {
if (args.help || (this.wallet.master.encrypted && args.length !== 0)) if (args.help || (this.wallet.master.encrypted && args.length !== 0))
throw new RPCError('walletlock'); throw new RPCError('walletlock');
if (!this.wallet.master.encrypted) if (!this.wallet.master.encrypted)
throw new RPCError('Wallet is not encrypted.'); throw new RPCError('Wallet is not encrypted.');
this.wallet.lock(); yield this.wallet.lock();
return null; return null;
}; });
RPC.prototype.walletpassphrasechange = co(function* walletpassphrasechange(args) { RPC.prototype.walletpassphrasechange = co(function* walletpassphrasechange(args) {
var old, new_; var old, new_;

View File

@ -883,7 +883,7 @@ HTTPServer.prototype._initIO = function _initIO() {
socket.join(id); socket.join(id);
callback(); callback();
}).catch(function(err) { }, function(err) {
self.logger.info('Wallet auth failure for %s: %s.', id, err.message); self.logger.info('Wallet auth failure for %s: %s.', id, err.message);
return callback({ error: 'Bad token.' }); return callback({ error: 'Bad token.' });
}); });
@ -943,10 +943,13 @@ HTTPServer.prototype._initIO = function _initIO() {
socket.on('scan chain', function(args, callback) { socket.on('scan chain', function(args, callback) {
var start = args[0]; var start = args[0];
if (!utils.isHex256(start) && !utils.isNumber(start)) if (!utils.isHex256(start) && !utils.isUInt32(start))
return callback({ error: 'Invalid parameter.' }); return callback({ error: 'Invalid parameter.' });
socket.scan(start).then(callback).catch(function(err) { if (typeof start === 'string')
start = utils.revHex(start);
socket.scan(start).then(callback, function(err) {
callback({ error: err.message }); callback({ error: err.message });
}); });
}); });
@ -1062,8 +1065,8 @@ HTTPServer.prototype.del = function del(path, callback) {
* @see HTTPBase#listen * @see HTTPBase#listen
*/ */
HTTPServer.prototype.listen = function listen(port, host, callback) { HTTPServer.prototype.listen = function listen(port, host) {
this.server.listen(port, host, callback); return this.server.listen(port, host);
}; };
/** /**
@ -1257,27 +1260,40 @@ ClientSocket.prototype.testFilter = function testFilter(tx) {
} }
}; };
ClientSocket.prototype.scan = function scan(start) { ClientSocket.prototype.scan = co(function* scan(start) {
var self = this; var scanner = this.scanner.bind(this);
var i; var entry;
if (typeof start === 'string') if (this.chain.db.options.spv) {
start = utils.revHex(start); entry = yield this.chain.db.get(start);
if (this.chain.db.options.spv) if (!entry)
return this.chain.reset(start); throw new Error('Block not found.');
if (!entry.isGenesis())
start = entry.prevBlock;
yield this.chain.reset(start);
return;
}
if (this.chain.db.options.prune) if (this.chain.db.options.prune)
return Promise.reject(new Error('Cannot scan in pruned mode.')); throw new Error('Cannot scan in pruned mode.');
return this.chain.db.scan(start, this.filter, co(function *(entry, txs) { yield this.chain.db.scan(start, this.filter, scanner);
for (i = 0; i < txs.length; i++) });
txs[i] = txs[i].toJSON();
self.emit('block tx', entry.toJSON(), txs); ClientSocket.prototype.scanner = function scanner(entry, txs) {
var json = new Array(txs.length);
var i;
yield utils.wait(); for (i = 0; i < txs.length; i++)
})); json[i] = txs[i].toJSON();
this.emit('block tx', entry.toJSON(), json);
return Promise.resolve(null);
}; };
ClientSocket.prototype.join = function join(id) { ClientSocket.prototype.join = function join(id) {

View File

@ -77,31 +77,6 @@ function co(generator) {
}; };
} }
/**
* Wrap a generator function to be
* executed into a function that
* returns a promise (with a lock).
* @param {String} name - lock name.
* @param {GeneratorFunction}
* @returns {Function}
*/
function col(name, generator) {
var func = co(generator);
return co(function *() {
var unlock = yield this[name].lock();
var result;
try {
result = yield func.apply(this, arguments);
} catch (e) {
unlock();
throw e;
}
unlock();
return result;
});
}
/** /**
* Wrap a generator function to be * Wrap a generator function to be
* executed into a function that * executed into a function that
@ -235,11 +210,11 @@ function wrap(resolve, reject) {
function call(func) { function call(func) {
var self = this; var self = this;
var args = new Array(arguments.length); var args = new Array(Math.max(0, arguments.length - 1));
var i; var i;
for (i = 1; i < arguments.length; i++) for (i = 1; i < arguments.length; i++)
args[i] = arguments[i]; args[i - 1] = arguments[i];
return new Promise(function(resolve, reject) { return new Promise(function(resolve, reject) {
args.push(wrap(resolve, reject)); args.push(wrap(resolve, reject));
@ -284,7 +259,6 @@ exports = spawn;
exports.exec = exec; exports.exec = exec;
exports.spawn = spawn; exports.spawn = spawn;
exports.co = co; exports.co = co;
exports.col = col;
exports.cob = cob; exports.cob = cob;
exports.con = con; exports.con = con;
exports.cb = cb; exports.cb = cb;