simbroadcasts / node-insim

A NodeJS library for Live For Speed InSim protocol
https://simbroadcasts.github.io/node-insim/
13 stars 1 forks source link

Consider using Typed Binary schemas for describing packets #41

Open mkapal opened 4 months ago

mkapal commented 4 months ago

As of now, every packet has its properties annotated by decorators according to their binary representation. For instance, an 8-bit unsigned integer is represented by the @byte() decorator. Each decorator holds a unique character which is then used when packing or unpacking binary data.

The downsides of this approach is that there is a lot of "magic" code inside the base Struct and Packet classes and several as typecasts, making the code less readable and maintainable.

The idea is to define a schema for each packet and have the type definition inferred from the schema. This can be done using the Typed Binary library: https://github.com/iwoplaza/typed-binary

It includes several binary schema types, a buffer writer and a reader to pack/unpack binary data into the schema structure.

So far it lacks all ArrayBuffer binary types like 16-bit integers or an unsigned 32-bit float. I've created an issue for it: https://github.com/iwoplaza/typed-binary/issues/8

mkapal commented 4 months ago

An alternative to consider - protobuf:

https://github.com/stephenh/ts-proto https://github.com/bufbuild/protobuf-es https://github.com/aperturerobotics/protobuf-es-lite