feat(snapshot): cache validiert format beim lesen
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
998e08e073
commit
63b68411e4
|
|
@ -4,13 +4,23 @@ export interface CacheState {
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function readCache(path: string): Promise<CacheState | undefined> {
|
export async function readCache(path: string): Promise<CacheState | undefined> {
|
||||||
|
let text: string
|
||||||
try {
|
try {
|
||||||
const text = await Deno.readTextFile(path)
|
text = await Deno.readTextFile(path)
|
||||||
return JSON.parse(text) as CacheState
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err instanceof Deno.errors.NotFound) return undefined
|
if (err instanceof Deno.errors.NotFound) return undefined
|
||||||
throw err
|
throw err
|
||||||
}
|
}
|
||||||
|
const parsed = JSON.parse(text) as unknown
|
||||||
|
if (
|
||||||
|
!parsed ||
|
||||||
|
typeof parsed !== 'object' ||
|
||||||
|
typeof (parsed as { lastKnownGoodCount?: unknown }).lastKnownGoodCount !== 'number' ||
|
||||||
|
!Array.isArray((parsed as { deletedCoords?: unknown }).deletedCoords)
|
||||||
|
) {
|
||||||
|
throw new Error('Cache-File hat unbekanntes Format — bitte loeschen und neu starten')
|
||||||
|
}
|
||||||
|
return parsed as CacheState
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function writeCache(path: string, state: CacheState): Promise<void> {
|
export async function writeCache(path: string, state: CacheState): Promise<void> {
|
||||||
|
|
|
||||||
|
|
@ -17,3 +17,18 @@ Deno.test('writeCache + readCache: round-trip', async () => {
|
||||||
const out = await readCache(path)
|
const out = await readCache(path)
|
||||||
assertEquals(out, state)
|
assertEquals(out, state)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Deno.test('readCache wirft bei korruptem cache-file', async () => {
|
||||||
|
const dir = await Deno.makeTempDir()
|
||||||
|
const path = join(dir, 'cache.json')
|
||||||
|
await Deno.writeTextFile(path, '{"unsinn": 42}')
|
||||||
|
let threw = false
|
||||||
|
try {
|
||||||
|
await readCache(path)
|
||||||
|
} catch (err) {
|
||||||
|
threw = true
|
||||||
|
if (!(err instanceof Error)) throw err
|
||||||
|
if (!err.message.includes('Cache-File')) throw err
|
||||||
|
}
|
||||||
|
if (!threw) throw new Error('readCache haette werfen sollen')
|
||||||
|
})
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue