http: interactive rescan will now throw on socket.call similar to rescan.

This commit is contained in:
Nodari Chkuaselidze 2024-02-14 18:30:02 +04:00
parent c8592d121d
commit 57194f4cd6
No known key found for this signature in database
GPG key ID: B018A7BB437D1F05
5 changed files with 132 additions and 15 deletions

View file

@ -2266,13 +2266,22 @@ class Chain extends AsyncEmitter {
}
}
/** @typedef {import('./common').ScanAction} ScanAction */
/**
* @callback ScanInteractiveIterCB
* @param {ChainEntry} entry
* @param {TX[]} txs
* @returns {Promise<ScanAction>}
*/
/**
* Interactive scan the blockchain for transactions containing specified
* address hashes. Allows repeat and abort.
* @param {Hash|Number} start - Block hash or height to start at.
* @param {BloomFilter} filter - Starting bloom filter containing tx,
* address and name hashes.
* @param {Function} iter - Iterator.
* @param {ScanInteractiveIterCB} iter - Iterator.
* @param {Boolean} [fullLock=false]
* @returns {Promise}
*/
@ -2300,7 +2309,7 @@ class Chain extends AsyncEmitter {
* @param {Hash|Number} start - Block hash or height to start at.
* @param {BloomFilter} filter - Starting bloom filter containing tx,
* address and name hashes.
* @param {Function} iter - Iterator.
* @param {ScanInteractiveIterCB} iter - Iterator.
* @param {Boolean} [lockPerScan=true] - if we should lock per block scan.
* @returns {Promise}
*/

View file

@ -1612,12 +1612,18 @@ class ChainDB {
this.logger.info('Finished scanning %d blocks.', total);
}
/**
* @typedef {Object} ScanBlockResult
* @property {ChainEntry} entry
* @property {TX[]} txs
*/
/**
* Interactive scans block checks.
* @param {Hash|Number} blockID - Block hash or height to start at.
* @param {BloomFilter} [filter] - Starting bloom filter containing tx,
* address and name hashes.
* @returns {Promise}
* @returns {Promise<ScanBlockResult>}
*/
async scanBlock(blockID, filter) {

View file

@ -84,3 +84,39 @@ exports.scanActions = {
REPEAT_ADD: 4,
REPEAT: 5
};
/**
* @typedef {Object} ActionAbort
* @property {exports.scanActions} type - ABORT
*/
/**
* @typedef {Object} ActionNext
* @property {exports.scanActions} type - NEXT
*/
/**
* @typedef {Object} ActionRepeat
* @property {exports.ScanAction} type - REPEAT
*/
/**
* @typedef {Object} ActionRepeatAdd
* @property {exports.scanActions} type - REPEAT_ADD
* @property {Buffer[]} chunks
*/
/**
* @typedef {Object} ActionRepeatSet
* @property {exports.scanActions} type - REPEAT_SET
* @property {BloomFilter} filter
*/
/**
* @typedef {ActionAbort
* | ActionNext
* | ActionRepeat
* | ActionRepeatAdd
* | ActionRepeatSet
* } ScanAction
*/

View file

@ -925,10 +925,9 @@ class HTTP extends Server {
try {
await this.node.scanInteractive(start, filter, iter, fullLock);
} catch (err) {
return socket.call('block rescan interactive abort', err.message);
await socket.call('block rescan interactive abort', err.message);
throw err;
}
return null;
}
}

View file

@ -543,7 +543,14 @@ describe('Node Rescan Interactive API', function() {
if (test.filter)
filter = test.filter.encode();
await client.rescanInteractive(startHeight, filter);
let err;
try {
await client.rescanInteractive(startHeight, filter);
} catch (e) {
err = e;
}
assert(err);
assert.strictEqual(err.message, 'scan request aborted.');
assert.strictEqual(count, 5);
assert.strictEqual(aborted, true);
@ -554,7 +561,15 @@ describe('Node Rescan Interactive API', function() {
if (test.filter)
await client.setFilter(test.filter.encode());
await client.rescanInteractive(startHeight, null);
err = null;
try {
await client.rescanInteractive(startHeight, null);
} catch (e) {
err = e;
}
assert(err);
assert.strictEqual(err.message, 'scan request aborted.');
assert.strictEqual(count, 5);
assert.strictEqual(aborted, true);
});
@ -596,7 +611,14 @@ describe('Node Rescan Interactive API', function() {
if (test.filter)
filter = test.filter.encode();
await client.rescanInteractive(startHeight, filter);
let err;
try {
await client.rescanInteractive(startHeight, filter);
} catch (e) {
err = e;
}
assert(err);
assert.strictEqual(err.message, 'scan request aborted.');
assert.strictEqual(count, 5);
assert.strictEqual(aborted, true);
@ -606,7 +628,14 @@ describe('Node Rescan Interactive API', function() {
if (test.filter)
await client.setFilter(test.filter.encode());
await client.rescanInteractive(startHeight);
err = null;
try {
await client.rescanInteractive(startHeight);
} catch (e) {
err = e;
}
assert(err);
assert.strictEqual(err.message, 'scan request aborted.');
assert.strictEqual(count, 5);
assert.strictEqual(aborted, true);
});
@ -648,7 +677,14 @@ describe('Node Rescan Interactive API', function() {
if (test.filter)
filter = test.filter.encode();
await client.rescanInteractive(startHeight, filter);
let err;
try {
await client.rescanInteractive(startHeight, filter);
} catch (e) {
err = e;
}
assert(err);
assert.strictEqual(err.message, 'scan request aborted.');
assert.strictEqual(count, 5);
assert.strictEqual(aborted, true);
@ -658,7 +694,14 @@ describe('Node Rescan Interactive API', function() {
if (test.filter)
await client.setFilter(test.filter.encode());
await client.rescanInteractive(startHeight);
err = null;
try {
await client.rescanInteractive(startHeight);
} catch (e) {
err = e;
}
assert(err);
assert.strictEqual(err.message, 'scan request aborted.');
assert.strictEqual(count, 5);
assert.strictEqual(aborted, true);
});
@ -705,7 +748,15 @@ describe('Node Rescan Interactive API', function() {
if (test.filter)
filter = test.filter.encode();
await client.rescanInteractive(startHeight, filter);
let err;
try {
await client.rescanInteractive(startHeight, filter);
} catch (e) {
err = e;
}
assert(err);
assert.strictEqual(err.message, 'scan request aborted.');
assert.strictEqual(count, tests.length);
assert.strictEqual(aborted, true);
});
@ -748,17 +799,33 @@ describe('Node Rescan Interactive API', function() {
aborted = true;
});
await client.rescanInteractive(startHeight, filter.encode());
let err;
try {
await client.rescanInteractive(startHeight, filter.encode());
} catch (e) {
err = e;
}
assert(err);
assert.strictEqual(err.message, 'scan request aborted.');
assert.strictEqual(aborted, true);
// Now try using client.filter
err = null;
aborted = false;
filter = BloomFilter.fromRate(10000, 0.001);
testTXs = allTXs[startHeight].slice();
expected = 0;
await client.setFilter(filter.encode());
await client.rescanInteractive(startHeight);
try {
await client.rescanInteractive(startHeight);
} catch (e) {
err = e;
}
assert(err);
assert.strictEqual(err.message, 'scan request aborted.');
assert.strictEqual(aborted, true);
});