lib

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

commit e3210f132d41fd82dabad79cecb9634cda9ad09c
parent 8f77ddd88a6bb1aab96fc63cb8cc1fc864435ee5
Author: triesap <tyson@radroots.org>
Date:   Tue,  7 Jul 2026 05:35:18 +0000

transport: normalize Reticulum preview identity

- use reticulum:preview-unavailable for first-party preview defaults and positive fixtures
- update runtime Reticulum preview tests for preview_unavailable outcomes
- align runtime worker deferred targets with shared transport statuses
- validate expanded transport, runtime, outbox, and publish-protocol lanes

Diffstat:
Mcrates/outbox/src/store.rs | 2+-
Mcrates/runtime/src/transport.rs | 35++++++++++++++++++++++-------------
Mcrates/transport/tests/transport.rs | 8+++++---
Mcrates/transport_publish_protocol/src/lib.rs | 6+++---
Mcrates/transport_reticulum/tests/reticulum_preview.rs | 6+++---
5 files changed, 34 insertions(+), 23 deletions(-)

diff --git a/crates/outbox/src/store.rs b/crates/outbox/src/store.rs @@ -2265,7 +2265,7 @@ mod tests { "transport.reticulum.preview", 1, RadrootsTransportSatisfactionPolicy::all_accepted(), - vec![reticulum_target("reticulum:preview-target")], + vec![reticulum_target("reticulum:preview-unavailable")], ), true, 1_007, diff --git a/crates/runtime/src/transport.rs b/crates/runtime/src/transport.rs @@ -292,13 +292,12 @@ impl RadrootsRuntimeDeliveryTarget { Self { delivery_target_id, target, - status: RadrootsTransportDeliveryTargetStatus::Deferred, + status: RadrootsTransportDeliveryTargetStatus::DeferredUntilImplemented, } } pub fn is_ready_for_attempt(&self) -> bool { - self.status == RadrootsTransportDeliveryTargetStatus::Pending - || self.status == RadrootsTransportDeliveryTargetStatus::Failed + self.status.is_ready_for_attempt() } } @@ -522,8 +521,9 @@ mod tests { use radroots_events::draft::{RadrootsSignedNostrEvent, RadrootsSignedNostrEventParts}; use radroots_transport::{ RadrootsTransportDeliveryReceipt, RadrootsTransportDeliveryTargetStatus, - RadrootsTransportKind, RadrootsTransportOutcome, RadrootsTransportSatisfactionPolicy, - RadrootsTransportTarget, RadrootsTransportTargetReceipt, + RadrootsTransportKind, RadrootsTransportOutcome, RadrootsTransportSatisfactionClass, + RadrootsTransportSatisfactionPolicy, RadrootsTransportTarget, + RadrootsTransportTargetReceipt, }; struct StaticAdapter { @@ -630,7 +630,7 @@ mod tests { "nostr-delivery", RadrootsRuntimeTransportPayload::DigestOnly("sha256:event".to_owned()), vec![target(RadrootsTransportKind::Nostr, "wss://relay.example")], - RadrootsTransportSatisfactionPolicy::AnyTarget, + RadrootsTransportSatisfactionPolicy::any_accepted(), 1_000, ) .expect("request"), @@ -638,7 +638,10 @@ mod tests { .await .expect("receipt"); - assert_eq!(receipt.satisfied_target_count(), 1); + assert_eq!( + receipt.satisfied_target_count(RadrootsTransportSatisfactionClass::Accepted), + 1 + ); assert_eq!( receipt.target_receipts[0].status, RadrootsTransportDeliveryTargetStatus::Accepted @@ -662,9 +665,9 @@ mod tests { RadrootsRuntimeTransportPayload::DigestOnly("sha256:event".to_owned()), vec![target( RadrootsTransportKind::Reticulum, - "reticulum:preview", + "reticulum:preview-unavailable", )], - RadrootsTransportSatisfactionPolicy::AnyTarget, + RadrootsTransportSatisfactionPolicy::any_accepted(), 1_000, ) .expect("request"), @@ -672,10 +675,13 @@ mod tests { .await .expect("receipt"); - assert_eq!(receipt.satisfied_target_count(), 0); + assert_eq!( + receipt.satisfied_target_count(RadrootsTransportSatisfactionClass::Accepted), + 0 + ); assert_eq!( receipt.target_receipts[0].status, - RadrootsTransportDeliveryTargetStatus::Unavailable + RadrootsTransportDeliveryTargetStatus::PreviewUnavailable ); } @@ -716,7 +722,10 @@ mod tests { ); let deferred = RadrootsRuntimeDeliveryTarget::deferred_until_implemented( 2, - target(RadrootsTransportKind::Reticulum, "reticulum:preview"), + target( + RadrootsTransportKind::Reticulum, + "reticulum:preview-unavailable", + ), ); let receipt = worker .execute_job(RadrootsRuntimeDeliveryJob { @@ -724,7 +733,7 @@ mod tests { payload: RadrootsRuntimeTransportPayload::DigestOnly("sha256:event".to_owned()), plans: vec![RadrootsRuntimeDeliveryPlan { delivery_plan_id: 7, - satisfaction_policy: RadrootsTransportSatisfactionPolicy::AnyTarget, + satisfaction_policy: RadrootsTransportSatisfactionPolicy::any_accepted(), targets: vec![ready, deferred], }], now_ms: 1_000, diff --git a/crates/transport/tests/transport.rs b/crates/transport/tests/transport.rs @@ -109,9 +109,11 @@ fn satisfaction_policy_counts_target_statuses() { #[test] fn deferred_transport_outcomes_are_terminal_but_not_satisfied() { - let target = - RadrootsTransportTarget::new(RadrootsTransportKind::Reticulum, "reticulum:preview") - .expect("target"); + let target = RadrootsTransportTarget::new( + RadrootsTransportKind::Reticulum, + "reticulum:preview-unavailable", + ) + .expect("target"); let receipt = RadrootsTransportDeliveryReceipt { request_id: "reticulum-preview".to_owned(), target_receipts: vec![RadrootsTransportTargetReceipt::new( diff --git a/crates/transport_publish_protocol/src/lib.rs b/crates/transport_publish_protocol/src/lib.rs @@ -629,7 +629,7 @@ mod tests { too_many.target_policy = TransportPublishTargetPolicy::explicit_targets(vec![ TransportPublishTarget::nostr("wss://relay.example.com"), TransportPublishTarget::reticulum_preview( - "reticulum:preview", + "reticulum:preview-unavailable", TransportPublishPreviewBehavior::RejectDeliveryAttempts, ), ]); @@ -707,7 +707,7 @@ mod tests { event: event(), target_policy: TransportPublishTargetPolicy::explicit_targets(vec![ TransportPublishTarget::reticulum_preview( - "reticulum:preview", + "reticulum:preview-unavailable", TransportPublishPreviewBehavior::DeferDeliveryPlans, ), ]), @@ -832,7 +832,7 @@ mod tests { let explicit = TransportPublishTargetPolicy::explicit_targets(vec![ TransportPublishTarget::nostr("wss://relay.example"), TransportPublishTarget::reticulum_preview( - "reticulum:preview", + "reticulum:preview-unavailable", TransportPublishPreviewBehavior::DeferDeliveryPlans, ), ]); diff --git a/crates/transport_reticulum/tests/reticulum_preview.rs b/crates/transport_reticulum/tests/reticulum_preview.rs @@ -120,8 +120,8 @@ fn endpoint_and_profile_validation_are_strict_and_canonical() { fn reject_delivery_attempts_returns_unavailable_without_success_or_nostr_routing() { let transport = RadrootsReticulumPreviewTransport::default(); let request = delivery_request(vec![ - reticulum_target("reticulum:preview-a"), - reticulum_target("reticulum:preview-b"), + reticulum_target("reticulum:preview-unavailable"), + reticulum_target("reticulum:preview-unavailable-alt"), ]); let receipt = transport.deliver(request).expect("delivery receipt"); @@ -149,7 +149,7 @@ fn deferred_delivery_plan_mode_never_counts_as_satisfied() { RadrootsReticulumPreviewProfile::default() .with_behavior(RadrootsReticulumPreviewBehavior::DeferDeliveryPlans), ); - let request = delivery_request(vec![reticulum_target("reticulum:preview-deferred")]); + let request = delivery_request(vec![reticulum_target("reticulum:preview-unavailable")]); let receipt = transport.deliver(request).expect("delivery receipt"); assert_eq!(receipt.target_receipts.len(), 1);