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:
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