Better handling, add test
This commit is contained in:
@@ -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()
|
||||||
|
})
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import AsyncStorage from '@react-native-async-storage/async-storage'
|
import AsyncStorage from '@react-native-async-storage/async-storage'
|
||||||
|
|
||||||
import {logger} from '#/logger'
|
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'
|
import {write, read} from '#/state/persisted/store'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -153,33 +153,44 @@ export async function migrate() {
|
|||||||
|
|
||||||
if (!alreadyMigrated && rawLegacyData) {
|
if (!alreadyMigrated && rawLegacyData) {
|
||||||
logger.info('persisted state: migrating legacy storage')
|
logger.info('persisted state: migrating legacy storage')
|
||||||
|
|
||||||
const legacyData = JSON.parse(rawLegacyData)
|
const legacyData = JSON.parse(rawLegacyData)
|
||||||
const newData = transform(legacyData)
|
const newData = transform(legacyData)
|
||||||
await write(newData)
|
const validate = schema.safeParse(newData)
|
||||||
// track successful migrations
|
|
||||||
logger.log('persisted state: migrated legacy storage')
|
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 {
|
} else {
|
||||||
// track successful migrations
|
|
||||||
logger.log('persisted state: no migration needed')
|
logger.log('persisted state: no migration needed')
|
||||||
}
|
}
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
logger.error(e, {
|
logger.error(e, {
|
||||||
message: 'persisted state: error migrating legacy storage',
|
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',
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user