commit ad894de3982f245a838cb2512f36e7e4f3dbafb4
parent b42e6c6fe414c7ad15435c7c19e590f37a690b2d
Author: triesap <tyson@radroots.org>
Date: Thu, 9 Jul 2026 17:24:21 +0000
transport: allow explicit Reticulum preview scope
- add a direct ReticulumPreviewProfile scope setter
- cover explicit scope and inert agent endpoint serialization
Diffstat:
2 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/crates/sdk/src/transport.rs b/crates/sdk/src/transport.rs
@@ -361,6 +361,11 @@ impl ReticulumPreviewProfile {
self
}
+ pub fn with_scope(mut self, scope: MeshScopeId) -> Self {
+ self.scope = scope;
+ self
+ }
+
pub fn behavior(&self) -> ReticulumPreviewBehavior {
self.behavior
}
diff --git a/crates/sdk/tests/unit/transport_tests.rs b/crates/sdk/tests/unit/transport_tests.rs
@@ -1,6 +1,7 @@
use super::{
- NostrProfile, NostrRelayUrlPolicy, PublishMode, ReticulumPreviewBehavior,
- ReticulumPreviewProfile, SatisfactionPolicy, TargetPolicy, TargetSet, TransportProfile,
+ MeshScopeId, NostrProfile, NostrRelayUrlPolicy, PublishMode, ReticulumPreviewAgentEndpoint,
+ ReticulumPreviewBehavior, ReticulumPreviewProfile, SatisfactionPolicy, TargetPolicy, TargetSet,
+ TransportProfile,
};
use crate::{RadrootsSdkError, SDK_TRANSPORT_TARGET_MAX_COUNT};
use radroots_transport::{
@@ -237,6 +238,30 @@ fn reticulum_preview_profile_uses_canonical_endpoint_and_behavior_names() {
}
#[test]
+fn reticulum_preview_profile_preserves_explicit_scope_and_agent_endpoint() {
+ let profile = ReticulumPreviewProfile::preview_unavailable()
+ .with_scope(MeshScopeId::parse("farmers_market").expect("scope"))
+ .with_agent_endpoint(
+ ReticulumPreviewAgentEndpoint::parse("reticulum-agent:local").expect("agent endpoint"),
+ );
+
+ assert_eq!(profile.scope().as_str(), "farmers_market");
+ assert_eq!(
+ profile.agent_endpoint().expect("agent endpoint").as_str(),
+ "reticulum-agent:local"
+ );
+ assert_eq!(
+ serde_json::to_value(profile).expect("profile json"),
+ serde_json::json!({
+ "endpoint_uri": "reticulum:preview-unavailable",
+ "scope": "farmers_market",
+ "agent_endpoint": "reticulum-agent:local",
+ "behavior": "reject_delivery_attempts"
+ })
+ );
+}
+
+#[test]
fn explicit_target_sets_reject_noncanonical_reticulum_preview_endpoints() {
for invalid in [
" reticulum:preview-unavailable",