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}