narrowlink_types/client/
event.rs1use 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), }
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, pub nat: NatType, 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}