Better handling, add test

This commit is contained in:
Eric Bailey
2023-12-05 16:35:46 -06:00
parent be6f9dfb3d
commit 81fcedaf0e
2 changed files with 39 additions and 19 deletions
@@ -0,0 +1,9 @@
import {expect, test} from '@jest/globals'
import {transform} from '#/state/persisted/legacy'
import {schema} from '#/state/persisted/schema'
test('transform', () => {
const data = transform({})
expect(() => schema.parse(data)).not.toThrow()
})
+30 -19
View File
@@ -1,7 +1,7 @@
import AsyncStorage from '@react-native-async-storage/async-storage'
import {logger} from '#/logger'
import {defaults, Schema} from '#/state/persisted/schema'
import {defaults, Schema, schema} from '#/state/persisted/schema'
import {write, read} from '#/state/persisted/store'
/**
@@ -153,33 +153,44 @@ export async function migrate() {
if (!alreadyMigrated && rawLegacyData) {
logger.info('persisted state: migrating legacy storage')
const legacyData = JSON.parse(rawLegacyData)
const newData = transform(legacyData)
await write(newData)
// track successful migrations
logger.log('persisted state: migrated legacy storage')
const validate = schema.safeParse(newData)
if (validate.success) {
await write(newData)
logger.log('persisted state: migrated legacy storage')
} else {
logger.error('persisted state: legacy data failed validation', {
error: validate.error,
})
/*
* If transformed data fails validation, start from a clean slate with
* the new data structure.
*
* If this fails, there's likely something related to AsyncStorage
* going wrong.
*/
try {
await write(transform({}))
logger.log(
'persisted state: recovered from legacy validation failure',
)
} catch (e: any) {
logger.error(e, {
message: 'persisted state: error recovering from legacy migration',
})
}
}
} else {
// track successful migrations
logger.log('persisted state: no migration needed')
}
} catch (e: any) {
logger.error(e, {
message: 'persisted state: error migrating legacy storage',
})
/*
* If we fail to migrate, attempt to start from a blank slate with new data
* structure. If this fails, there's likely something related to
* AsyncStorage going wrong.
*/
try {
const newData = transform({})
await write(newData)
} catch (e: any) {
logger.error(e, {
message: 'persisted state: error recovering from legacy migration',
})
}
}
}