distant_net/common/transport/framed/
handshake.rs

1use super::{CompressionLevel, CompressionType, EncryptionType};
2
3/// Definition of the handshake to perform for a transport
4#[derive(Clone, Debug)]
5pub enum Handshake {
6    /// Indicates that the handshake is being performed from the client-side
7    Client {
8        /// Preferred compression algorithm when presented options by server
9        preferred_compression_type: Option<CompressionType>,
10
11        /// Preferred compression level when presented options by server
12        preferred_compression_level: Option<CompressionLevel>,
13
14        /// Preferred encryption algorithm when presented options by server
15        preferred_encryption_type: Option<EncryptionType>,
16    },
17
18    /// Indicates that the handshake is being performed from the server-side
19    Server {
20        /// List of available compression algorithms for use between client and server
21        compression_types: Vec<CompressionType>,
22
23        /// List of available encryption algorithms for use between client and server
24        encryption_types: Vec<EncryptionType>,
25    },
26}
27
28impl Handshake {
29    /// Creates a new client handshake definition, providing defaults for the preferred compression
30    /// type, compression level, and encryption type
31    pub fn client() -> Self {
32        Self::Client {
33            preferred_compression_type: None,
34            preferred_compression_level: None,
35            preferred_encryption_type: Some(EncryptionType::XChaCha20Poly1305),
36        }
37    }
38
39    /// Creates a new server handshake definition, providing defaults for the compression types and
40    /// encryption types by including all known variants
41    pub fn server() -> Self {
42        Self::Server {
43            compression_types: CompressionType::known_variants().to_vec(),
44            encryption_types: EncryptionType::known_variants().to_vec(),
45        }
46    }
47
48    /// Returns true if handshake is from client-side
49    pub fn is_client(&self) -> bool {
50        matches!(self, Self::Client { .. })
51    }
52
53    /// Returns true if handshake is from server-side
54    pub fn is_server(&self) -> bool {
55        matches!(self, Self::Server { .. })
56    }
57}