use crate::UnifiedAddress;
use bytes::Bytes;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, Clone)]
pub enum Encryption {
Plain,
Aes(#[serde(with = "crate::hex")] Bytes),
Blowfish(#[serde(with = "crate::hex")] Bytes),
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct HandshakeRequest {
pub authentication: String,
pub encryption: Encryption,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct HandshakeResponse {
pub encryption: Encryption,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub enum TunnelControlRequest {
Heartbeat(HeartbeatRequest),
TunnelInit(TunnelInitRequest),
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub enum TunnelControlResponse {
Heartbeat(HeartbeatResponse),
TunnelInit(TunnelInitResponse),
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct TunnelInitRequest {
pub destination_address: UnifiedAddress,
pub keep_alive: bool,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub enum TunnelInitFailureReason {
AuthenticateFail,
InitWithDestinationFail,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub enum TunnelInitResponse {
Success,
Failure(TunnelInitFailureReason),
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct HeartbeatRequest {
request_date_time: DateTime<Utc>,
}
impl HeartbeatRequest {
pub fn new() -> Self {
Self {
request_date_time: Utc::now(),
}
}
pub fn request_date_time(&self) -> &DateTime<Utc> {
&self.request_date_time
}
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct HeartbeatResponse {
response_date_time: DateTime<Utc>,
}
impl HeartbeatResponse {
pub fn new() -> Self {
Self {
response_date_time: Utc::now(),
}
}
pub fn response_date_time(&self) -> &DateTime<Utc> {
&self.response_date_time
}
}