sdk

Radroots SDK and bindings
git clone https://radroots.dev/git/sdk.git
Log | Files | Refs | README

commit c359ef395697769fa7806e77454f7f2a7b122aa9
parent c54c08d1a494d854f002c5abcee3d0e9cb5d1da1
Author: triesap <tyson@radroots.org>
Date:   Sat, 11 Jul 2026 08:01:18 +0000

sdk: route Nostr push through transport facade

- replace SDK adapter-shaped push helper with generic transport dispatch
- route Nostr product push through RadrootsNostrTransport
- update examples, README, and tests for transport-shaped sync
- preserve scoped target receipts, URL policy, and retry semantics

Diffstat:
Mcrates/sdk/README | 6+++---
Mcrates/sdk/examples/sdk_v1_local_enqueue_and_mock_sync.rs | 5+++--
Mcrates/sdk/src/sync_runtime.rs | 17+++++++++--------
Mcrates/sdk/tests/farms_runtime.rs | 12+++++++++---
Mcrates/sdk/tests/listings_runtime.rs | 7+++++--
Mcrates/sdk/tests/orders_runtime.rs | 5++++-
Mcrates/sdk/tests/runtime_foundation.rs | 2+-
Mcrates/sdk/tests/source_boundary.rs | 2+-
Mcrates/sdk/tests/sync_runtime.rs | 116++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------
Mcrates/sdk/tests/unit/sync_runtime_tests.rs | 20+++++++++++++-------
10 files changed, 124 insertions(+), 68 deletions(-)

diff --git a/crates/sdk/README b/crates/sdk/README @@ -42,8 +42,8 @@ queued outbox event, so already queued work does not require a configured builde preview work reports explicit preview-unavailable or deferred receipt state with zero network attempts; it does not deliver and does not fall back to another transport. Nostr transport publishing and the `radrootsd-proxy` Publish Proxy transport consume signed outbox events; neither transport -owns signing. `push_outbox_with_adapter(...)` remains available for tests and controlled -adapter-level substrate checks. `radrootsd-proxy` adds daemon-resolved publishing through +owns signing. `push_outbox_with_transport(...)` remains available for tests and controlled +transport-level substrate checks. `radrootsd-proxy` adds daemon-resolved publishing through `publish.event`. `sdk.trades()` exposes the local trade runtime surface. With `runtime`, callers can ingest local trade @@ -98,7 +98,7 @@ cargo check -p radroots_sdk --example sdk_v1_myc_nip46_signer_setup --features r preparation, signed-event verification, decoded event matching, and manifest hash access without local runtime storage. `sdk_v1_local_enqueue_and_mock_sync` shows localhost Nostr target selection, configured local-key -signing, prepared listing enqueue, `push_outbox_with_adapter(...)` with a mock relay adapter, and +signing, prepared listing enqueue, `push_outbox_with_transport(...)` with a Nostr transport facade, and `TradeStatusRequest`. `sdk_v1_myc_nip46_signer_setup` shows Myc NIP-46 signer provider setup and product permission derivation at the SDK boundary. The examples stay on product APIs and do not use wire-event internals. diff --git a/crates/sdk/examples/sdk_v1_local_enqueue_and_mock_sync.rs b/crates/sdk/examples/sdk_v1_local_enqueue_and_mock_sync.rs @@ -13,7 +13,7 @@ use radroots_sdk::{ RadrootsSdkLocalKeySigner, RadrootsSdkSignerProvider, RadrootsSdkTimestamp, SdkIdempotencyKey, TargetPolicy, TargetSet, TradeStatusRequest, }; -use radroots_transport_nostr::RadrootsMockRelayPublishAdapter; +use radroots_transport_nostr::{RadrootsMockRelayPublishAdapter, RadrootsNostrTransport}; const LOCAL_RELAY: &str = "ws://localhost:7777"; @@ -47,9 +47,10 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> { ) .await?; let adapter = RadrootsMockRelayPublishAdapter::new(); + let transport = RadrootsNostrTransport::new(&adapter); let push = sdk .sync() - .push_outbox_with_adapter(&adapter, PushOutboxRequest::new().with_limit(1)) + .push_outbox_with_transport(&transport, PushOutboxRequest::new().with_limit(1)) .await?; let order_status = sdk .trades() diff --git a/crates/sdk/src/sync_runtime.rs b/crates/sdk/src/sync_runtime.rs @@ -42,11 +42,11 @@ use radroots_transport::{ #[cfg(all(feature = "runtime", feature = "radrootsd-proxy"))] use radroots_transport::{RadrootsTransportSatisfactionClass, RadrootsTransportSatisfactionPolicy}; #[cfg(all(feature = "runtime", feature = "transport-nostr-runtime"))] -use radroots_transport_nostr::RadrootsNostrClientPublishAdapter; +use radroots_transport_nostr::{RadrootsNostrClientPublishAdapter, RadrootsNostrTransport}; #[cfg(feature = "runtime")] use radroots_transport_nostr::{ RadrootsOutboxPublishPolicy, RadrootsOutboxPublishReceipt, RadrootsOutboxPublishTargetReceipt, - RadrootsRelayOutcomeKind, RadrootsRelayPublishAdapter, publish_claimed_outbox_event, + RadrootsRelayOutcomeKind, publish_claimed_outbox_event_with_transport, }; #[cfg(all(feature = "runtime", feature = "radrootsd-proxy"))] use radroots_transport_publish_protocol::{ @@ -712,7 +712,8 @@ impl<'sdk> SyncClient<'sdk> { let adapter = RadrootsNostrClientPublishAdapter::new( RadrootsNostrClient::new_signerless(), ); - self.push_outbox_with_adapter(&adapter, request).await + let transport = RadrootsNostrTransport::new(adapter); + self.push_outbox_with_transport(&transport, request).await } #[cfg(not(feature = "transport-nostr-runtime"))] @@ -779,13 +780,13 @@ impl<'sdk> SyncClient<'sdk> { Ok(summary.ready_signed_events == 0) } - pub async fn push_outbox_with_adapter<A>( + pub async fn push_outbox_with_transport<T>( &self, - adapter: &A, + transport: &T, request: PushOutboxRequest, ) -> Result<PushOutboxReceipt, RadrootsSdkError> where - A: RadrootsRelayPublishAdapter, + T: radroots_transport::RadrootsTransport + ?Sized, { request.validate()?; let recovery_now_ms = sdk_now_ms(self.sdk)?; @@ -814,10 +815,10 @@ impl<'sdk> SyncClient<'sdk> { ) .republish_accepted_relays(request.republish_accepted_targets) .relay_url_policy(request.nostr_relay_url_policy.nostr_transport_policy()); - let publish = publish_claimed_outbox_event( + let publish = publish_claimed_outbox_event_with_transport( &self.sdk._outbox, &self.sdk._event_store, - adapter, + transport, &claimed, policy, publish_now_ms, diff --git a/crates/sdk/tests/farms_runtime.rs b/crates/sdk/tests/farms_runtime.rs @@ -27,7 +27,7 @@ use radroots_sdk::{ SdkMutationState, SdkPublicLocality, StorageStatusRequest, TargetPolicy, TargetSet, TransportProfile, }; -use radroots_transport_nostr::RadrootsMockRelayPublishAdapter; +use radroots_transport_nostr::{RadrootsMockRelayPublishAdapter, RadrootsNostrTransport}; use sqlx::sqlite::{SqliteConnectOptions, SqlitePoolOptions}; #[path = "support/serializer_failure.rs"] @@ -807,7 +807,10 @@ async fn farm_enqueue_publish_pushes_queued_event_with_mock_relay_sync() { let push_receipt = sdk .sync() - .push_outbox_with_adapter(&adapter, PushOutboxRequest::new().with_limit(1)) + .push_outbox_with_transport( + &RadrootsNostrTransport::new(&adapter), + PushOutboxRequest::new().with_limit(1), + ) .await .expect("push"); @@ -864,7 +867,10 @@ async fn farm_hybrid_profile_publishes_after_nostr_success_and_retains_reticulum let push_receipt = sdk .sync() - .push_outbox_with_adapter(&adapter, PushOutboxRequest::new().with_limit(1)) + .push_outbox_with_transport( + &RadrootsNostrTransport::new(&adapter), + PushOutboxRequest::new().with_limit(1), + ) .await .expect("push"); diff --git a/crates/sdk/tests/listings_runtime.rs b/crates/sdk/tests/listings_runtime.rs @@ -28,7 +28,7 @@ use radroots_sdk::{ SdkMutationState, TargetPolicy, TargetSet, TransportProfile, }; use radroots_trade::listing::RadrootsListingDraftDocumentV1; -use radroots_transport_nostr::RadrootsMockRelayPublishAdapter; +use radroots_transport_nostr::{RadrootsMockRelayPublishAdapter, RadrootsNostrTransport}; #[path = "support/serializer_failure.rs"] mod serializer_failure; @@ -832,7 +832,10 @@ async fn listing_hybrid_profile_publishes_after_nostr_success_and_retains_reticu let push_receipt = sdk .sync() - .push_outbox_with_adapter(&adapter, PushOutboxRequest::new().with_limit(1)) + .push_outbox_with_transport( + &RadrootsNostrTransport::new(&adapter), + PushOutboxRequest::new().with_limit(1), + ) .await .expect("push"); diff --git a/crates/sdk/tests/orders_runtime.rs b/crates/sdk/tests/orders_runtime.rs @@ -3485,7 +3485,10 @@ async fn order_submit_enqueue_pushes_queued_event_with_mock_relay_sync() { let push_receipt = sdk .sync() - .push_outbox_with_adapter(&adapter, PushOutboxRequest::new().with_limit(1)) + .push_outbox_with_transport( + &RadrootsNostrTransport::new(&adapter), + PushOutboxRequest::new().with_limit(1), + ) .await .expect("push"); diff --git a/crates/sdk/tests/runtime_foundation.rs b/crates/sdk/tests/runtime_foundation.rs @@ -1067,7 +1067,7 @@ fn sdk_examples_stay_on_product_api_boundary() { assert!(local_enqueue.contains("RadrootsSdkSignerProvider::LocalKey")); assert!(local_enqueue.contains("enqueue_prepared_publish")); assert!(!local_enqueue.contains("enqueue_prepared_publish_with_explicit_signer")); - assert!(local_enqueue.contains("push_outbox_with_adapter")); + assert!(local_enqueue.contains("push_outbox_with_transport")); assert!(local_enqueue.contains("TradeStatusRequest")); let myc_setup = include_str!("../examples/sdk_v1_myc_nip46_signer_setup.rs"); diff --git a/crates/sdk/tests/source_boundary.rs b/crates/sdk/tests/source_boundary.rs @@ -1747,7 +1747,7 @@ fn sdk_direct_nostr_push_receipts_preserve_outbox_target_metadata() { let sync_runtime_test_source = read_source(manifest_dir.join("tests/sync_runtime.rs").as_path()); for required in [ - "push_outbox_with_adapter_preserves_scoped_duplicate_target_metadata", + "push_outbox_with_transport_preserves_scoped_duplicate_target_metadata", "push_outbox_adapter_transport_failure_preserves_scoped_target_metadata", "target.target_scope.as_deref() == Some(\"farm.a\")", "target.target_scope.as_deref() == Some(\"farm.b\")", diff --git a/crates/sdk/tests/sync_runtime.rs b/crates/sdk/tests/sync_runtime.rs @@ -38,8 +38,9 @@ use radroots_transport::{ RadrootsTransportSatisfactionPolicy, RadrootsTransportTarget, RadrootsTransportTargetLabel, }; use radroots_transport_nostr::{ - RadrootsMockRelayPublishAdapter, RadrootsRelayOutcome, RadrootsRelayPublishAdapter, - RadrootsRelayPublishRelayReceipt, RadrootsRelayPublishRequest, RadrootsRelayTransportError, + RadrootsMockRelayPublishAdapter, RadrootsNostrTransport, RadrootsRelayOutcome, + RadrootsRelayPublishAdapter, RadrootsRelayPublishRelayReceipt, RadrootsRelayPublishRequest, + RadrootsRelayTransportError, }; #[cfg(feature = "radrootsd-proxy")] use std::io::{Read, Write}; @@ -849,8 +850,8 @@ async fn sync_status_reports_pending_retryable_terminal_and_last_attempt_metadat let retryable_event_id = enqueue_listing(&sdk, LISTING_A_D_TAG, "Retryable Coffee", &[RELAY_A]).await; sdk.sync() - .push_outbox_with_adapter( - &TransportFailurePublishAdapter, + .push_outbox_with_transport( + &RadrootsNostrTransport::new(TransportFailurePublishAdapter), PushOutboxRequest::new().with_limit(1), ) .await @@ -858,8 +859,8 @@ async fn sync_status_reports_pending_retryable_terminal_and_last_attempt_metadat let published_event_id = enqueue_listing(&sdk, LISTING_B_D_TAG, "Published Coffee", &[RELAY_B]).await; sdk.sync() - .push_outbox_with_adapter( - &RadrootsMockRelayPublishAdapter::new(), + .push_outbox_with_transport( + &RadrootsNostrTransport::new(RadrootsMockRelayPublishAdapter::new()), PushOutboxRequest::new().with_limit(1), ) .await @@ -1699,7 +1700,7 @@ async fn push_outbox_empty_queue_returns_zero_counts() { let receipt = sdk .sync() - .push_outbox_with_adapter(&adapter, request) + .push_outbox_with_transport(&RadrootsNostrTransport::new(&adapter), request) .await .expect("push"); @@ -2369,26 +2370,32 @@ async fn push_outbox_rejects_invalid_limits_before_claiming() { let zero = sdk .sync() - .push_outbox_with_adapter(&adapter, PushOutboxRequest::new().with_limit(0)) + .push_outbox_with_transport( + &RadrootsNostrTransport::new(&adapter), + PushOutboxRequest::new().with_limit(0), + ) .await .expect_err("zero limit"); let too_large = sdk .sync() - .push_outbox_with_adapter( - &adapter, + .push_outbox_with_transport( + &RadrootsNostrTransport::new(&adapter), PushOutboxRequest::new().with_limit(PUSH_OUTBOX_MAX_LIMIT + 1), ) .await .expect_err("too large"); let zero_ttl = sdk .sync() - .push_outbox_with_adapter(&adapter, PushOutboxRequest::new().with_claim_ttl_ms(0)) + .push_outbox_with_transport( + &RadrootsNostrTransport::new(&adapter), + PushOutboxRequest::new().with_claim_ttl_ms(0), + ) .await .expect_err("zero ttl"); let zero_delay = sdk .sync() - .push_outbox_with_adapter( - &adapter, + .push_outbox_with_transport( + &RadrootsNostrTransport::new(&adapter), PushOutboxRequest::new().with_next_attempt_delay_ms(0), ) .await @@ -2405,14 +2412,17 @@ async fn push_outbox_rejects_invalid_limits_before_claiming() { } #[tokio::test] -async fn push_outbox_with_adapter_uses_queued_targets_without_builder_relays() { +async fn push_outbox_with_transport_uses_queued_targets_without_builder_relays() { let (_tempdir, sdk) = directory_sdk(&[]).await; let outbox_event_id = enqueue_listing(&sdk, LISTING_A_D_TAG, "Coffee", &[RELAY_A]).await; let adapter = RadrootsMockRelayPublishAdapter::new(); let receipt = sdk .sync() - .push_outbox_with_adapter(&adapter, PushOutboxRequest::new().with_limit(1)) + .push_outbox_with_transport( + &RadrootsNostrTransport::new(&adapter), + PushOutboxRequest::new().with_limit(1), + ) .await .expect("push"); @@ -2449,7 +2459,7 @@ async fn push_outbox_with_adapter_uses_queued_targets_without_builder_relays() { } #[tokio::test] -async fn push_outbox_with_adapter_preserves_scoped_duplicate_target_metadata() { +async fn push_outbox_with_transport_preserves_scoped_duplicate_target_metadata() { let (_tempdir, sdk) = directory_sdk(&[]).await; let outbox_event_id = enqueue_scoped_duplicate_listing(&sdk, LISTING_A_D_TAG, "Scoped Coffee").await; @@ -2457,7 +2467,10 @@ async fn push_outbox_with_adapter_preserves_scoped_duplicate_target_metadata() { let receipt = sdk .sync() - .push_outbox_with_adapter(&adapter, PushOutboxRequest::new().with_limit(1)) + .push_outbox_with_transport( + &RadrootsNostrTransport::new(&adapter), + PushOutboxRequest::new().with_limit(1), + ) .await .expect("push"); @@ -2525,8 +2538,8 @@ async fn push_outbox_adapter_transport_failure_preserves_scoped_target_metadata( let receipt = sdk .sync() - .push_outbox_with_adapter( - &TransportFailurePublishAdapter, + .push_outbox_with_transport( + &RadrootsNostrTransport::new(TransportFailurePublishAdapter), PushOutboxRequest::new().with_limit(1), ) .await @@ -2592,7 +2605,7 @@ async fn push_outbox_adapter_transport_failure_preserves_scoped_target_metadata( } #[tokio::test] -async fn push_outbox_with_adapter_recovers_expired_publishing_claim_before_selecting_work() { +async fn push_outbox_with_transport_recovers_expired_publishing_claim_before_selecting_work() { let tempdir = tempfile::tempdir().expect("tempdir"); let storage = tempdir.path().join("sdk"); let sdk = RadrootsClient::builder() @@ -2642,7 +2655,10 @@ async fn push_outbox_with_adapter_recovers_expired_publishing_claim_before_selec let receipt = sdk .sync() - .push_outbox_with_adapter(&adapter, PushOutboxRequest::new().with_limit(1)) + .push_outbox_with_transport( + &RadrootsNostrTransport::new(&adapter), + PushOutboxRequest::new().with_limit(1), + ) .await .expect("recovered push"); @@ -2670,7 +2686,7 @@ async fn push_outbox_with_adapter_recovers_expired_publishing_claim_before_selec } #[tokio::test] -async fn push_outbox_with_adapter_scopes_duplicate_endpoint_sibling_plans() { +async fn push_outbox_with_transport_scopes_duplicate_endpoint_sibling_plans() { let tempdir = tempfile::tempdir().expect("tempdir"); let storage = tempdir.path().join("sdk"); let sdk = RadrootsClient::builder() @@ -2760,8 +2776,8 @@ async fn push_outbox_with_adapter_scopes_duplicate_endpoint_sibling_plans() { let first_receipt = sdk .sync() - .push_outbox_with_adapter( - &adapter, + .push_outbox_with_transport( + &RadrootsNostrTransport::new(&adapter), PushOutboxRequest::new() .with_limit(1) .with_next_attempt_delay_ms(1), @@ -2804,7 +2820,10 @@ async fn push_outbox_with_adapter_scopes_duplicate_endpoint_sibling_plans() { let second_receipt = sdk .sync() - .push_outbox_with_adapter(&adapter, PushOutboxRequest::new().with_limit(1)) + .push_outbox_with_transport( + &RadrootsNostrTransport::new(&adapter), + PushOutboxRequest::new().with_limit(1), + ) .await .expect("second push"); @@ -2847,7 +2866,7 @@ async fn push_outbox_with_adapter_scopes_duplicate_endpoint_sibling_plans() { } #[tokio::test] -async fn push_outbox_with_adapter_can_publish_targeted_ready_event() { +async fn push_outbox_with_transport_can_publish_targeted_ready_event() { let (_tempdir, sdk) = directory_sdk(&[]).await; let older_outbox_event_id = enqueue_listing(&sdk, LISTING_A_D_TAG, "Earlier Coffee", &[RELAY_A]).await; @@ -2857,8 +2876,8 @@ async fn push_outbox_with_adapter_can_publish_targeted_ready_event() { let receipt = sdk .sync() - .push_outbox_with_adapter( - &adapter, + .push_outbox_with_transport( + &RadrootsNostrTransport::new(&adapter), PushOutboxRequest::new().with_outbox_event_id(targeted_outbox_event_id), ) .await @@ -2901,7 +2920,10 @@ async fn push_outbox_default_public_policy_rejects_queued_localhost_ws_targets() let error = sdk .sync() - .push_outbox_with_adapter(&adapter, PushOutboxRequest::new().with_limit(1)) + .push_outbox_with_transport( + &RadrootsNostrTransport::new(&adapter), + PushOutboxRequest::new().with_limit(1), + ) .await .expect_err("public push should reject ws target"); @@ -2910,7 +2932,7 @@ async fn push_outbox_default_public_policy_rejects_queued_localhost_ws_targets() } #[tokio::test] -async fn push_outbox_with_adapter_accepts_explicit_queued_localhost_ws_targets() { +async fn push_outbox_with_transport_accepts_explicit_queued_localhost_ws_targets() { let (_tempdir, sdk) = directory_sdk(&[]).await; let outbox_event_id = enqueue_listing_with_policy( &sdk, @@ -2924,8 +2946,8 @@ async fn push_outbox_with_adapter_accepts_explicit_queued_localhost_ws_targets() let receipt = sdk .sync() - .push_outbox_with_adapter( - &adapter, + .push_outbox_with_transport( + &RadrootsNostrTransport::new(&adapter), PushOutboxRequest::new() .with_limit(1) .with_nostr_relay_url_policy(NostrRelayUrlPolicy::Localhost), @@ -3015,7 +3037,10 @@ async fn push_outbox_preserves_retryable_and_terminal_relay_outcomes() { let receipt = sdk .sync() - .push_outbox_with_adapter(&adapter, PushOutboxRequest::new().with_limit(1)) + .push_outbox_with_transport( + &RadrootsNostrTransport::new(&adapter), + PushOutboxRequest::new().with_limit(1), + ) .await .expect("push"); @@ -3071,8 +3096,8 @@ async fn push_outbox_continues_after_adapter_transport_failure_and_releases_clai let receipt = sdk .sync() - .push_outbox_with_adapter( - &TransportFailurePublishAdapter, + .push_outbox_with_transport( + &RadrootsNostrTransport::new(TransportFailurePublishAdapter), PushOutboxRequest::new().with_limit(2), ) .await @@ -3129,10 +3154,12 @@ async fn concurrent_push_outbox_claims_do_not_publish_the_same_event_twice() { let adapter = RecordingPublishAdapter::new(Duration::from_millis(50)); let request = PushOutboxRequest::new().with_limit(1); let sync = sdk.sync(); + let left_transport = RadrootsNostrTransport::new(&adapter); + let right_transport = RadrootsNostrTransport::new(&adapter); let (left, right) = tokio::join!( - sync.push_outbox_with_adapter(&adapter, request.clone()), - sync.push_outbox_with_adapter(&adapter, request) + sync.push_outbox_with_transport(&left_transport, request.clone()), + sync.push_outbox_with_transport(&right_transport, request) ); let left = left.expect("left push"); let right = right.expect("right push"); @@ -3151,7 +3178,10 @@ async fn push_outbox_computes_publish_time_for_each_iteration() { let receipt = sdk .sync() - .push_outbox_with_adapter(&adapter, PushOutboxRequest::new().with_limit(2)) + .push_outbox_with_transport( + &RadrootsNostrTransport::new(&adapter), + PushOutboxRequest::new().with_limit(2), + ) .await .expect("push"); @@ -3186,7 +3216,10 @@ async fn push_outbox_returns_fatal_error_for_malformed_signed_event_data() { let error = sdk .sync() - .push_outbox_with_adapter(&adapter, PushOutboxRequest::new().with_limit(2)) + .push_outbox_with_transport( + &RadrootsNostrTransport::new(&adapter), + PushOutboxRequest::new().with_limit(2), + ) .await .expect_err("fatal malformed outbox data"); @@ -3227,7 +3260,10 @@ async fn push_outbox_does_not_claim_unsigned_outbox_work() { let receipt = sdk .sync() - .push_outbox_with_adapter(&adapter, PushOutboxRequest::new().with_limit(1)) + .push_outbox_with_transport( + &RadrootsNostrTransport::new(&adapter), + PushOutboxRequest::new().with_limit(1), + ) .await .expect("push"); diff --git a/crates/sdk/tests/unit/sync_runtime_tests.rs b/crates/sdk/tests/unit/sync_runtime_tests.rs @@ -47,14 +47,17 @@ use radroots_outbox::{ }; #[cfg(feature = "radrootsd-proxy")] use radroots_transport::{ - RADROOTS_RETICULUM_PREVIEW_ENDPOINT_URI, RadrootsTransportKind, RadrootsTransportMeshScopeId, - RadrootsTransportSatisfactionClass, RadrootsTransportSatisfactionPolicy, - RadrootsTransportTarget, RadrootsTransportTargetLabel, + RADROOTS_RETICULUM_PREVIEW_ENDPOINT_URI, RadrootsTransportSatisfactionClass, + RadrootsTransportSatisfactionPolicy, +}; +use radroots_transport::{ + RadrootsTransportKind, RadrootsTransportMeshScopeId, RadrootsTransportTarget, + RadrootsTransportTargetLabel, }; use radroots_transport_nostr::{ - RadrootsOutboxPublishReceipt, RadrootsOutboxPublishTargetReceipt, RadrootsRelayOutcomeKind, - RadrootsRelayPublishAdapter, RadrootsRelayPublishRelayReceipt, RadrootsRelayPublishRequest, - RadrootsRelayTransportError, + RadrootsNostrTransport, RadrootsOutboxPublishReceipt, RadrootsOutboxPublishTargetReceipt, + RadrootsRelayOutcomeKind, RadrootsRelayPublishAdapter, RadrootsRelayPublishRelayReceipt, + RadrootsRelayPublishRequest, RadrootsRelayTransportError, }; #[cfg(feature = "radrootsd-proxy")] use radroots_transport_publish_protocol::{ @@ -792,7 +795,10 @@ async fn sync_runtime_reports_clock_errors_before_store_or_relay_work() { )); assert!(matches!( sdk.sync() - .push_outbox_with_adapter(&UnusedPublishAdapter, super::PushOutboxRequest::new()) + .push_outbox_with_transport( + &RadrootsNostrTransport::new(UnusedPublishAdapter), + super::PushOutboxRequest::new() + ) .await, Err(RadrootsSdkError::ClockBeforeUnixEpoch) ));