lib

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

commit 6fd68043a2df78aa16cb7d9026f7e45cd8851b72
parent d962efe1c923cedc52ae9fff65bd9e615bef84b7
Author: triesap <tyson@radroots.org>
Date:   Thu,  9 Jul 2026 17:41:46 +0000

transport: align publish capability status contract

- bump transport publish capability API surface to v3
- expose transport, configured, implementation, and delivery usability fields
- model Nostr as real and Reticulum preview as unavailable
- verify transport publish protocol formatting, check, and tests

Diffstat:
Mcrates/transport_publish_protocol/src/lib.rs | 48++++++++++++++++++++++++------------------------
1 file changed, 24 insertions(+), 24 deletions(-)

diff --git a/crates/transport_publish_protocol/src/lib.rs b/crates/transport_publish_protocol/src/lib.rs @@ -16,7 +16,7 @@ use radroots_transport::{ RadrootsTransportTargetFingerprint, }; -pub const API_VERSION: &str = "radrootsd.transport_publish.v2"; +pub const API_VERSION: &str = "radrootsd.transport_publish.v3"; pub const DAEMON_NAME: &str = "radrootsd"; pub const METHOD_CAPABILITIES: &str = "transport.publish.capabilities"; pub const METHOD_EVENT: &str = "transport.publish.event"; @@ -726,7 +726,7 @@ pub struct TransportPublishCapabilities { } impl TransportPublishCapabilities { - pub fn v2(max_event_bytes: usize, max_targets_per_request: usize) -> Self { + pub fn v3(max_event_bytes: usize, max_targets_per_request: usize) -> Self { Self { daemon: DAEMON_NAME.to_owned(), api_version: API_VERSION.to_owned(), @@ -756,16 +756,17 @@ impl TransportPublishCapabilities { ], transports: vec![ TransportPublishTransportCapability { - transport_kind: "nostr".to_owned(), - implementation_state: TransportPublishImplementationState::Available, + transport: "nostr".to_owned(), + configured: true, + implementation: TransportPublishImplementation::Real, usable_for_delivery: true, preview_behavior: None, message: "Nostr relay publish is available".to_owned(), }, TransportPublishTransportCapability { - transport_kind: "reticulum".to_owned(), - implementation_state: - TransportPublishImplementationState::PreviewUnavailable, + transport: "reticulum".to_owned(), + configured: true, + implementation: TransportPublishImplementation::PreviewUnavailable, usable_for_delivery: false, preview_behavior: Some( TransportPublishPreviewBehavior::RejectDeliveryAttempts, @@ -801,10 +802,9 @@ pub struct TransportPublishSurfaceCapabilities { #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))] #[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub enum TransportPublishImplementationState { - Available, - Disabled, - Misconfigured, +pub enum TransportPublishImplementation { + Real, + Mock, PreviewUnavailable, } @@ -812,8 +812,9 @@ pub enum TransportPublishImplementationState { #[cfg_attr(feature = "serde", serde(deny_unknown_fields))] #[derive(Clone, Debug, PartialEq, Eq)] pub struct TransportPublishTransportCapability { - pub transport_kind: String, - pub implementation_state: TransportPublishImplementationState, + pub transport: String, + pub configured: bool, + pub implementation: TransportPublishImplementation, pub usable_for_delivery: bool, #[cfg_attr( feature = "serde", @@ -1145,10 +1146,10 @@ mod tests { } #[test] - fn transport_publish_capabilities_match_v2_surface() { - let capabilities = TransportPublishCapabilities::v2(1024, 10); + fn transport_publish_capabilities_match_v3_surface() { + let capabilities = TransportPublishCapabilities::v3(1024, 10); - assert_eq!(capabilities.api_version, "radrootsd.transport_publish.v2"); + assert_eq!(capabilities.api_version, "radrootsd.transport_publish.v3"); assert_eq!( capabilities.methods, vec![ @@ -1171,22 +1172,21 @@ mod tests { .publish .transports .iter() - .find(|transport| transport.transport_kind == "nostr") + .find(|transport| transport.transport == "nostr") .expect("nostr capability"); - assert_eq!( - nostr.implementation_state, - TransportPublishImplementationState::Available - ); + assert!(nostr.configured); + assert_eq!(nostr.implementation, TransportPublishImplementation::Real); assert!(nostr.usable_for_delivery); let reticulum = capabilities .publish .transports .iter() - .find(|transport| transport.transport_kind == "reticulum") + .find(|transport| transport.transport == "reticulum") .expect("reticulum capability"); + assert!(reticulum.configured); assert_eq!( - reticulum.implementation_state, - TransportPublishImplementationState::PreviewUnavailable + reticulum.implementation, + TransportPublishImplementation::PreviewUnavailable ); assert!(!reticulum.usable_for_delivery); assert_eq!(