A TypeScript streaming library providing StreamReader
and StreamWriter
classes for efficient binary data processing. Inspired by the Reader
and Writer
interfaces from Zig
The library includes multiple ValueReader
implementations optimized for different scenarios:
Performance comparison on MacBook Pro (M1 Pro, 32GB RAM) using Playwright (Chromium & Firefox):
Operation | BitOps (ms) | DataView (ms) | Performance (ms) | Winner |
---|---|---|---|---|
Int8 (1M iterations) | 8.18 | 34.29 | 7.85 | PerformanceValueReader |
Int16 BE (500K iterations) | 12.43 | 20.44 | 11.13 | PerformanceValueReader |
Int32 BE (200K iterations) | 16.63 | 15.11 | 15.16 | DataView (tied) |
Uint64 BE (20K iterations) | 10.03 | 2.63 | 1.63 | PerformanceValueReader |
Int64 BE (20K iterations) | 8.96 | 1.74 | 1.61 | PerformanceValueReader |
Key Takeaways:
PerformanceValueReader
provides the best overall performance across all data typesPerformanceValueReader
is used as the DefaultValueReader
throughout the libraryInstall directly from GitHub:
# Using npm
npm install github:username/conduit-ts
# Using yarn
yarn add github:username/conduit-ts
# Using pnpm
pnpm add github:username/conduit-ts
# Using bun
bun add github:username/conduit-ts
Requirements:
import { StreamReader, Endian } from 'conduit-ts';
// Create from a ReadableStream
const reader = new StreamReader(someReadableStream);
// Or create from a buffer
const reader = StreamReader.from(new Uint8Array([1, 2, 3, 4]));
// Read various data types
const uint8Value = await reader.readUint8();
const uint16Value = await reader.readUint16(Endian.Little);
const uint32Value = await reader.readUint32();
const stringValue = await reader.readString(10);
// Read raw bytes
const bytes = await reader.read(5);
// Read until end of stream
const allBytes = await reader.readUntilEof();
// Clean up
await reader.close();
import { StreamWriter, Endian } from 'conduit-ts';
// Create with a WritableStream
const writer = new StreamWriter(someWritableStream);
// Write various data types
await writer.writeUint8(255);
await writer.writeUint16(65535, Endian.Little);
await writer.writeUint32(4294967295);
await writer.writeString("Hello, World!");
// Write raw bytes
await writer.write(new Uint8Array([1, 2, 3, 4]));
// Clean up
await writer.close();
new StreamReader(stream: ReadableStream<Uint8Array>)
StreamReader.from(bufferSource: BufferSource)
- Create from bufferread(len: number | bigint): Promise<Uint8Array>
- Read raw bytesreadString(len: number | bigint): Promise<string>
- Read UTF-8 stringreadUint8(): Promise<number>
- Read unsigned 8-bit integerreadInt8(): Promise<number>
- Read signed 8-bit integerreadUint16(endian?: Endian): Promise<number>
- Read unsigned 16-bit integerreadInt16(endian?: Endian): Promise<number>
- Read signed 16-bit integerreadUint32(endian?: Endian): Promise<number>
- Read unsigned 32-bit integerreadInt32(endian?: Endian): Promise<number>
- Read signed 32-bit integerreadUint64(endian?: Endian): Promise<bigint>
- Read unsigned 64-bit integerreadInt64(endian?: Endian): Promise<bigint>
- Read signed 64-bit integerreadUntilEof(): Promise<Uint8Array>
- Read all remaining bytesbytesRead: number
- Total bytes read so farclose(): Promise<void>
- Close the reader and release resourcesnew StreamWriter(stream: WritableStream)
write(buffer: BufferSource): Promise<number>
- Write raw byteswriteString(value: string): Promise<number>
- Write UTF-8 stringwriteUint8(value: number): Promise<number>
- Write unsigned 8-bit integerwriteInt8(value: number): Promise<number>
- Write signed 8-bit integerwriteUint16(value: number, endian?: Endian): Promise<number>
- Write unsigned 16-bit integerwriteInt16(value: number, endian?: Endian): Promise<number>
- Write signed 16-bit integerwriteUint32(value: number, endian?: Endian): Promise<number>
- Write unsigned 32-bit integerwriteInt32(value: number, endian?: Endian): Promise<number>
- Write signed 32-bit integerwriteUint64(value: bigint, endian?: Endian): Promise<number>
- Write unsigned 64-bit integerwriteInt64(value: bigint, endian?: Endian): Promise<number>
- Write signed 64-bit integerclose(): Promise<void>
- Close the writer and flush any pending dataMIT