@bsv/wallet-toolbox
Version:
BRC100 conforming wallet, wallet storage and wallet signer components
60 lines • 2.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.BulkFileDataReader = void 0;
const sdk_1 = require("../../../../sdk");
const HeightRange_1 = require("./HeightRange");
class BulkFileDataReader {
constructor(manager, range, maxBufferSize) {
this.manager = manager;
this.range = range;
this.maxBufferSize = maxBufferSize;
this.nextHeight = range.minHeight;
}
/**
* Returns the Buffer of block headers from the given `file` for the given `range`.
* If `range` is undefined, the file's full height range is read.
* The returned Buffer will only contain headers in `file` and in `range`
* @param file
* @param range
*/
async readBufferFromFile(file, range) {
// Constrain the range to the file's contents...
let fileRange = new HeightRange_1.HeightRange(file.firstHeight, file.firstHeight + file.count - 1);
if (range)
fileRange = fileRange.intersect(range);
if (fileRange.isEmpty)
return undefined;
const offset = (fileRange.minHeight - file.firstHeight) * 80;
const length = fileRange.length * 80;
return await this.manager.getDataFromFile(file, offset, length);
}
/**
* @returns an array containing the next `maxBufferSize` bytes of headers from the files.
*/
async read() {
if (this.nextHeight === undefined || !this.range || this.range.isEmpty || this.nextHeight > this.range.maxHeight)
return undefined;
let lastHeight = this.nextHeight + this.maxBufferSize / 80 - 1;
lastHeight = Math.min(lastHeight, this.range.maxHeight);
let file = await this.manager.getFileForHeight(this.nextHeight);
if (!file)
throw new sdk_1.WERR_INTERNAL(`logic error`);
const readRange = new HeightRange_1.HeightRange(this.nextHeight, lastHeight);
let buffers = new Uint8Array(readRange.length * 80);
let offset = 0;
while (file) {
const buffer = await this.readBufferFromFile(file, readRange);
if (!buffer)
break;
buffers.set(buffer, offset);
offset += buffer.length;
file = await this.manager.getFileForHeight(file.firstHeight + file.count);
}
if (!buffers.length || offset !== readRange.length * 80)
return undefined;
this.nextHeight = lastHeight + 1;
return buffers;
}
}
exports.BulkFileDataReader = BulkFileDataReader;
//# sourceMappingURL=BulkFileDataReader.js.map