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' }binarytf is heavily based on devsnek/earl, this module wouldn't be possible without it's author:
- Fork it!
- Create your feature branch:
git checkout -b my-new-feature - Commit your changes:
git commit -am 'Add some feature' - Push to the branch:
git push origin my-new-feature - Submit a pull request!
binarytf © kyranet, released under the MIT License. Authored and maintained by kyranet.

