lib

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

commit c613bec538cc83523f456b467d86496a9b2b83ac
parent 6c44c1ffbe37f5ac4c8c29c5624873c3adaa3d50
Author: triesap <tyson@radroots.org>
Date:   Tue,  7 Jul 2026 19:40:09 +0000

transport: own Reticulum unavailable message

- add shared transport-level Reticulum unavailable message constant
- consume the constant from Reticulum preview and publish protocol capabilities
- remove duplicate local unavailable message definitions from transport crates
- update source-boundary and preview tests for single message ownership

Diffstat:
Mcrates/transport/src/lib.rs | 2++
Acrates/transport/src/message.rs | 4++++
Mcrates/transport/tests/source_boundary.rs | 29++++++++++++++++++++++-------
Mcrates/transport_publish_protocol/src/lib.rs | 7++++---
Mcrates/transport_reticulum/src/lib.rs | 14+++++---------
Mcrates/transport_reticulum/tests/reticulum_preview.rs | 10++++------
6 files changed, 41 insertions(+), 25 deletions(-)

diff --git a/crates/transport/src/lib.rs b/crates/transport/src/lib.rs @@ -6,6 +6,7 @@ extern crate alloc; mod delivery; mod error; mod kind; +mod message; mod status; mod target; @@ -16,6 +17,7 @@ pub use delivery::{ }; pub use error::RadrootsTransportError; pub use kind::{RadrootsTransportImplementationState, RadrootsTransportKind}; +pub use message::RADROOTS_RETICULUM_UNAVAILABLE_MESSAGE; pub use status::{RadrootsTransportDeliveryTargetStatus, RadrootsTransportOutcome}; pub use target::{ RadrootsTransportTarget, RadrootsTransportTargetFingerprint, RadrootsTransportTargetSet, diff --git a/crates/transport/src/message.rs b/crates/transport/src/message.rs @@ -0,0 +1,4 @@ +pub const RADROOTS_RETICULUM_UNAVAILABLE_MESSAGE: &str = concat!( + "Reticulum transport is configured for future compatibility, ", + "but this build does not implement Reticulum delivery." +); diff --git a/crates/transport/tests/source_boundary.rs b/crates/transport/tests/source_boundary.rs @@ -137,27 +137,42 @@ fn transport_hardening_sources_keep_proxy_and_reticulum_message_contracts() { ); } - let reticulum_source = - read_source(crates_root.join("transport_reticulum/src/lib.rs").as_path()); + let transport_message_source = + read_source(crates_root.join("transport/src/message.rs").as_path()); for required in [ - "RETICULUM_PREVIEW_UNAVAILABLE_MESSAGE", + "RADROOTS_RETICULUM_UNAVAILABLE_MESSAGE", "Reticulum transport is configured for future compatibility, ", "but this build does not implement Reticulum delivery.", ] { assert!( - reticulum_source.contains(required), - "Reticulum preview source must retain unavailable message witness `{required}`" + transport_message_source.contains(required), + "transport message source must retain Reticulum unavailable message witness `{required}`" ); } + let reticulum_source = + read_source(crates_root.join("transport_reticulum/src/lib.rs").as_path()); + assert!( + reticulum_source.contains("RADROOTS_RETICULUM_UNAVAILABLE_MESSAGE"), + "Reticulum preview source must consume the shared unavailable message constant" + ); + assert!( + !reticulum_source.contains("Reticulum transport is configured for future compatibility, "), + "Reticulum preview source must not duplicate the shared unavailable message" + ); + let protocol_source = read_source( crates_root .join("transport_publish_protocol/src/lib.rs") .as_path(), ); assert!( - protocol_source.contains("Reticulum transport is configured for future compatibility, but this build does not implement Reticulum delivery."), - "transport publish capabilities must retain the approved Reticulum unavailable message" + protocol_source.contains("RADROOTS_RETICULUM_UNAVAILABLE_MESSAGE"), + "transport publish capabilities must consume the shared Reticulum unavailable message" + ); + assert!( + !protocol_source.contains("Reticulum transport is configured for future compatibility, "), + "transport publish protocol must not duplicate the shared unavailable message" ); } diff --git a/crates/transport_publish_protocol/src/lib.rs b/crates/transport_publish_protocol/src/lib.rs @@ -10,7 +10,9 @@ use alloc::{string::String, vec::Vec}; use std::{string::String, vec::Vec}; use core::fmt; -use radroots_transport::{RadrootsTransportError, RadrootsTransportKind}; +use radroots_transport::{ + RADROOTS_RETICULUM_UNAVAILABLE_MESSAGE, RadrootsTransportError, RadrootsTransportKind, +}; pub const API_VERSION: &str = "radrootsd.transport_publish.v2"; pub const DAEMON_NAME: &str = "radrootsd"; @@ -551,8 +553,7 @@ impl TransportPublishCapabilities { preview_behavior: Some( TransportPublishPreviewBehavior::RejectDeliveryAttempts, ), - message: "Reticulum transport is configured for future compatibility, but this build does not implement Reticulum delivery." - .to_owned(), + message: RADROOTS_RETICULUM_UNAVAILABLE_MESSAGE.to_owned(), }, ], }, diff --git a/crates/transport_reticulum/src/lib.rs b/crates/transport_reticulum/src/lib.rs @@ -8,20 +8,16 @@ use alloc::string::String; use alloc::vec::Vec; use core::fmt; use radroots_transport::{ - RadrootsTransportDeliveryReceipt, RadrootsTransportDeliveryRequest, - RadrootsTransportDeliveryTargetStatus, RadrootsTransportImplementationState, - RadrootsTransportKind, RadrootsTransportOutcome, RadrootsTransportTarget, - RadrootsTransportTargetReceipt, + RADROOTS_RETICULUM_UNAVAILABLE_MESSAGE, RadrootsTransportDeliveryReceipt, + RadrootsTransportDeliveryRequest, RadrootsTransportDeliveryTargetStatus, + RadrootsTransportImplementationState, RadrootsTransportKind, RadrootsTransportOutcome, + RadrootsTransportTarget, RadrootsTransportTargetReceipt, }; 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"; -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))] @@ -304,7 +300,7 @@ fn preview_outcome(behavior: RadrootsReticulumPreviewBehavior) -> RadrootsTransp outcome.message = Some( match behavior { RadrootsReticulumPreviewBehavior::RejectDeliveryAttempts => { - RETICULUM_PREVIEW_UNAVAILABLE_MESSAGE + RADROOTS_RETICULUM_UNAVAILABLE_MESSAGE } RadrootsReticulumPreviewBehavior::DeferDeliveryPlans => DEFERRED_MESSAGE, } diff --git a/crates/transport_reticulum/tests/reticulum_preview.rs b/crates/transport_reticulum/tests/reticulum_preview.rs @@ -1,7 +1,7 @@ use radroots_transport::{ - RadrootsTransportDeliveryRequest, RadrootsTransportDeliveryTargetStatus, - RadrootsTransportImplementationState, RadrootsTransportKind, - RadrootsTransportSatisfactionClass, RadrootsTransportSatisfactionPolicy, + RADROOTS_RETICULUM_UNAVAILABLE_MESSAGE, RadrootsTransportDeliveryRequest, + RadrootsTransportDeliveryTargetStatus, RadrootsTransportImplementationState, + RadrootsTransportKind, RadrootsTransportSatisfactionClass, RadrootsTransportSatisfactionPolicy, RadrootsTransportTarget, RadrootsTransportTargetSet, }; use radroots_transport_reticulum::{ @@ -151,9 +151,7 @@ fn reject_delivery_attempts_returns_unavailable_without_success_or_nostr_routing ); assert_eq!( target_receipt.outcome.message.as_deref(), - Some( - "Reticulum transport is configured for future compatibility, but this build does not implement Reticulum delivery." - ) + Some(RADROOTS_RETICULUM_UNAVAILABLE_MESSAGE) ); } }