enigma_relay/
model.rs

1use serde::{Deserialize, Serialize};
2use uuid::Uuid;
3
4#[derive(Clone, Serialize, Deserialize, Debug)]
5pub struct MessageMeta {
6    pub kind: String,
7    pub total_len: u64,
8    pub chunk_index: u32,
9    pub chunk_count: u32,
10    pub sent_ms: u64,
11}
12
13#[derive(Clone, Serialize, Deserialize, Debug)]
14pub struct PushRequest {
15    pub recipient: String,
16    pub message_id: Uuid,
17    pub ciphertext_b64: String,
18    pub meta: MessageMeta,
19}
20
21#[derive(Clone, Serialize, Deserialize, Debug)]
22pub struct PushResponse {
23    pub stored: bool,
24    #[serde(default, skip_serializing_if = "is_false")]
25    pub duplicate: bool,
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub queue_len: Option<u64>,
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub queue_bytes: Option<u64>,
30}
31
32#[derive(Clone, Serialize, Deserialize, Debug)]
33pub struct PullRequest {
34    pub recipient: String,
35    pub cursor: Option<String>,
36    pub max: Option<u64>,
37}
38
39#[derive(Clone, Serialize, Deserialize, Debug)]
40pub struct DeliveryItem {
41    pub recipient: String,
42    pub message_id: Uuid,
43    pub ciphertext_b64: String,
44    pub meta: MessageMeta,
45    pub arrival_ms: u64,
46    pub deadline_ms: u64,
47}
48
49#[derive(Clone, Serialize, Deserialize, Debug)]
50pub struct PullResponse {
51    pub items: Vec<DeliveryItem>,
52    pub next_cursor: Option<String>,
53    pub remaining_estimate: u64,
54}
55
56#[derive(Clone, Serialize, Deserialize, Debug, Eq, PartialEq, Hash)]
57pub struct AckEntry {
58    pub message_id: Uuid,
59    pub chunk_index: u32,
60}
61
62#[derive(Clone, Serialize, Deserialize, Debug)]
63pub struct AckRequest {
64    pub recipient: String,
65    pub ack: Vec<AckEntry>,
66}
67
68#[derive(Clone, Serialize, Deserialize, Debug)]
69pub struct AckResponse {
70    pub deleted: u64,
71    pub missing: u64,
72    pub remaining: u64,
73}
74
75fn is_false(value: &bool) -> bool {
76    !*value
77}