defmodule Floof.Message do @moduledoc """ Utility methods to deal with generating and emitting of messages """ def emit(xf) do {:XferBlob, _, _, _, _, xfinner} = xf {:ok, {:XferInner, _, attrs, _, _}} = :FloofProtocol.decode(:XferInner, xfinner) mhash = :crypto.hash(:blake2b, xfinner) GenServer.cast(Floof.Distributor, {:xfer, {self(), mhash, xf, attrs}}) mhash end def sign(xf, secret_key) do {:XferBlob, source, ttl, markers, _, xfinner} = xf signature = :enacl.sign_detached(xfinner, secret_key) signature2 = {:Signature, {1, 3, 6, 1, 4, 1, 11591, 15, 1}, signature} {:XferBlob, source, ttl, markers, signature2, xfinner} end def pack_inner(topic, attrs, severity, data) do # make sure that attrs is ordered to ensure proper repr attrs = :ordsets.to_list(:ordsets.from_list(attrs)) {:ok, data} = :FloofProtocol.encode(:XferInner, {:XferInner, topic, attrs, severity, data}) data end def build_outer(source, ttl, markers, secret_key, xfinner) do {:XferBlob, source, ttl, markers, nil, xfinner} |> sign(secret_key) end end