⚡Fast, compressed binary serializers in Node.js and HTML5
🔮 Simple, declarative API | 🔥 Blazing fast serialization |
🗜️ Powerful compression | 💾 ^50% smaller than FlatBuffers |
🍃 Zero dependencies | 🙉 Strong, inferred types |
🌐 Node / browser | 🛡️ Built-in validation/transforms |
🤏 ~4.4kb minzipped |
✅ Property mangling (Terser) |
npm install tinybuf
import { defineFormat, Type } from 'tinybuf';
export const GameWorldData = defineFormat({
frameNo: Type.UInt,
timeRemaining: Type.Float16,
players: [
{
id: Type.UInt,
position: {
x: Type.Float32,
y: Type.Float32
},
joystick: {
x: Type.Scalar8,
y: Type.Scalar8
},
actions: Type.Bools // [ jump, attack ]
}
]
});
Formats can be encoded directly:
let bytes = GameWorldData.encode({
frameNo: 50,
timeRemaining: 59.334,
players: [
{
id: 1,
position: { x: 123.5, y: 456.75 },
joystick: { x: 0.75, y: -0.662 },
actions: [ /* jump: */ true,
/* attack: */ false ]
}
]
});
bytes.byteLength
// 16
Or directly from objects:
let bytes = GameWorldData.encode( obj );
bytes.byteLength
// 16
Formats can be read in a number of ways:
- Simple – decode to object
- In-place – decode into an existing object
- Parser – register / decode many formats
Decode as a strongly-typed object.
let obj = GameWorldData.decode( bytes );
// { frameNo: number; timeRemaining: number; … }
Use for memory effiency - extract fields directly into an existing object instance. This prevents allocating new memory.
let obj: Decoded<typeof GameWorldData> = {} as any;
GameWorldData.decode( bytes, obj );
- Register formats with
.on(format, handler, options?)
- Trigger format handlers with
.processBuffer(bytes)
import { bufferParser } from 'tinybuf';
// register
const parser = bufferParser()
.on(MyChatMessage, msg => myHud.showChat(msg))
.on(GameWorldData, data => myWorld.update(data), {
decodeInPlace: true, // `data` gets recycled
});
// parse
parser.processBuffer( bytes );
🏁 Quick start: | Quick start guide, Types |
📑 Advanced: | Async safety mode, Format header collisions, Compression tips, Validation/transforms |
tinybuf is based on Guilherme Souza's js-binary