app

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

commit 18be71700376e10f924f515f9d95502083737952
parent 3904feb68bedd027809f3e120f68c0a0a07a9901
Author: triesap <tyson@radroots.org>
Date:   Mon, 25 May 2026 05:24:36 +0000

runtime: use canonical relay fingerprints

Diffstat:
Mcrates/launchers/desktop/src/runtime.rs | 23+++++++++++++++++++----
1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/crates/launchers/desktop/src/runtime.rs b/crates/launchers/desktop/src/runtime.rs @@ -65,7 +65,8 @@ use radroots_local_events::{ 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, validate_buyer_order_request_local_work_payload, + buyer_order_request_local_work_record_id, canonical_relay_set_fingerprint, + validate_buyer_order_request_local_work_payload, }; use radroots_nostr_accounts::prelude::RadrootsNostrAccountsManager; use radroots_sdk::farm::{RadrootsFarm, RadrootsFarmRef}; @@ -5315,6 +5316,10 @@ 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(), @@ -5328,7 +5333,7 @@ fn published_operation_receipt( event_content: relay_receipt.event.content.clone(), event_sig: relay_receipt.signature, raw_event_json, - relay_set_fingerprint: relay_receipt.target_relays.join("|"), + relay_set_fingerprint, relay_delivery_json: json!({ "target_relays": relay_receipt.target_relays, "connected_relays": relay_receipt.connected_relays, @@ -7077,8 +7082,9 @@ mod tests { }; use radroots_identity::RadrootsIdentity; use radroots_local_events::{ - BUYER_ORDER_REQUEST_LOCAL_WORK_RECORD_KIND, LocalEventRecord, LocalEventRecordInput, - LocalEventsStore, LocalRecordFamily, LocalRecordStatus, PublishOutboxStatus, SourceRuntime, + BUYER_ORDER_REQUEST_LOCAL_WORK_RECORD_KIND, CANONICAL_RELAY_SET_FINGERPRINT_VERSION, + LocalEventRecord, LocalEventRecordInput, LocalEventsStore, LocalRecordFamily, + LocalRecordStatus, PublishOutboxStatus, SourceRuntime, canonical_relay_set_fingerprint, }; use radroots_nostr_accounts::prelude::{ RadrootsNostrAccountsManager, RadrootsNostrFileAccountStore, @@ -7263,6 +7269,15 @@ mod tests { account_id.to_string() ); assert_eq!( + result.published_receipts[0].relay_set_fingerprint, + canonical_relay_set_fingerprint([relay_a.url(), relay_b.url()]).expect("fingerprint") + ); + assert!( + result.published_receipts[0] + .relay_set_fingerprint + .starts_with(CANONICAL_RELAY_SET_FINGERPRINT_VERSION) + ); + assert_eq!( result.published_receipts[0] .source_local_event_id .as_deref(),