'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var byteUtils = require('./byte-utils.js'); const defaultChunkSize = 256; class Bl { constructor(chunkSize = defaultChunkSize) { this.chunkSize = chunkSize; this.cursor = 0; this.maxCursor = -1; this.chunks = []; this._initReuseChunk = null; } reset() { this.cursor = 0; this.maxCursor = -1; if (this.chunks.length) { this.chunks = []; } if (this._initReuseChunk !== null) { this.chunks.push(this._initReuseChunk); this.maxCursor = this._initReuseChunk.length - 1; } } push(bytes) { let topChunk = this.chunks[this.chunks.length - 1]; const newMax = this.cursor + bytes.length; if (newMax <= this.maxCursor + 1) { const chunkPos = topChunk.length - (this.maxCursor - this.cursor) - 1; topChunk.set(bytes, chunkPos); } else { if (topChunk) { const chunkPos = topChunk.length - (this.maxCursor - this.cursor) - 1; if (chunkPos < topChunk.length) { this.chunks[this.chunks.length - 1] = topChunk.subarray(0, chunkPos); this.maxCursor = this.cursor - 1; } } if (bytes.length < 64 && bytes.length < this.chunkSize) { topChunk = byteUtils.alloc(this.chunkSize); this.chunks.push(topChunk); this.maxCursor += topChunk.length; if (this._initReuseChunk === null) { this._initReuseChunk = topChunk; } topChunk.set(bytes, 0); } else { this.chunks.push(bytes); this.maxCursor += bytes.length; } } this.cursor += bytes.length; } toBytes(reset = false) { let byts; if (this.chunks.length === 1) { const chunk = this.chunks[0]; if (reset && this.cursor > chunk.length / 2) { byts = this.cursor === chunk.length ? chunk : chunk.subarray(0, this.cursor); this._initReuseChunk = null; this.chunks = []; } else { byts = byteUtils.slice(chunk, 0, this.cursor); } } else { byts = byteUtils.concat(this.chunks, this.cursor); } if (reset) { this.reset(); } return byts; } } exports.Bl = Bl;