app

Local-first trade for farms and co-ops
git clone https://radroots.dev/git/app.git
Log | Files | Refs | README | LICENSE

commit e39fe060df73a71f64482a1f4f2861e90fb111ab
parent 18be71700376e10f924f515f9d95502083737952
Author: triesap <tyson@radroots.org>
Date:   Mon, 25 May 2026 07:19:08 +0000

sync: use canonical relay evidence

Diffstat:
Mcrates/launchers/desktop/src/runtime.rs | 42++++++++++++++++++++++++------------------
1 file changed, 24 insertions(+), 18 deletions(-)

diff --git a/crates/launchers/desktop/src/runtime.rs b/crates/launchers/desktop/src/runtime.rs @@ -64,9 +64,9 @@ use radroots_local_events::{ BUYER_ORDER_REQUEST_ACTOR_SOURCE_RESOLVED_ACCOUNT, BUYER_ORDER_REQUEST_ACTOR_SOURCE_UNRESOLVED_APP, BUYER_ORDER_REQUEST_DOCUMENT_KIND, BUYER_ORDER_REQUEST_LOCAL_WORK_RECORD_KIND, LocalEventRecordInput, LocalEventRecordUpdate, - LocalEventsStore, LocalRecordFamily, LocalRecordStatus, PublishOutboxStatus, SourceRuntime, - buyer_order_request_local_work_record_id, canonical_relay_set_fingerprint, - validate_buyer_order_request_local_work_payload, + LocalEventsStore, LocalRecordFamily, LocalRecordStatus, PublishOutboxStatus, + RelayDeliveryEvidence, RelayDeliveryFailure, SourceRuntime, + buyer_order_request_local_work_record_id, validate_buyer_order_request_local_work_payload, }; use radroots_nostr_accounts::prelude::RadrootsNostrAccountsManager; use radroots_sdk::farm::{RadrootsFarm, RadrootsFarmRef}; @@ -5301,12 +5301,23 @@ fn published_operation_receipt( .failed_relays .iter() .map(|failure| { - json!({ - "relay_url": failure.relay_url, - "error": failure.error, - }) + RelayDeliveryFailure::new(failure.relay_url.as_str(), failure.error.as_str()) + .map_err(|source| AppSyncTransportError::failed(source.to_string())) }) - .collect::<Vec<_>>(); + .collect::<Result<Vec<_>, _>>()?; + let delivery_evidence = RelayDeliveryEvidence::acknowledged( + &relay_receipt.target_relays, + &relay_receipt.connected_relays, + &relay_receipt.acknowledged_relays, + failed_relays, + ) + .map_err(|source| AppSyncTransportError::failed(source.to_string()))?; + let relay_set_fingerprint = delivery_evidence.relay_set_fingerprint().ok_or_else(|| { + AppSyncTransportError::failed("direct relay publish requires a non-empty relay set") + })?; + let relay_delivery_json = delivery_evidence + .to_json_value() + .map_err(|source| AppSyncTransportError::failed(source.to_string()))?; let raw_event_json = json!({ "id": relay_receipt.event.id.clone(), "pubkey": relay_receipt.event.author.clone(), @@ -5316,10 +5327,6 @@ fn published_operation_receipt( "content": relay_receipt.event.content.clone(), "sig": relay_receipt.event.sig.clone(), }); - let relay_set_fingerprint = canonical_relay_set_fingerprint(&relay_receipt.target_relays) - .ok_or_else(|| { - AppSyncTransportError::failed("direct relay publish requires a non-empty relay set") - })?; Ok(AppPublishedOperationReceipt { operation_key: operation_key.to_owned(), @@ -5334,12 +5341,7 @@ fn published_operation_receipt( event_sig: relay_receipt.signature, raw_event_json, relay_set_fingerprint, - relay_delivery_json: json!({ - "target_relays": relay_receipt.target_relays, - "connected_relays": relay_receipt.connected_relays, - "acknowledged_relays": relay_receipt.acknowledged_relays, - "failed_relays": failed_relays, - }), + relay_delivery_json, }) } @@ -7287,6 +7289,10 @@ mod tests { result.published_receipts[0].relay_delivery_json["acknowledged_relays"], json!([relay_a.url(), relay_b.url()]) ); + assert_eq!( + result.published_receipts[0].relay_delivery_json["state"], + json!("acknowledged") + ); } #[test]