lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README

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:
Mcrates/transport/src/kind.rs | 3+++
Mcrates/transport/tests/transport.rs | 8++++++++
Mcrates/transport_publish_protocol/src/lib.rs | 2+-
Mcrates/transport_reticulum/src/lib.rs | 10+++++++---
Mcrates/transport_reticulum/tests/reticulum_preview.rs | 6++++++
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." + ) + ); } }