use serde::{Deserialize, Serialize};
pub const DEFAULT_CHUNK_SIZE: usize = 32768;
pub const MAX_TRANSFER_SIZE: u64 = 1_073_741_824;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileOffer {
pub transfer_id: String,
pub filename: String,
pub size: u64,
pub sha256: String,
pub chunk_size: usize,
pub total_chunks: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileChunk {
pub transfer_id: String,
pub sequence: u64,
pub data: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileComplete {
pub transfer_id: String,
pub sha256: String,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub enum TransferDirection {
Sending,
Receiving,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub enum TransferStatus {
Pending,
InProgress,
Complete,
Failed,
Rejected,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TransferState {
pub transfer_id: String,
pub direction: TransferDirection,
pub remote_agent_id: String,
pub filename: String,
pub total_size: u64,
pub bytes_transferred: u64,
pub status: TransferStatus,
pub sha256: String,
pub error: Option<String>,
pub started_at: u64,
#[serde(default)]
pub started_at_unix_ms: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub completed_at_unix_ms: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub source_path: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output_path: Option<String>,
#[serde(default = "default_chunk_size")]
pub chunk_size: usize,
#[serde(default)]
pub total_chunks: u64,
}
fn default_chunk_size() -> usize {
DEFAULT_CHUNK_SIZE
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum FileMessage {
#[serde(rename = "file-offer")]
Offer(FileOffer),
#[serde(rename = "file-chunk")]
Chunk(FileChunk),
#[serde(rename = "file-complete")]
Complete(FileComplete),
#[serde(rename = "file-accept")]
Accept {
transfer_id: String,
},
#[serde(rename = "file-reject")]
Reject {
transfer_id: String,
reason: String,
},
}