p2p 0.6.0

NAT Traversal for P2P communication
use p2p::RendezvousInfo;
use sodium::crypto::box_;
use std::fmt;

#[derive(Debug, Clone, Ord, PartialOrd, Eq, PartialEq, Serialize, Deserialize)]
pub struct PeerId {
    pub name: String,
    pub pk: box_::PublicKey,
}

impl PeerId {
    pub fn new(name: String, pk: box_::PublicKey) -> Self {
        Self { name, pk }
    }
}

impl fmt::Display for PeerId {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(
            f,
            "Peer: {} ({:02x}{:02x}{:02x}{:02x})",
            self.name, self.pk.0[0], self.pk.0[1], self.pk.0[2], self.pk.0[3]
        )
    }
}

#[derive(Debug, Serialize, Deserialize)]
pub enum PlainTextMsg {
    ReqUpdateName(String),
    UpdateNameResp(bool),
    ReqOnlinePeers,
    OnlinePeersResp(Vec<PeerId>),
    ExchgRendezvousInfo {
        src_info: RendezvousInfo,
        dst_peer: PeerId,
    },
    FwdRendezvousInfo {
        src_info: RendezvousInfo,
        src_peer: PeerId,
    },
    Chat(String),
}

#[derive(Serialize, Deserialize)]
pub enum PeerMsg {
    PubKey(box_::PublicKey),
    CipherText(Vec<u8>),
}