enigma_protocol/
attachment.rs

1use enigma_packet::{
2    AttachmentChunkMeta, AttachmentKind, AttachmentMeta, Message, MessageMeta, MessageType,
3};
4use uuid::Uuid;
5
6pub fn build_attachment_init(
7    sender: &str,
8    receiver: &str,
9    attachment_id: Uuid,
10    kind: AttachmentKind,
11    filename: Option<&str>,
12    content_type: Option<&str>,
13    total_size: u64,
14    chunk_size: u32,
15    chunk_count: u32,
16    timestamp_ms: u64,
17) -> Message {
18    let meta = AttachmentMeta {
19        attachment_id,
20        kind,
21        filename: filename.map(|s| s.to_string()),
22        content_type: content_type.map(|s| s.to_string()),
23        total_size,
24        chunk_size,
25        chunk_count,
26        sha256: None,
27        created_at_ms: Some(timestamp_ms),
28    };
29    Message {
30        id: Uuid::new_v4(),
31        sender: sender.to_string(),
32        receiver: receiver.to_string(),
33        timestamp_ms,
34        msg_type: MessageType::AttachmentInit,
35        payload: Vec::new(),
36        meta: MessageMeta::AttachmentInit(meta),
37    }
38}
39
40pub fn build_attachment_chunks(
41    sender: &str,
42    receiver: &str,
43    attachment_id: Uuid,
44    bytes: &[u8],
45    chunk_size: usize,
46    base_timestamp_ms: u64,
47) -> Vec<Message> {
48    if chunk_size == 0 {
49        return Vec::new();
50    }
51    let mut out = Vec::new();
52    let mut index: u32 = 0;
53    let mut offset: u64 = 0;
54    let mut ts = base_timestamp_ms;
55    for chunk in bytes.chunks(chunk_size) {
56        let meta = AttachmentChunkMeta {
57            attachment_id,
58            index,
59            offset,
60            chunk_size: chunk.len() as u32,
61            total_size: Some(bytes.len() as u64),
62        };
63        out.push(Message {
64            id: Uuid::new_v4(),
65            sender: sender.to_string(),
66            receiver: receiver.to_string(),
67            timestamp_ms: ts,
68            msg_type: MessageType::AttachmentChunk,
69            payload: chunk.to_vec(),
70            meta: MessageMeta::AttachmentChunk(meta),
71        });
72        index = index.saturating_add(1);
73        offset = offset.saturating_add(chunk.len() as u64);
74        ts = ts.saturating_add(1);
75    }
76    out
77}
78
79pub fn build_attachment_end(
80    sender: &str,
81    receiver: &str,
82    attachment_id: Uuid,
83    total_size: u64,
84    chunk_count: u32,
85    timestamp_ms: u64,
86) -> Message {
87    Message {
88        id: Uuid::new_v4(),
89        sender: sender.to_string(),
90        receiver: receiver.to_string(),
91        timestamp_ms,
92        msg_type: MessageType::AttachmentEnd,
93        payload: Vec::new(),
94        meta: MessageMeta::AttachmentEnd {
95            attachment_id,
96            sha256: None,
97            total_size,
98            chunk_count,
99        },
100    }
101}