sdk

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

commit 9eb15b2dec368a65401ed278fa3ffc8b9a2d71f4
parent 96d078828c89240fe458662deb3625cbde3bd300
Author: triesap <tyson@radroots.org>
Date:   Fri, 19 Jun 2026 03:21:30 -0700

sdk: export listing publish operation kind

Expose LISTING_PUBLISH_OPERATION_KIND from the runtime API.

Align SDK listing, runtime foundation, and sync runtime tests to the SDK-owned operation constant.

Diffstat:
Mcrates/sdk/src/lib.rs | 4++--
Mcrates/sdk/src/listings_runtime.rs | 2+-
Mcrates/sdk/tests/listings_runtime.rs | 9+++++----
Mcrates/sdk/tests/runtime_foundation.rs | 16++++++++--------
Mcrates/sdk/tests/sync_runtime.rs | 6+++---
5 files changed, 19 insertions(+), 18 deletions(-)

diff --git a/crates/sdk/src/lib.rs b/crates/sdk/src/lib.rs @@ -55,8 +55,8 @@ pub use crate::farms_runtime::{ pub use crate::idempotency::{SDK_IDEMPOTENCY_KEY_MAX_LEN, SdkIdempotencyKey}; #[cfg(feature = "runtime")] pub use crate::listings_runtime::{ - ListingEnqueuePublishRequest, ListingEnqueueReceipt, ListingPreparePublishRequest, - ListingPublishPlan, SdkMutationState, + LISTING_PUBLISH_OPERATION_KIND, ListingEnqueuePublishRequest, ListingEnqueueReceipt, + ListingPreparePublishRequest, ListingPublishPlan, SdkMutationState, }; #[cfg(feature = "runtime")] pub use crate::orders_runtime::{ diff --git a/crates/sdk/src/listings_runtime.rs b/crates/sdk/src/listings_runtime.rs @@ -24,7 +24,7 @@ use radroots_trade::listing::{ use serde::ser::SerializeStruct; #[cfg(feature = "runtime")] -const LISTING_PUBLISH_OPERATION_KIND: &str = "listing.publish.v1"; +pub const LISTING_PUBLISH_OPERATION_KIND: &str = "listing.publish.v1"; #[cfg(feature = "runtime")] #[derive(Clone, Debug)] diff --git a/crates/sdk/tests/listings_runtime.rs b/crates/sdk/tests/listings_runtime.rs @@ -18,9 +18,10 @@ use radroots_events::{ }; use radroots_outbox::{RadrootsOutbox, RadrootsOutboxEventState}; use radroots_sdk::{ - ListingEnqueuePublishRequest, ListingPreparePublishRequest, RadrootsSdk, RadrootsSdkError, - RadrootsSdkPartialLocalMutationFailure, RadrootsSdkRecoveryAction, RadrootsSdkTimestamp, - SdkMutationState, SdkRelayTargetPolicy, SdkRelayTargetSet, SdkRelayUrlPolicy, + LISTING_PUBLISH_OPERATION_KIND, ListingEnqueuePublishRequest, ListingPreparePublishRequest, + RadrootsSdk, RadrootsSdkError, RadrootsSdkPartialLocalMutationFailure, + RadrootsSdkRecoveryAction, RadrootsSdkTimestamp, SdkMutationState, SdkRelayTargetPolicy, + SdkRelayTargetSet, SdkRelayUrlPolicy, }; const SELLER: &str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; @@ -651,7 +652,7 @@ async fn enqueue_publish_reports_partial_local_mutation_after_outbox_conflict() if partial.stored && !partial.queued && partial.event_id.is_some() - && partial.operation_kind == "listing.publish.v1" + && partial.operation_kind == LISTING_PUBLISH_OPERATION_KIND && partial.idempotency_digest_prefix.is_some() && partial.failure == RadrootsSdkPartialLocalMutationFailure::OutboxIdempotencyConflict && partial.recovery == RadrootsSdkRecoveryAction::RetryOperationWithSameIdempotencyKey diff --git a/crates/sdk/tests/runtime_foundation.rs b/crates/sdk/tests/runtime_foundation.rs @@ -1,8 +1,8 @@ #![cfg(feature = "runtime")] use radroots_sdk::{ - BackupRequest, IntegrityRequest, RadrootsSdk, RadrootsSdkClock, RadrootsSdkError, - RadrootsSdkErrorClass, RadrootsSdkRecoveryAction, RadrootsSdkStorageConfig, + BackupRequest, IntegrityRequest, LISTING_PUBLISH_OPERATION_KIND, RadrootsSdk, RadrootsSdkClock, + RadrootsSdkError, RadrootsSdkErrorClass, RadrootsSdkRecoveryAction, RadrootsSdkStorageConfig, RadrootsSdkTimestamp, RestoreRequest, SDK_IDEMPOTENCY_KEY_MAX_LEN, SDK_RELAY_TARGET_MAX_COUNT, SdkBackupState, SdkBackupVerification, SdkEventStoreStorageStatus, SdkIdempotencyKey, SdkOutboxStorageStatus, SdkRelayTargetPolicy, SdkRelayTargetSet, SdkRelayUrlPolicy, @@ -212,12 +212,12 @@ fn sdk_partial_local_mutation_error_is_sanitized() { let event_id = "a".repeat(64); let error = RadrootsSdkError::partial_outbox_enqueue_mutation( event_id, - "listing.publish.v1", + LISTING_PUBLISH_OPERATION_KIND, "abcdef123456", ); let message = error.to_string(); - assert!(message.contains("listing.publish.v1")); + assert!(message.contains(LISTING_PUBLISH_OPERATION_KIND)); assert!(message.contains("abcdef123456")); assert!(message.contains("stored=true")); assert!(message.contains("queued=false")); @@ -303,7 +303,7 @@ fn sdk_error_contract_methods_cover_all_variants() { ), ( RadrootsSdkError::IdempotencyConflict { - operation_kind: "listing.publish.v1".to_owned(), + operation_kind: LISTING_PUBLISH_OPERATION_KIND.to_owned(), expected_pubkey_prefix: "aaaaaaaaaaaa".to_owned(), existing_digest_prefix: "bbbbbbbbbbbb".to_owned(), new_digest_prefix: "cccccccccccc".to_owned(), @@ -428,7 +428,7 @@ fn sdk_error_contract_methods_cover_all_variants() { ( RadrootsSdkError::partial_outbox_enqueue_mutation( "a".repeat(64), - "listing.publish.v1", + LISTING_PUBLISH_OPERATION_KIND, "abcdef123456", ), "partial_local_mutation", @@ -678,7 +678,7 @@ fn storage_backup_and_integrity_contract_dtos_serialize() { #[test] fn outbox_idempotency_conflict_maps_to_structured_sdk_error() { let error = RadrootsSdkError::from(radroots_outbox::RadrootsOutboxError::IdempotencyConflict { - operation_kind: "listing.publish.v1".to_owned(), + operation_kind: LISTING_PUBLISH_OPERATION_KIND.to_owned(), expected_pubkey: "a".repeat(64), idempotency_key: "secret-idempotency-key".to_owned(), existing_digest: "b".repeat(64), @@ -693,7 +693,7 @@ fn outbox_idempotency_conflict_maps_to_structured_sdk_error() { expected_pubkey_prefix, existing_digest_prefix, new_digest_prefix, - } if operation_kind == "listing.publish.v1" + } if operation_kind == LISTING_PUBLISH_OPERATION_KIND && expected_pubkey_prefix == "aaaaaaaaaaaa" && existing_digest_prefix == "bbbbbbbbbbbb" && new_digest_prefix == "cccccccccccc" diff --git a/crates/sdk/tests/sync_runtime.rs b/crates/sdk/tests/sync_runtime.rs @@ -22,8 +22,8 @@ use radroots_relay_transport::{ RadrootsRelayPublishRelayReceipt, RadrootsRelayPublishRequest, RadrootsRelayTransportError, }; use radroots_sdk::{ - BackupRequest, IntegrityRequest, ListingEnqueuePublishRequest, ListingPreparePublishRequest, - PUSH_OUTBOX_DEFAULT_CLAIM_TTL_MS, PUSH_OUTBOX_DEFAULT_LIMIT, + BackupRequest, IntegrityRequest, LISTING_PUBLISH_OPERATION_KIND, ListingEnqueuePublishRequest, + ListingPreparePublishRequest, PUSH_OUTBOX_DEFAULT_CLAIM_TTL_MS, PUSH_OUTBOX_DEFAULT_LIMIT, PUSH_OUTBOX_DEFAULT_NEXT_ATTEMPT_DELAY_MS, PUSH_OUTBOX_MAX_LIMIT, PushOutboxEventReceipt, PushOutboxEventState, PushOutboxReceipt, PushOutboxRelayOutcomeKind, PushOutboxRelayReceipt, PushOutboxRequest, RadrootsSdk, RadrootsSdkError, RadrootsSdkTimestamp, RestoreRequest, @@ -1447,7 +1447,7 @@ async fn push_outbox_does_not_claim_unsigned_outbox_work() { .expect("outbox"); let unsigned = outbox .enqueue_operation(RadrootsOutboxOperationInput::new( - "listing.publish.v1", + LISTING_PUBLISH_OPERATION_KIND, prepared.frozen_draft, vec![RELAY_A.to_owned()], 1_700_000_000_000,