Endianness-aware cursor reader over Uint8Array — BE + LE, typed primitives, strings.
Module binaryReader | Source packages/front/fw/src/io/binary/reader.js | Deps none | Worker-safe yes
Resolve
const binaryReader = runtime.resolve('binaryReader');
// Returns: { create }
API
Factory
| Method |
Signature |
Returns |
create |
(uint8: Uint8Array, opts?: { endian?: 'be'|'le' }) => Reader |
Reader instance |
Reader — position
| Method |
Signature |
Returns |
pos |
getter |
number — current offset |
length |
getter |
number — buffer size |
tell |
() => number |
alias for pos |
eof |
() => boolean |
true if pos >= length |
seek |
(offset: number) => Reader |
absolute positioning |
skip |
(n: number) => Reader |
advance by n bytes |
peek |
(n: number) => Uint8Array |
read without advancing pos |
setEndian |
(e: 'be'|'le') => void |
change the current endianness |
Reader — unsigned primitives
| Method |
Returns |
u8() |
number uint8 |
u16() |
number uint16 |
u24() |
number uint24 |
u32() |
number uint32 |
u64() |
BigInt uint64 |
u64Safe() |
number — throws if > Number.MAX_SAFE_INTEGER |
Reader — signed primitives
| Method |
Returns |
i8() |
number int8 |
i16() |
number int16 |
i32() |
number int32 |
i64() |
BigInt int64 |
Reader — floats
| Method |
Returns |
f32() |
number float32 |
f64() |
number float64 |
Reader — strings / bytes
| Method |
Signature |
Returns |
bytes |
(n: number) => Uint8Array |
zero-copy slice |
utf8 |
(n: number) => string |
decode UTF-8 |
ascii |
(n: number) => string |
decode ASCII, throws if byte > 127 |
cstring |
() => string |
read until NUL, advances pos one extra byte |
Reader — sub-reader
| Method |
Signature |
Returns |
sub |
(offset: number, length: number) => Reader |
independent reader (zero-copy) |
Examples
const binaryReader = runtime.resolve('binaryReader');
// Big-endian read (SFNT/OpenType)
const r = binaryReader.create(sfntBytes, { endian: 'be' });
const sfVersion = r.u32(); // 0x00010000 = TrueType
const numTables = r.u16();
r.skip(6);
// Switch endian mid-stream (mixed PDF)
r.setEndian('le');
const xrefOffset = r.u32();
// Sub-reader on a table
const sub = r.sub(tableOffset, tableLength);
const tag = sub.ascii(4); // "cmap"
Worker Usage
const worker = fw.createWorker(
function ({ libs, args }) {
const r = libs.binaryReader.create(args[0], { endian: 'be' });
self.postMessage(r.u32());
},
{ dependencies: ['binaryReader'], args: [bytes] }
);
Notes
- The sub-reader is zero-copy: it shares the parent buffer via
Uint8Array.subarray(). Mutating the parent buffer affects the sub-reader.
u64() and i64() return BigInt — use u64Safe() when you need a Number and the value is guaranteed sub-2^53.
- All errors (overrun, OOB seek, invalid ASCII, missing NUL) are
ContractError with .code and .context.
See also
- binaryWriter — endianness-aware binary writer (companion module)