use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum MessageType {
Text,
Voice,
Image,
Video,
File,
CallOffer,
CallAnswer,
CallHangup,
GroupInvite,
AttachmentInit,
AttachmentChunk,
AttachmentEnd,
AttachmentAbort,
AttachmentAck,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum AttachmentKind {
File,
Image,
Video,
Voice,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AttachmentMeta {
pub attachment_id: Uuid,
pub kind: AttachmentKind,
pub filename: Option<String>,
pub content_type: Option<String>,
pub total_size: u64,
pub chunk_size: u32,
pub chunk_count: u32,
pub sha256: Option<[u8; 32]>,
pub created_at_ms: Option<u64>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AttachmentChunkMeta {
pub attachment_id: Uuid,
pub index: u32,
pub offset: u64,
pub chunk_size: u32,
pub total_size: Option<u64>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AttachmentAckMeta {
pub attachment_id: Uuid,
pub received_up_to_index: Option<u32>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum MessageMeta {
None,
Basic {
content_type: Option<String>,
},
AttachmentInit(AttachmentMeta),
AttachmentChunk(AttachmentChunkMeta),
AttachmentEnd {
attachment_id: Uuid,
sha256: Option<[u8; 32]>,
total_size: u64,
chunk_count: u32,
},
AttachmentAbort {
attachment_id: Uuid,
reason: Option<String>,
},
AttachmentAck(AttachmentAckMeta),
}
impl Default for MessageMeta {
fn default() -> Self {
MessageMeta::None
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Message {
pub id: Uuid,
pub sender: String,
pub receiver: String,
pub timestamp_ms: u64,
pub msg_type: MessageType,
pub payload: Vec<u8>,
pub meta: MessageMeta,
}