nytra
v0.0.11
Published
A javascript ES6 Decorator driven library to encode/decode javascript objects to/from binary optimized buffers to reduce payload on network
Readme
Nytra
Fast binary serialization for JavaScript/TypeScript with decorator-based DTO support.
Nytra helps you encode/decode plain values, arrays, objects, and class instances into compact binary buffers.
Features
- Binary encode/decode for primitives, arrays, objects, bigint, and nested data
- Decorator-based class schema registration
- Nullable fields support in DTOs
- Custom type IDs for compact class payloads
- ESM package output with TypeScript declarations
Installation
npm install nytraQuick Start
import { Nytra, Types } from "nytra";
@Nytra.registerClass(2000)
class Player {
@Nytra.registerField(0, Types.TYPE_STRING)
name: string;
@Nytra.registerField(1, Types.TYPE_UINT16)
level: number;
@Nytra.registerField(2, Types.TYPE_STRING, { nullable: true })
guild: string | null = null;
constructor(name: string, level: number) {
this.name = name;
this.level = level;
}
}
const original = new Player("Ari", 42);
const encoded = Nytra.encode(original);
const decoded = Nytra.decode(encoded) as Player;
console.log(decoded.name, decoded.level, decoded.guild);API Overview
Nytra.encode(data, typeId?)->Uint8ArrayNytra.decode(buffer)-> decoded valueNytra.autoguessType(data)-> internal type idNytra.getTypeIdForClass(ClassCtor)-> registered class type idNytra.registerClass(typeId)-> class decoratorNytra.registerField(position, typeOrClass, options?)-> field decorator
registerField options
nullable?: boolean- marks a field as nullable in class schema
Supported Built-in Types
Use constants from Types, for example:
TYPE_NULL,TYPE_BOOLEANTYPE_UINT8,TYPE_UINT16,TYPE_UINT32,TYPE_UINT64TYPE_INT8,TYPE_INT16,TYPE_INT32,TYPE_INT64TYPE_FLOAT32,TYPE_FLOAT64TYPE_STRING,TYPE_ARRAY,TYPE_OBJECT,TYPE_JSON,TYPE_BIGINT
Development
Build:
npm run buildRun tests (Bun):
bun testTypeScript Decorators Setup
If you see decorator typing/runtime issues, enable modern decorators + metadata in your TS setup:
{
"compilerOptions": {
"target": "ES2022",
"module": "nodenext",
"moduleResolution": "nodenext",
"lib": ["ES2022", "esnext.decorators", "esnext.decorators.metadata"]
}
}Nytra decorators use the new standard decorator context APIs (
ClassDecoratorContext,ClassFieldDecoratorContext).
For projecty relying on legacy TypeScript decorators, you can use the exported NytraExperimental class wrapping the new TC30 Decorators.
import {NytraExperimental, Types as T} from "nytra";
@NytraExperimental.registerClass(10000)
export class PageStats {
@NytraExperimental.registerField(0, T.TYPE_STRING)
version: string;
@NytraExperimental.registerField(1, T.TYPE_UINT32)
registrationCount: number;
}License
MIT
