- Add GETTING_STARTED.md with quick start guide and development modes - Add INSTALL.sh automated installation script - Add INSTALLATION_CHECKLIST.md, INSTALLATION_SUCCESS.md, and INSTALLATION_SUMMARY.md - Add QUICK_REFERENCE.md for common commands - Add SETUP_GUIDE.md with detailed setup instructions - Update README.md with improved project overview - Add did-wallet app dependencies and node_modules
74 lines
2.1 KiB
JavaScript
74 lines
2.1 KiB
JavaScript
import {
|
|
alloc,
|
|
concat,
|
|
slice
|
|
} from './byte-utils.js';
|
|
const defaultChunkSize = 256;
|
|
export 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 = 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 = slice(chunk, 0, this.cursor);
|
|
}
|
|
} else {
|
|
byts = concat(this.chunks, this.cursor);
|
|
}
|
|
if (reset) {
|
|
this.reset();
|
|
}
|
|
return byts;
|
|
}
|
|
} |