commit e1bdfa70090efc15c8592bca56beefde177121fa
parent ac4f31fdddeefbe04447fa9867b6083d2213a81f
Author: triesap <tyson@radroots.org>
Date: Tue, 7 Jul 2026 09:14:16 +0000
transport: add first-class proxy kind
- Add Proxy transport kind parsing and canonical labeling.
- Align Reticulum unavailable capability and receipt message copy.
- Cover proxy parsing and exact Reticulum unavailable output in tests.
- Validate with cargo fmt and focused transport tests.
Diffstat:
5 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/crates/transport/src/kind.rs b/crates/transport/src/kind.rs
@@ -8,6 +8,7 @@ pub enum RadrootsTransportKind {
Reticulum,
Mesh,
Local,
+ Proxy,
Custom(String),
}
@@ -19,6 +20,7 @@ impl RadrootsTransportKind {
"reticulum" => Ok(Self::Reticulum),
"mesh" => Ok(Self::Mesh),
"local" => Ok(Self::Local),
+ "proxy" => Ok(Self::Proxy),
_ => Self::custom(canonical),
}
}
@@ -44,6 +46,7 @@ impl RadrootsTransportKind {
Self::Reticulum => "reticulum".to_string(),
Self::Mesh => "mesh".to_string(),
Self::Local => "local".to_string(),
+ Self::Proxy => "proxy".to_string(),
Self::Custom(value) => value.clone(),
}
}
diff --git a/crates/transport/tests/transport.rs b/crates/transport/tests/transport.rs
@@ -49,10 +49,18 @@ fn transport_kind_parser_round_trips_canonical_labels_and_custom_values() {
RadrootsTransportKind::Local
);
assert_eq!(
+ RadrootsTransportKind::parse("PROXY").expect("proxy kind"),
+ RadrootsTransportKind::Proxy
+ );
+ assert_eq!(
RadrootsTransportKind::Local.canonical_label(),
"local".to_owned()
);
assert_eq!(
+ RadrootsTransportKind::Proxy.canonical_label(),
+ "proxy".to_owned()
+ );
+ assert_eq!(
RadrootsTransportKind::parse("fieldbus").expect("custom kind"),
RadrootsTransportKind::Custom("fieldbus".to_owned())
);
diff --git a/crates/transport_publish_protocol/src/lib.rs b/crates/transport_publish_protocol/src/lib.rs
@@ -527,7 +527,7 @@ impl TransportPublishCapabilities {
preview_behavior: Some(
TransportPublishPreviewBehavior::RejectDeliveryAttempts,
),
- message: "Reticulum preview is explicit and unavailable for real delivery"
+ message: "Reticulum transport is configured for future compatibility, but this build does not implement Reticulum delivery."
.to_owned(),
},
],
diff --git a/crates/transport_reticulum/src/lib.rs b/crates/transport_reticulum/src/lib.rs
@@ -18,8 +18,10 @@ const DEFAULT_PROFILE_ID: &str = "transport.reticulum.preview";
pub const RETICULUM_PREVIEW_ENDPOINT_URI: &str = "reticulum:preview-unavailable";
const UNAVAILABLE_CODE: &str = "transport_unavailable";
const DEFERRED_CODE: &str = "deferred_until_implemented";
-const PREVIEW_UNAVAILABLE_MESSAGE: &str =
- "Reticulum preview transport is configured but unavailable";
+pub const RETICULUM_PREVIEW_UNAVAILABLE_MESSAGE: &str = concat!(
+ "Reticulum transport is configured for future compatibility, ",
+ "but this build does not implement Reticulum delivery."
+);
const DEFERRED_MESSAGE: &str = "Reticulum preview delivery is deferred until implementation";
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -301,7 +303,9 @@ fn preview_outcome(behavior: RadrootsReticulumPreviewBehavior) -> RadrootsTransp
);
outcome.message = Some(
match behavior {
- RadrootsReticulumPreviewBehavior::RejectDeliveryAttempts => PREVIEW_UNAVAILABLE_MESSAGE,
+ RadrootsReticulumPreviewBehavior::RejectDeliveryAttempts => {
+ RETICULUM_PREVIEW_UNAVAILABLE_MESSAGE
+ }
RadrootsReticulumPreviewBehavior::DeferDeliveryPlans => DEFERRED_MESSAGE,
}
.to_owned(),
diff --git a/crates/transport_reticulum/tests/reticulum_preview.rs b/crates/transport_reticulum/tests/reticulum_preview.rs
@@ -149,6 +149,12 @@ fn reject_delivery_attempts_returns_unavailable_without_success_or_nostr_routing
target_receipt.outcome.code.as_deref(),
Some("transport_unavailable")
);
+ assert_eq!(
+ target_receipt.outcome.message.as_deref(),
+ Some(
+ "Reticulum transport is configured for future compatibility, but this build does not implement Reticulum delivery."
+ )
+ );
}
}