Skip to main content

offline_protocol_services/
payloads.rs

1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4/// TTL for deduplicating service discovery queries (seconds).
5pub const DISCOVERY_QUERY_DEDUP_TTL_SECS: u64 = 60;
6/// Default maximum hops for service discovery query gossip forwarding.
7pub const DISCOVERY_QUERY_DEFAULT_MAX_HOPS: u8 = 10;
8/// Maximum number of peers to forward a discovery query to per hop.
9pub const DISCOVERY_GOSSIP_MAX_FANOUT: usize = 5;
10/// Maximum number of peers the originator broadcasts an initial discovery query to.
11pub const DISCOVERY_INITIAL_BROADCAST_MAX: usize = 20;
12/// Maximum number of seen discovery query IDs to track for dedup.
13pub const DISCOVERY_QUERY_MAX_DEDUP_ENTRIES: usize = 10_000;
14
15/// Maximum allowed size (bytes) for the raw payload string after stripping the prefix.
16pub const MAX_SERVICE_PAYLOAD_SIZE: usize = 131_072; // 128 KB
17/// Maximum allowed size (bytes) for a service request/response body field.
18pub const MAX_SERVICE_BODY_SIZE: usize = 65_536; // 64 KB
19/// Maximum allowed length for a service request method field.
20pub const MAX_SERVICE_METHOD_LEN: usize = 256;
21
22/// Valid values for service response status.
23pub const VALID_SERVICE_STATUSES: &[&str] = &["ok", "not_found", "error"];
24
25/// Common prefix shared by all service message types.
26pub const SVC_MESSAGE_PREFIX: &str = "__SVC_";
27/// Prefix for service discovery query.
28pub const SVC_DISCOVER_QUERY: &str = "__SVC_DISC_Q__";
29/// Prefix for service discovery response.
30pub const SVC_DISCOVER_RESPONSE: &str = "__SVC_DISC_R__";
31/// Prefix for service request.
32pub const SVC_REQUEST: &str = "__SVC_REQ__";
33/// Prefix for service response.
34pub const SVC_RESPONSE: &str = "__SVC_RESP__";
35
36fn default_discovery_max_hops() -> u8 {
37    DISCOVERY_QUERY_DEFAULT_MAX_HOPS
38}
39
40/// Wire-format payload for a service discovery query.
41#[derive(Debug, Clone, Serialize, Deserialize)]
42pub(crate) struct ServiceDiscoveryQueryPayload {
43    pub query_id: String,
44    pub originator: String,
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub service_id: Option<String>,
47    #[serde(default = "default_discovery_max_hops")]
48    pub remaining_hops: u8,
49}
50
51/// Wire-format payload for a service discovery response.
52#[derive(Debug, Clone, Serialize, Deserialize)]
53pub(crate) struct ServiceDiscoveryResponsePayload {
54    pub query_id: String,
55    pub service_id: String,
56    pub version: String,
57    pub provider_peer_id: String,
58    pub capabilities: HashMap<String, String>,
59    pub hop_count: u8,
60    /// The original query originator — used for multi-hop response routing.
61    #[serde(default)]
62    pub originator: String,
63}
64
65/// Wire-format payload for a service request.
66#[derive(Debug, Clone, Serialize, Deserialize)]
67pub(crate) struct ServiceRequestPayload {
68    pub request_id: String,
69    pub service_id: String,
70    pub method: String,
71    pub body: String,
72}
73
74/// Wire-format payload for a service response.
75#[derive(Debug, Clone, Serialize, Deserialize)]
76pub(crate) struct ServiceResponsePayload {
77    pub request_id: String,
78    pub service_id: String,
79    pub status: String,
80    pub body: String,
81}