commit 8f8eb36aaaea091bd4b7c9aa3bafdc005cfd34a5
parent 687aab080bfe0d79a13ef526c6f47b9e70cdbbe7
Author: triesap <tyson@radroots.org>
Date: Thu, 9 Jul 2026 05:04:27 +0000
transport: use shared reticulum preview message
Diffstat:
2 files changed, 39 insertions(+), 5 deletions(-)
diff --git a/src/core/transport_publish.rs b/src/core/transport_publish.rs
@@ -16,7 +16,10 @@ use radroots_nostr::prelude::{
RadrootsNostrClient, RadrootsNostrEventVerification, RadrootsNostrFilter, RadrootsNostrKind,
RadrootsNostrPublicKey, radroots_nostr_verify_event,
};
-use radroots_transport::{RadrootsTransportKind, RadrootsTransportSatisfactionPolicy};
+use radroots_transport::{
+ RADROOTS_RETICULUM_UNAVAILABLE_MESSAGE, RadrootsTransportKind,
+ RadrootsTransportSatisfactionPolicy,
+};
use radroots_transport_nostr::{
RadrootsNostrClientPublishAdapter, RadrootsRelayOutcome, RadrootsRelayOutcomeKind,
RadrootsRelayPublishAdapter, RadrootsRelayPublishRelayReceipt, RadrootsRelayPublishRequest,
@@ -2454,10 +2457,7 @@ fn reticulum_preview_outcome(target: &TransportPublishTarget) -> TransportPublis
source: TransportPublishTargetSource::ReticulumPreview,
attempted: false,
outcome_kind,
- message: Some(
- "reticulum transport is registered for preview but not routable by radrootsd"
- .to_owned(),
- ),
+ message: Some(RADROOTS_RETICULUM_UNAVAILABLE_MESSAGE.to_owned()),
latency_ms: None,
}
}
@@ -2886,6 +2886,7 @@ mod tests {
use radroots_nostr::prelude::{
RadrootsNostrEventVerification, RadrootsNostrTimestamp, radroots_nostr_build_event,
};
+ use radroots_transport::RADROOTS_RETICULUM_UNAVAILABLE_MESSAGE;
use radroots_transport_nostr::{RadrootsMockRelayPublishAdapter, RadrootsRelayOutcome};
use radroots_transport_publish_protocol::{
NostrPublishTargetSourcePolicy, SignedNostrEventWire, TransportPublishDeliveryPolicy,
@@ -4710,6 +4711,10 @@ mod tests {
response.job.targets[0].outcome_kind,
TransportPublishOutcomeKind::PreviewUnavailable
);
+ assert_eq!(
+ response.job.targets[0].message.as_deref(),
+ Some(RADROOTS_RETICULUM_UNAVAILABLE_MESSAGE)
+ );
assert!(!response.job.targets[0].attempted);
assert!(adapter.captured_raw_events().is_empty());
}
diff --git a/tests/source_boundary.rs b/tests/source_boundary.rs
@@ -240,6 +240,35 @@ fn transport_publish_capabilities_expose_per_transport_readiness() {
}
}
+#[test]
+fn transport_publish_reticulum_preview_outcomes_use_shared_unavailable_message() {
+ let daemon_source = read_source(
+ Path::new(env!("CARGO_MANIFEST_DIR"))
+ .join("src/core/transport_publish.rs")
+ .as_path(),
+ );
+ for required in [
+ "RADROOTS_RETICULUM_UNAVAILABLE_MESSAGE",
+ "message: Some(RADROOTS_RETICULUM_UNAVAILABLE_MESSAGE.to_owned())",
+ "publish_event_records_reticulum_preview_unavailable_as_terminal_nonfailure",
+ ] {
+ assert!(
+ daemon_source.contains(required),
+ "daemon Reticulum preview publish outcomes must retain shared unavailable-message witness `{required}`"
+ );
+ }
+
+ let retired_message = [
+ "reticulum transport is registered for preview",
+ "not routable by radrootsd",
+ ]
+ .join(" but ");
+ assert!(
+ !daemon_source.contains(retired_message.as_str()),
+ "daemon Reticulum preview publish outcomes must not revive local unavailable-message copy"
+ );
+}
+
fn rust_source_files(root: &Path) -> Vec<PathBuf> {
let mut paths = Vec::new();
collect_rust_source_files(root, &mut paths);