B:BD[
7.5398] → [
2.2101:2258]
-export([decode/1]).
%-export([decode_post_text/1, decode_post_delete/1, decode_post_info/1, decode_post_topic/1, decode_post_join/1, decode_post_leave/1]).
-export([decode/1, encode/3]).
% Encode
encode(KeyPair, Links, Post) ->
{PostType, PostBody} = encode_body(Post),
NumLinks = wire:encode_varint(length(Links)),
LinksBin = iolist_to_binary(Links),
Timestamp = wire:encode_varint(os:system_time(1000)),
Payload = iolist_to_binary([NumLinks, LinksBin, PostType, Timestamp, PostBody]),
#{public := Public, secret := Secret} = KeyPair,
Signature = enacl:sign_detached(Payload, Secret),
iolist_to_binary([Public, Signature, Payload]).
% TODO: delete, info, topic
encode_body({text, Chan, Text}) ->
ChanBin = unicode:characters_to_binary(Chan),
ChanLen = wire:encode_varint(byte_size(ChanBin)),
TextBin = unicode:characters_to_binary(Text),
TextLen = wire:encode_varint(byte_size(TextBin)),
{0, iolist_to_binary([ChanLen, ChanBin, TextLen, TextBin])};
encode_body({join, Chan}) ->
ChanBin = unicode:characters_to_binary(Chan),
ChanLen = wire:encode_varint(byte_size(Chan)),
{4, iolist_to_binary([ChanLen, ChanBin])};
encode_body({leave, Chan}) ->
ChanBin = unicode:characters_to_binary(Chan),
ChanLen = wire:encode_varint(byte_size(Chan)),
{5, iolist_to_binary([ChanLen, ChanBin])}.