module arch.node.net.router_messages;

import arch.node.net.router_types open;
import arch.node.net.transport_types open;
import arch.node.net.node_proxy_messages open;
import arch.node.net.pub_sub_topic_messages open;

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

type NodeConnectRequest :=
  mkNodeConnectRequest@{
    node_id : NodeID;
    permanent : Bool;
  };

type NodeConnectReplyOk : Type :=
  mkExampleReplyOk@{
    argOne : Nat;
  };

type NodeConnectReplyError : Type :=
  | NodeConnectReplyErrorUnknown
  | NodeConnectReplyErrorDenied;

NodeConnectReply : Type := Result NodeConnectReplyError NodeConnectReplyOk;

type RouterSub :=
  mkRouterSub@{
    topic_id : TopicID;
  };

type RouterTopicUnsub :=
  mkRouterTopicsub@{
    topic_id : TopicID;
  };

type RouterMsg M :=
  | RouterMsgNodeSend (NodeOutMsg M)
  | RouterMsgTopicForward TopicMsg
  | RouterMsgNodeConnectRequest NodeConnectRequest
  | RouterMsgNodeAdvert NodeAdvert
  | RouterMsgTopicAdvert TopicAdvert;