enigma_protocol/
attachment.rs1use 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}