@@ -84,6 +84,7 @@ class BackupRepo @Inject constructor(
8484 private val widgetsStore : WidgetsStore ,
8585 private val blocktankRepo : BlocktankRepo ,
8686 private val activityRepo : ActivityRepo ,
87+ private val pubkyRepo : PubkyRepo ,
8788 private val preActivityMetadataRepo : PreActivityMetadataRepo ,
8889 private val lightningService : LightningService ,
8990 private val clock : Clock ,
@@ -268,6 +269,16 @@ class BackupRepo @Inject constructor(
268269 }
269270 dataListenerJobs.add(preActivityMetadataJob)
270271
272+ val pubkyStateJob = scope.launch {
273+ pubkyRepo.backupStateVersion
274+ .drop(1 )
275+ .collect {
276+ if (shouldSkipBackup()) return @collect
277+ markBackupRequired(BackupCategory .METADATA )
278+ }
279+ }
280+ dataListenerJobs.add(pubkyStateJob)
281+
271282 // BLOCKTANK - Observe blocktank state changes (orders, cjitEntries, info)
272283 val blocktankJob = scope.launch {
273284 blocktankRepo.blocktankState
@@ -461,18 +472,7 @@ class BackupRepo @Inject constructor(
461472 json.encodeToString(payload).toByteArray()
462473 }
463474
464- BackupCategory .METADATA -> {
465- val preActivityMetadata = preActivityMetadataRepo.getAllPreActivityMetadata().getOrDefault(emptyList())
466- val cacheData = cacheStore.data.first()
467-
468- val payload = MetadataBackupV1 (
469- createdAt = currentTimeMillis(),
470- tagMetadata = preActivityMetadata,
471- cache = cacheData,
472- )
473-
474- json.encodeToString(payload).toByteArray()
475- }
475+ BackupCategory .METADATA -> getMetadataBackupDataBytes()
476476
477477 BackupCategory .BLOCKTANK -> {
478478 val blocktankState = blocktankRepo.blocktankState.first()
@@ -505,6 +505,21 @@ class BackupRepo @Inject constructor(
505505 BackupCategory .LIGHTNING_CONNECTIONS -> throw NotImplementedError (" LIGHTNING backup is managed by ldk-node" )
506506 }
507507
508+ private suspend fun getMetadataBackupDataBytes (): ByteArray = withContext(ioDispatcher) {
509+ val preActivityMetadata = preActivityMetadataRepo.getAllPreActivityMetadata().getOrDefault(emptyList())
510+ val cacheData = cacheStore.data.first()
511+ val pubkySession = pubkyRepo.snapshotSessionBackupState().getOrDefault(null )
512+
513+ val payload = MetadataBackupV1 (
514+ createdAt = currentTimeMillis(),
515+ tagMetadata = preActivityMetadata,
516+ cache = cacheData,
517+ pubkySession = pubkySession,
518+ )
519+
520+ json.encodeToString(payload).toByteArray()
521+ }
522+
508523 suspend fun performFullRestoreFromLatestBackup (
509524 onCacheRestored : suspend () -> Unit = {},
510525 ): Result <Unit > = withContext(ioDispatcher) {
@@ -520,6 +535,10 @@ class BackupRepo @Inject constructor(
520535 Logger .debug(" Restored caches: ${jsonLogOf(parsed.cache.copy(cachedRates = emptyList()))} " , TAG )
521536 onCacheRestored()
522537 preActivityMetadataRepo.upsertPreActivityMetadata(parsed.tagMetadata).getOrNull()
538+ pubkyRepo.restoreSessionBackupState(parsed.pubkySession)
539+ .onFailure {
540+ Logger .warn(" Failed to restore pubky session backup state" , it, context = TAG )
541+ }
523542 Logger .debug(" Restored ${parsed.tagMetadata.size} pre-activity metadata" , TAG )
524543 parsed.createdAt
525544 }
0 commit comments