lib

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

commit b3715d6f4460acbaffb69ee4fbb629bb877e7544
parent 6cbbe4045b8430bf9235973d8da7f7f8e71de1b5
Author: triesap <tyson@radroots.org>
Date:   Mon, 13 Apr 2026 03:45:26 +0000

sdk: scope config validation to transport

Diffstat:
Mcrates/sdk/src/client.rs | 10++++++++--
Mcrates/sdk/tests/client.rs | 21+++++++++++++++++++++
Mcrates/sdk/tests/relay_direct.rs | 16++--------------
3 files changed, 31 insertions(+), 16 deletions(-)

diff --git a/crates/sdk/src/client.rs b/crates/sdk/src/client.rs @@ -158,8 +158,14 @@ pub struct RadrootsSdkClient { impl RadrootsSdkClient { pub fn from_config(config: RadrootsSdkConfig) -> Result<Self, SdkConfigError> { - config.resolved_relay_urls()?; - config.resolved_radrootsd_endpoint()?; + match config.transport { + SdkTransportMode::RelayDirect => { + config.resolved_relay_urls()?; + } + SdkTransportMode::Radrootsd => { + config.resolved_radrootsd_endpoint()?; + } + } Ok(Self { config }) } diff --git a/crates/sdk/tests/client.rs b/crates/sdk/tests/client.rs @@ -111,6 +111,7 @@ fn client_default_config_uses_production_relay_direct() { #[test] fn client_rejects_invalid_config_on_construction() { let mut config = RadrootsSdkConfig::custom(); + config.transport = SdkTransportMode::RelayDirect; config.relay = RelayConfig { urls: vec!["https://radroots.org".into()], }; @@ -123,6 +124,26 @@ fn client_rejects_invalid_config_on_construction() { } #[test] +fn client_allows_custom_relay_without_radrootsd_endpoint() { + let mut config = RadrootsSdkConfig::custom(); + config.transport = SdkTransportMode::RelayDirect; + config.relay = RelayConfig { + urls: vec!["wss://radroots.org".into()], + }; + + RadrootsSdkClient::from_config(config).expect("relay-only sdk client"); +} + +#[test] +fn client_allows_custom_radrootsd_without_relay_urls() { + let mut config = RadrootsSdkConfig::custom(); + config.transport = SdkTransportMode::Radrootsd; + config.radrootsd.endpoint = Some("https://rpc.radroots.org/jsonrpc".into()); + + RadrootsSdkClient::from_config(config).expect("radrootsd-only sdk client"); +} + +#[test] fn namespace_clients_reflect_explicit_transport_mode() { let mut config = RadrootsSdkConfig::for_environment(SdkEnvironment::Production); config.transport = SdkTransportMode::Radrootsd; diff --git a/crates/sdk/tests/relay_direct.rs b/crates/sdk/tests/relay_direct.rs @@ -17,8 +17,8 @@ use radroots_sdk::listing::{ RadrootsListingProduct, RadrootsListingStatus, }; use radroots_sdk::{ - RadrootsSdkClient, RadrootsSdkConfig, RadrootsdAuth, RadrootsdConfig, RelayConfig, - SdkEnvironment, SdkPublishError, SdkTransportMode, SdkTransportReceipt, SignerConfig, + RadrootsSdkClient, RadrootsSdkConfig, RelayConfig, SdkEnvironment, SdkPublishError, + SdkTransportMode, SdkTransportReceipt, SignerConfig, }; use tokio::net::TcpListener; use tokio::sync::oneshot; @@ -170,10 +170,6 @@ async fn relay_direct_listing_publish_accepts_sdk_built_draft() -> TestResult<() config.relay = RelayConfig { urls: vec![relay.url().to_owned()], }; - config.radrootsd = RadrootsdConfig { - endpoint: Some("https://rpc.radroots.org/jsonrpc".into()), - auth: RadrootsdAuth::None, - }; let client = RadrootsSdkClient::from_config(config)?; let draft = client.listing().build_draft(&sample_listing())?; @@ -234,10 +230,6 @@ async fn relay_direct_publish_rejects_draft_only_signer_mode() -> TestResult<()> config.relay = RelayConfig { urls: vec![relay.url().to_owned()], }; - config.radrootsd = RadrootsdConfig { - endpoint: Some("https://rpc.radroots.org/jsonrpc".into()), - auth: RadrootsdAuth::None, - }; let client = RadrootsSdkClient::from_config(config)?; let error = client @@ -269,10 +261,6 @@ async fn relay_direct_publish_rejects_nip46_signer_mode() -> TestResult<()> { config.relay = RelayConfig { urls: vec![relay.url().to_owned()], }; - config.radrootsd = RadrootsdConfig { - endpoint: Some("https://rpc.radroots.org/jsonrpc".into()), - auth: RadrootsdAuth::None, - }; let client = RadrootsSdkClient::from_config(config)?; let error = client