narrowlink_types/client/
event.rs

1use std::{net::IpAddr, str::FromStr};
2
3use serde::{Deserialize, Serialize};
4use uuid::Uuid;
5
6use crate::{error::MessageError, generic::AgentInfo, GetResponse, NatType};
7
8use super::ConstSystemInfo;
9
10#[derive(Debug, Serialize, Deserialize)]
11pub enum OutBound {
12    Request(usize, Request),
13}
14
15#[derive(Debug, Serialize, Deserialize)]
16pub enum InBound {
17    Response(usize, Response),
18    ConnectionError(Uuid, String),
19    Peer2Peer(Peer2PeerInstruction),
20}
21
22#[derive(Debug, Serialize, Deserialize)]
23pub enum Request {
24    ListOfAgents,
25    UpdateConstantSysInfo(ConstSystemInfo),
26    Peer2Peer(Peer2PeerRequest), // agent_name
27}
28
29#[derive(Debug, Clone, Serialize, Deserialize)]
30pub enum Response {
31    ActiveAgents(Vec<AgentInfo>),
32    Ok,
33    Failed,
34}
35
36impl FromStr for OutBound {
37    type Err = MessageError;
38    fn from_str(s: &str) -> Result<Self, <Self as FromStr>::Err> {
39        Ok(serde_json::from_str(s)?)
40    }
41}
42
43impl From<InBound> for Result<String, MessageError> {
44    fn from(inbound: InBound) -> Self {
45        serde_json::to_string(&inbound).map_err(|e| e.into())
46    }
47}
48
49impl GetResponse for InBound {
50    type Item = Response;
51
52    fn response(&self) -> Option<Self::Item> {
53        #[allow(irrefutable_let_patterns)]
54        let InBound::Response(_, response) = self
55        else {
56            return None;
57        };
58        Some(response.to_owned())
59    }
60}
61
62#[derive(Debug, Clone, Serialize, Deserialize)]
63pub struct Peer2PeerRequest {
64    pub agent_name: String,
65    pub easy_seed_port: u16,
66    pub easy_seq: u16,
67    pub hard_seed_port: u16,
68    pub hard_seq: u16,
69}
70
71#[derive(Debug, Serialize, Deserialize, Clone)]
72pub struct Peer2PeerInstruction {
73    pub peer_ip: IpAddr,
74    pub seed_port: u16,
75    pub seq: u16,
76    pub peer_nat: NatType, // peer nat type
77    pub nat: NatType,      // nat type
78    pub cert: Vec<u8>,
79}
80
81impl From<&Peer2PeerInstruction> for crate::Peer2PeerInstruction {
82    fn from(instruction: &Peer2PeerInstruction) -> Self {
83        crate::Peer2PeerInstruction {
84            peer_ip: instruction.peer_ip,
85            seed_port: instruction.seed_port,
86            seq: instruction.seq,
87            peer_nat: instruction.peer_nat,
88            nat: instruction.nat,
89        }
90    }
91}