UNPKG

@bsv/wallet-toolbox

Version:

BRC100 conforming wallet, wallet storage and wallet signer components

60 lines 2.58 kB
"use strict"; 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