module arch.node.engines.net_registry_messages;

import arch.node.types.transport open;

import arch.node.types.basics open;
import arch.node.types.identities open;

type NodeAdvert :=
  mkNodeAdvert@{
    id : NodeID;
    addrs : List TransportAddress;
    version : Nat;
    created : AbsTime;
    sig : Commitment;
  };

type TopicAdvert :=
  mkTopicAdvert@{
    id : TopicID;
    relays : List NodeID;
    tags : List String;
    version : Nat;
    created : AbsTime;
    sig : Commitment;
  };

GetNodeAdvertReplyOk : Type := NodeAdvert;

type GetNodeAdvertReplyError := | GetNodeAdvertReplyErrorNotFound;

GetNodeAdvertReply : Type :=
  Result GetNodeAdvertReplyError GetNodeAdvertReplyOk;

GetTopicAdvertReplyOk : Type := TopicAdvert;

type GetTopicAdvertReplyError := | GetTopicAdvertReplyErrorNotFound;

GetTopicAdvertReply : Type :=
  Result GetTopicAdvertReplyError GetTopicAdvertReplyOk;

type NetworkRegistryMsg :=
  | NetworkRegistryMsgNodeAdvert NodeAdvert
  | NetworkRegistryMsgTopicAdvert TopicAdvert
  | NetworkRegistryMsgGetNodeAdvertRequest NodeID
  | NetworkRegistryMsgGetNodeAdvertReply GetNodeAdvertReply
  | NetworkRegistryMsgGetTopicAdvertRequest TopicID
  | NetworkRegistryMsgGetTopicAdvertReply GetTopicAdvertReply;