commit 45db999099edb054f58993aa079c10567358878c
parent e350c249f51d4834e1a0c356a861f98a84672f7d
Author: triesap <triesap@radroots.dev>
Date: Mon, 19 Jan 2026 19:19:35 +0000
app: bootstrap nostr key on init
- generate nostr key when keystore has no entries
- persist public key into datastore via key map
- preserve existing key when present
- map keystore bootstrap errors into init failures
Diffstat:
1 file changed, 27 insertions(+), 0 deletions(-)
diff --git a/app/src/init.rs b/app/src/init.rs
@@ -18,12 +18,15 @@ use crate::{
app_datastore_clear_bootstrap,
app_datastore_has_app_data,
app_datastore_has_config,
+ app_datastore_key_nostr_key,
app_datastore_write_app_data,
app_datastore_write_config,
+ app_keystore_nostr_ensure_key,
AppAppData,
AppConfig,
AppConfigData,
AppConfigError,
+ AppKeystoreError,
AppKeyMapConfig,
};
@@ -194,6 +197,30 @@ pub async fn app_init_backends(config: AppConfig) -> AppInitResult<AppBackends>
.await?;
}
let nostr_keystore = RadrootsClientWebKeystoreNostr::new(Some(config.keystore.nostr_store));
+ let nostr_public_key = app_keystore_nostr_ensure_key(&nostr_keystore)
+ .await
+ .map_err(|err| match err {
+ AppKeystoreError::Keystore(inner) => AppInitError::Keystore(inner),
+ })?;
+ let nostr_key =
+ app_datastore_key_nostr_key(&config.datastore.key_maps).map_err(AppInitError::Config)?;
+ match datastore.get(nostr_key).await {
+ Ok(existing) => {
+ if existing != nostr_public_key {
+ let _ = datastore
+ .set(nostr_key, &nostr_public_key)
+ .await
+ .map_err(AppInitError::Datastore)?;
+ }
+ }
+ Err(RadrootsClientDatastoreError::NoResult) => {
+ let _ = datastore
+ .set(nostr_key, &nostr_public_key)
+ .await
+ .map_err(AppInitError::Datastore)?;
+ }
+ Err(err) => return Err(AppInitError::Datastore(err)),
+ }
Ok(AppBackends {
config,
datastore,