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