narrowlink_types/agent/
event.rs

1use std::{net::IpAddr, str::FromStr};
2
3use serde::{Deserialize, Serialize};
4use uuid::Uuid;
5
6use crate::{
7    error::MessageError,
8    generic::Connect,
9    policy::{self, Policy},
10    GetResponse, NatType,
11};
12
13use super::{ConstSystemInfo, DynSystemInfo};
14
15#[derive(Debug, Serialize, Deserialize, Clone)]
16pub enum InBound {
17    Connect(Uuid, Connect, Vec<Policy>),
18    IsReachable(Uuid, Connect),
19    Response(usize, Response),
20    Ping(u64),
21    Peer2Peer(Peer2PeerInstruction),
22    Shutdown,
23}
24
25#[derive(Debug, Serialize, Deserialize, Clone)]
26pub enum OutBound {
27    Pong(u64),
28    Ready(Uuid),
29    NotSure(Uuid),
30    Error(Uuid, String),
31    Request(usize, Request),
32}
33
34#[derive(Debug, Serialize, Deserialize, Clone)]
35pub enum Request {
36    UpdateDynamicSysInfo(DynSystemInfo),
37    UpdateConstantSysInfo(ConstSystemInfo),
38}
39
40#[derive(Debug, Serialize, Deserialize, Clone)]
41pub enum Response {
42    Ok,
43}
44
45impl FromStr for OutBound {
46    type Err = MessageError;
47    fn from_str(s: &str) -> Result<Self, <Self as FromStr>::Err> {
48        Ok(serde_json::from_str(s)?)
49    }
50}
51
52impl From<InBound> for Result<String, MessageError> {
53    fn from(inbound: InBound) -> Self {
54        serde_json::to_string(&inbound).map_err(|e| e.into())
55    }
56}
57
58impl GetResponse for InBound {
59    type Item = Response;
60
61    fn response(&self) -> Option<Self::Item> {
62        if let InBound::Response(_, response) = self {
63            Some(response.to_owned())
64        } else {
65            None
66        }
67    }
68}
69
70#[derive(Debug, Serialize, Deserialize, Clone)]
71pub struct Peer2PeerInstruction {
72    // Todo: policy
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    pub key: Vec<u8>,
80    pub policies: Vec<policy::Policy>,
81}
82
83impl From<&Peer2PeerInstruction> for crate::Peer2PeerInstruction {
84    fn from(instruction: &Peer2PeerInstruction) -> Self {
85        crate::Peer2PeerInstruction {
86            peer_ip: instruction.peer_ip,
87            seed_port: instruction.seed_port,
88            seq: instruction.seq,
89            peer_nat: instruction.peer_nat,
90            nat: instruction.nat,
91        }
92    }
93}