// @flow import * as BufferLayout from 'buffer-layout'; /** * Layout for a public key */ export const publicKey = (property: string = 'publicKey'): Object => { return BufferLayout.blob(32, property); }; /** * Layout for a 64bit unsigned value */ export const uint64 = (property: string = 'uint64'): Object => { return BufferLayout.blob(8, property); }; /** * Layout for a Rust String type */ export const rustString = (property: string = 'string') => { const rsl = BufferLayout.struct( [ BufferLayout.u32('length'), BufferLayout.u32('lengthPadding'), BufferLayout.blob(BufferLayout.offset(BufferLayout.u32(), -8), 'chars'), ], property, ); const _decode = rsl.decode.bind(rsl); const _encode = rsl.encode.bind(rsl); rsl.decode = (buffer, offset) => { const data = _decode(buffer, offset); return data.chars.toString('utf8'); }; rsl.encode = (str, buffer, offset) => { const data = { chars: Buffer.from(str, 'utf8'), }; return _encode(data, buffer, offset); }; return rsl; };