field_ios

In-the-field app for Radroots on iOS
git clone https://radroots.dev/git/field_ios.git
Log | Files | Refs | README | LICENSE

commit 5749689f41e469bfea73e0ab78c689da193f05c5
parent cfdd57eed012723db3c491c6877308afa4a95ef4
Author: triesap <tyson@radroots.org>
Date:   Mon, 10 Aug 2026 21:25:38 +0000

mobile: apply persisted network settings to runtime

Diffstat:
Mcore/crates/tera_ffi/src/runtime.rs | 15+++++++++++++++
Mcore/crates/tera_ffi/tests/runtime_delegation.rs | 69+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------
2 files changed, 78 insertions(+), 6 deletions(-)

diff --git a/core/crates/tera_ffi/src/runtime.rs b/core/crates/tera_ffi/src/runtime.rs @@ -843,6 +843,21 @@ impl RadrootsRuntime { .map_err(Into::into) } + pub async fn phase1_apply_settings_to_runtime( + &self, + ) -> Result<FfiMobileSettingsRecord, RadrootsAppError> { + let settings = self.inner.phase1_settings().await?; + self.inner + .configure_relay_preferences(settings.relays()) + .map_err(RadrootsAppError::from)?; + self.inner + .configure_blossom_preferences(settings.blossom()) + .map_err(RadrootsAppError::from)?; + self.subscriptions + .notify(FfiRuntimeChangeKind::Settings, None); + Ok((&settings).into()) + } + pub async fn phase1_replace_settings( &self, input: FfiReplaceSettingsRecord, diff --git a/core/crates/tera_ffi/tests/runtime_delegation.rs b/core/crates/tera_ffi/tests/runtime_delegation.rs @@ -1,11 +1,14 @@ use radroots_mobile_ffi::{ - FfiAddCommandType, FfiAddDraftInput, FfiBlossomEndpointAuthority, FfiBlossomHostKind, + FfiAddCommandType, FfiAddDraftInput, FfiBlossomAuthorityPreference, + FfiBlossomEndpointAuthority, FfiBlossomHostKind, FfiBlossomPreferencesRecord, FfiBlossomUploadIntent, FfiCancellationPolicy, FfiDraftKind, FfiIdentityCommandKind, - FfiIdentityCommandRecord, FfiIdentityLockState, FfiLocalNetworkRecord, FfiOutboxState, - FfiPreparedMediaInput, FfiProfileMetadataInputRecord, FfiQueuePolicyRecord, - FfiRelayAccessRecord, FfiRelaySatisfaction, FfiRetractionDraftInput, FfiRevisionInputRecord, - FfiRevisionPhase, FfiTodayCardType, FfiTodayProjectionUpdate, MOBILE_FFI_SCHEMA_VERSION, - RadrootsAppError, + FfiIdentityCommandRecord, FfiIdentityLockState, FfiLocalNetworkRecord, + FfiLocalStoragePolicyRecord, FfiMediaNetworkPolicyRecord, FfiMobileNetworkEnvironment, + FfiOutboxState, FfiPreparedMediaInput, FfiProfileMetadataInputRecord, FfiQueuePolicyRecord, + FfiRelayAccessPreference, FfiRelayAccessRecord, FfiRelayPreferenceRecord, + FfiRelayPreferencesRecord, FfiRelaySatisfaction, FfiReplaceSettingsRecord, + FfiRetractionDraftInput, FfiRevisionInputRecord, FfiRevisionPhase, FfiTodayCardType, + FfiTodayProjectionUpdate, MOBILE_FFI_SCHEMA_VERSION, RadrootsAppError, }; mod support; @@ -60,6 +63,60 @@ async fn native_boundary_delegates_the_complete_core_surface() { .is_err() ); + let settings = runtime.phase1_settings().await.expect("settings"); + runtime + .phase1_replace_settings(FfiReplaceSettingsRecord { + schema_version: MOBILE_FFI_SCHEMA_VERSION, + expected_revision: settings.revision, + relays: FfiRelayPreferencesRecord { + schema_version: MOBILE_FFI_SCHEMA_VERSION, + environment: FfiMobileNetworkEnvironment::Public, + endpoints: vec![ + FfiRelayPreferenceRecord { + schema_version: MOBILE_FFI_SCHEMA_VERSION, + url: "wss://read.example".to_owned(), + access: FfiRelayAccessPreference::ReadOnly, + }, + FfiRelayPreferenceRecord { + schema_version: MOBILE_FFI_SCHEMA_VERSION, + url: "wss://write.example".to_owned(), + access: FfiRelayAccessPreference::ReadWrite, + }, + ], + }, + blossom: FfiBlossomPreferencesRecord { + schema_version: MOBILE_FFI_SCHEMA_VERSION, + environment: FfiMobileNetworkEnvironment::Public, + authority: FfiBlossomAuthorityPreference::PublicWebPki, + primary_origin: "https://media.example".to_owned(), + fallback_origins: vec![], + }, + media_network: FfiMediaNetworkPolicyRecord { + schema_version: MOBILE_FFI_SCHEMA_VERSION, + allow_cellular_downloads: true, + allow_cellular_uploads: true, + allow_background_transfers: true, + }, + local_storage: FfiLocalStoragePolicyRecord { + schema_version: MOBILE_FFI_SCHEMA_VERSION, + media_cache_bytes: 256 * 1024 * 1024, + media_cache_artifacts: 1024, + }, + }) + .await + .expect("replace settings"); + runtime + .phase1_apply_settings_to_runtime() + .await + .expect("apply settings"); + let applied = runtime + .sdk_relay_status() + .expect("relay status") + .expect("applied settings profile"); + assert_eq!(applied.relays.len(), 2); + assert_eq!(applied.relays[0].access, FfiRelayAccessRecord::ReadOnly); + assert_eq!(applied.relays[1].access, FfiRelayAccessRecord::ReadWrite); + runtime .configure_simulator_relays(vec!["ws://127.0.0.1:7447".to_owned()]) .expect("simulator relays");