Skip to content

Commit 3b4916e

Browse files
committed
fix: harden cold storage sync ordering
1 parent 292ec58 commit 3b4916e

2 files changed

Lines changed: 29 additions & 19 deletions

File tree

src/ts/drive/drive.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -299,8 +299,6 @@ async function loadDrive(ACCESS_TOKEN:string, mode: 'backup'|'sync'):Promise<voi
299299
}
300300

301301
const db:Database = mode === 'backup' ? await getDbFromList() : JSON.parse(Buffer.from(await getFileData(ACCESS_TOKEN, dbs[0][0].id)).toString('utf-8'))
302-
lastSaved = Date.now()
303-
localStorage.setItem('risu_lastsaved', `${lastSaved}`)
304302
const coldStorageRestoreFailures = await restoreColdStorageFromDrive(ACCESS_TOKEN, files, db, mode)
305303
if(coldStorageRestoreFailures.length > 0){
306304
alertError(`${mode === 'sync' ? 'Sync' : 'Backup restore'} failed. ${coldStorageRestoreFailures.length} cold storage item(s) could not be restored.`)
@@ -361,6 +359,8 @@ async function loadDrive(ACCESS_TOKEN:string, mode: 'backup'|'sync'):Promise<voi
361359

362360
if(isTauri){
363361
await writeFile('database/database.bin', dbData, {baseDir: BaseDirectory.AppData})
362+
lastSaved = Date.now()
363+
localStorage.setItem('risu_lastsaved', `${lastSaved}`)
364364
relaunch()
365365
alertStore.set({
366366
type: "wait",
@@ -369,6 +369,8 @@ async function loadDrive(ACCESS_TOKEN:string, mode: 'backup'|'sync'):Promise<voi
369369
}
370370
else{
371371
await forageStorage.setItem('database/database.bin', dbData)
372+
lastSaved = Date.now()
373+
localStorage.setItem('risu_lastsaved', `${lastSaved}`)
372374
location.search = ''
373375
alertStore.set({
374376
type: "wait",

src/ts/storage/autoStorage.ts

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,15 @@ export class AutoStorage{
3838
}
3939

4040
async checkAccountSync(){
41-
let db = getDatabase()
41+
let db = getDatabase({ snapshot: true })
4242
if(this.isAccount){
4343
return true
4444
}
4545
if(localStorage.getItem('dosync') === 'avoid'){
4646
return false
4747
}
4848
if((localStorage.getItem('dosync') === 'sync' || db?.account?.useSync) && (localStorage.getItem('accountst') !== 'able')){
49-
const keys = await this.realStorage.keys()
49+
const keys = (await this.realStorage.keys()).filter((key) => key !== 'database/database.bin')
5050
let i = 0;
5151
const accountStorage = new AccountStorage()
5252

@@ -78,26 +78,16 @@ export class AutoStorage{
7878
return false
7979
}
8080

81-
let replaced:{[key:string]:string} = {}
82-
83-
for(const key of keys){
84-
alertStore.set({
85-
type: "wait",
86-
msg: `Migrating your data...(${i}/${keys.length})`
87-
})
88-
const rkey = await accountStorage.setItem(key,await this.realStorage.getItem(key))
89-
if(rkey !== key){
90-
replaced[key] = rkey
91-
}
92-
i += 1
93-
}
94-
9581
const {
9682
collectColdStorageBackupPayloads,
9783
setAccountColdStorageItem
9884
} = await import("../process/coldstorage.svelte")
9985
const coldStoragePayloads = await collectColdStorageBackupPayloads(db)
100-
const failedColdKeys:string[] = [...coldStoragePayloads.missingKeys]
86+
if(coldStoragePayloads.missingKeys.length > 0){
87+
alertError(`Failed to migrate ${coldStoragePayloads.missingKeys.length} cold storage item(s) to account sync.`)
88+
return false
89+
}
90+
const failedColdKeys:string[] = []
10191
for(let coldIndex = 0; coldIndex < coldStoragePayloads.payloads.length; coldIndex++){
10292
const payload = coldStoragePayloads.payloads[coldIndex]
10393
alertStore.set({
@@ -113,6 +103,24 @@ export class AutoStorage{
113103
return false
114104
}
115105

106+
let replaced:{[key:string]:string} = {}
107+
try {
108+
for(const key of keys){
109+
alertStore.set({
110+
type: "wait",
111+
msg: `Migrating your data...(${i}/${keys.length})`
112+
})
113+
const rkey = await accountStorage.setItem(key,await this.realStorage.getItem(key))
114+
if(rkey !== key){
115+
replaced[key] = rkey
116+
}
117+
i += 1
118+
}
119+
} catch (error) {
120+
alertError(error)
121+
return false
122+
}
123+
116124
const dba = replaceDbResources(db, replaced)
117125
const comp = encodeRisuSaveLegacy(dba, 'compression')
118126
//try decoding

0 commit comments

Comments
 (0)