Core buffers

@webbuf/rw

Read and write buffers, optimized with Rust/WASM

Install

npm install @webbuf/rw

Usage

import { BufWriter, BufReader } from "@webbuf/rw";
import { zigZagEncode, zigZagDecode } from "@webbuf/numbers";
import {
  U8,
  U16BE,
  U32BE,
  U64BE,
  U16LE,
  U32LE,
  U64LE,
  U128LE,
  U256LE,
} from "@webbuf/numbers";
import { FixedBuf } from "@webbuf/fixedbuf";

const writer = new BufWriter();

// Separate codecs: SLEB128 is not ZigZag followed by ULEB128.
const variable = new BufWriter()
  .writeULEB128(300n)
  .writeSLEB128(-1n)
  .writeULEB128(zigZagEncode(-1n));
if (variable.toBuf().toHex() !== "ac027f01") throw new Error("Wrong bytes");
const variableReader = new BufReader(variable.toBuf());
if (variableReader.readULEB128() !== 300n)
  throw new Error("Wrong unsigned value");
if (variableReader.readSLEB128() !== -1n) throw new Error("Wrong signed value");
if (zigZagDecode(variableReader.readULEB128()) !== -1n)
  throw new Error("Wrong ZigZag value");

// Write numbers
writer.writeU8(U8.fromN(255));
writer.writeU16BE(U16BE.fromN(1000));
writer.writeU32BE(U32BE.fromN(123456));
writer.writeU64BE(U64BE.fromBn(0x123456789abcdef0n));

// Write fixed buffers
const hash = FixedBuf.fromRandom<32>(32);
writer.write(hash.buf);

// Write variable-length data
writer.writeVarIntU64BE(U64BE.fromBn(1000n));

// Fixed-width little-endian fields (not varints)
writer.writeU16LE(U16LE.fromN(1000));
writer.writeU32LE(U32LE.fromN(123456));
writer.writeU64LE(U64LE.fromBn(0x123456789abcdef0n));
writer.writeU128LE(U128LE.fromBn(1n << 100n));
writer.writeU256LE(U256LE.fromBn(1n << 200n));

// Get result
const buf = writer.toBuf();

API reference (2 exports)

Classes

BufReader

class
constructor(buf: WebBuf): BufReader
buf: WebBuf
pos: number
eof(): boolean
readULEB128(maxBits?: number): bigint
readSLEB128(maxBits?: number): bigint
read(len: number): WebBuf
readFixed<N extends number>(len: N): FixedBuf<N>
readRemainder(): WebBuf
readU8(): U8
readU16BE(): U16BE
readU32BE(): U32BE
readU64BE(): U64BE
readU128BE(): U128BE
readU256BE(): U256BE
readU16LE(): U16LE
readU32LE(): U32LE
readU64LE(): U64LE
readU128LE(): U128LE
readU256LE(): U256LE
readVarIntBEBuf(): WebBuf
readVarIntLEBuf(): WebBuf
readVarIntU64LE(): U64LE
readVarIntU64BE(): U64BE

BufWriter

class
constructor(bufs?: WebBuf[]): BufWriter
static varIntU64LEBuf(value: U64LE): WebBuf
static varIntU64BEBuf(bn: U64BE): WebBuf
bufs: WebBuf[]
getLength(): number
toBuf(): WebBuf
write(buf: WebBuf): BufWriter
writeULEB128(value: bigint, maxBits?: number): BufWriter
writeSLEB128(value: bigint, maxBits?: number): BufWriter
writeU8(u8: U8): BufWriter
writeU16BE(u16: U16BE): BufWriter
writeU32BE(u32: U32BE): BufWriter
writeU64BE(u64: U64BE): BufWriter
writeU128BE(u128: U128BE): BufWriter
writeU256BE(u256: U256BE): BufWriter
writeU16LE(value: U16LE): BufWriter
writeU32LE(value: U32LE): BufWriter
writeU64LE(value: U64LE): BufWriter
writeU128LE(value: U128LE): BufWriter
writeU256LE(value: U256LE): BufWriter
writeVarIntU64BE(u64: U64BE): BufWriter
writeVarIntU64LE(value: U64LE): BufWriter