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:
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)
);
}
}