Binary Term Format
is a term format inspired in ETF with more types and circular reference serialization and deserialization.
This term format is designed to fix one of ETF's flaws: byte size.
Serializing this object:
{
"test": ["hello", "world"],
"more": {
"nested": "objects",
"do": ["you", "like", "it?"]
}
}
Takes 80
bytes as JSON.stringify()
'd, 116
bytes as ETF
using devsnek/earl
, and just 71
bytes in BTF
.
The extreme compression is achieved by delimiting the bytes using a technique similar to null delimited strings. Allowing every string, array, set, map, and object, to trim the byte size by 3 (4 bytes for length/size -> 1 byte to delimit the field). TypedArrays do not get this feature, since they have a type for all elements instead of a type for each element, [0]
works because it is encoded as ArrayType
+ NumberByteLiteralType
+ 0x00
+ NullDelimiter
, but this technique would not work in Uint8Array[0]
(Uint8ArrayType
+ 0x00 + 0x00 + 0x00 + 0x01
+ 0x00
).
And this is also achieved by using special types for empty collections, [null]
takes 3 bytes (ArrayType
+ NullType
+ NullDelimiter
), but []
takes a single byte (EmptyArrayType
). This also applies to empty objects, sets, and maps.
This module is plug-and-play, it exposes two functions, serialize
and deserialize
, and would be used in the following way:
const { serialize, deserialize } = require('binarytf');
const serialized = serialize({ hello: 'world' });
const deserialized = deserialize(serialized);
console.log(deserialized); // { hello: 'world' }
This module is TypeScript ready and comes with types included. To import with ESM use the following syntax:
import { serialize, deserialize } from 'binarytf';
binarytf
is heavily based on devsnek/earl
, this module wouldn't be possible without it's author:
git checkout -b my-new-feature
git commit -am 'Add some feature'
git push origin my-new-feature
binarytf © kyranet, released under the MIT License. Authored and maintained by kyranet.
Please make sure to read the Contributing Guide before making a pull request.
Thank you to all the people who already contributed!