High Performance Erlang Term Format Packer
Erlpack is a fast encoder and decoder for the Erlang Term Format (version 131) for Python and JavaScript.
let erlpack = require("erlpack");packed = erlpack.pack({'a': true, 'list': ['of', 3, 'things', 'to', 'pack']});
Note: Unpacking requires the binary data be a Uint8Array or Buffer. For those using electron/libchromium see the gotcha below. ```js let erlpack = require("erlpack");
let unpacked = null; let packed = new Buffer('', 'binary'); try { unpacked = erlpack.unpack(packed); } catch (e) { // got an exception parsing } ```
Some versions of libchromium replace the native data type backing TypedArrays with a custom data type called blink::WebArrayBuffer. To keep erlpack' dependencies simple this data type is not supported directly. If you're using Electron / Libchromium you need to convert the blink::WebArrayBuffer into a node::Buffer before passing to erlpack. You will need to add this code into your native package somewhere: ```cpp v8::Localv8::Value ConvertToNodeBuffer(const v8::Localv8::Object& blinkArray) { if (node::Buffer::HasInstance(blinkArray)) { return blinkArray; } else if (blinkArray->IsArrayBufferView()) { auto byteArray = v8::ArrayBufferView::Cast(blinkArray); return node::Buffer::Copy(v8::Isolate::GetCurrent(), (const char)byteArray->Buffer()->GetContents().Data(), byteArray->ByteLength()).ToLocalChecked(); }
return v8::Local<:primitive>(v8::Null(v8::Isolate::GetCurrent()));
} ```
Then in JavaScript something like:
let packed = NativeUtils.convertToNodeBuffer(new Uint8Array(binaryPayload)); // unpack now using erlpack.unpack(packed)
from erlpack import packpacked = pack(["thing", "to", "pack"])
from erlpack import unpackunpacked = unpack(packed)
from erlpack import Atom, packpacked = pack(Atom('hello'))
from erlpack import ErlangTermEncoderdef encode_hook(obj): if isinstance(obj, datetime.datetime): return obj.isoformat()
encoder = ErlangTermEncoder(encode_hook=encode_hook) packed = encoder.pack(datetime.datetime(2015, 12, 25, 12, 23, 55))
from erlpack import pack, Atomclass User(object): def init(self, name, age): self.name = name self.age = age
def __erlpack__(self): return { Atom('name'): self.name, Atom('age'): self.age }
u = User(name='Jake', age=23) packed = pack(u)
Discord has moved away from Go internally and so we do not maintain a version of erlpack in Go ourselves. However, all is not lost!, please check out: https://github.com/JakeMakesStuff/go-erlpack