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:
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");