feat(audit): P47 localStorage-Quota — safeSetItem mit Auto-Prune
CI / detect-changes (push) Successful in 8s
CI / branch-name (push) Has been skipped
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / validate-canonical-controls (push) Successful in 13s
CI / test-go (push) Has been skipped
CI / iace-gt-coverage (push) Has been skipped
CI / test-python-backend (push) Successful in 41s
CI / test-python-document-crawler (push) Has been skipped
CI / test-python-dsms-gateway (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / secret-scan (push) Has been skipped
CI / loc-budget (push) Failing after 16s
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Successful in 2m47s

storageHelpers.ts: safeSetItem faengt QuotaExceededError, prunet
alte doc-check-result-*-Eintraege (oldest first, MAX_KEEP=10) und
retried. Bei zweitem Fail aggressiver pruefen.

DocCheckTab.tsx nutzt safeSetItem statt setItem fuer doc-check-results,
result-Keys und history. Verhindert silent-data-loss + Crash wenn
~5MB localStorage-Limit erreicht.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-05-21 16:47:42 +02:00
parent 4171cf0efd
commit c491af5d02
2 changed files with 75 additions and 3 deletions
@@ -3,6 +3,7 @@
import React, { useState } from 'react'
import { ChecklistView } from './ChecklistView'
import { PreScanWizard, useScanContext, isContextComplete } from './PreScanWizard'
import { safeSetItem } from './storageHelpers'
interface DocEntry {
id: string
@@ -118,13 +119,13 @@ export function DocCheckTab() {
if (pollData.status === 'completed' && pollData.result) {
setResults(pollData.result)
setProgress('')
localStorage.setItem('doc-check-results', JSON.stringify(pollData.result))
safeSetItem('doc-check-results', JSON.stringify(pollData.result))
const resultKey = `doc-check-result-${Date.now()}`
try { localStorage.setItem(resultKey, JSON.stringify(pollData.result)) } catch { /* quota */ }
safeSetItem(resultKey, JSON.stringify(pollData.result))
const entry = { date: new Date().toISOString(), urls: validEntries.length, findings: pollData.result.total_findings || 0, resultKey }
const updated = [entry, ...history].slice(0, 30)
setHistory(updated)
localStorage.setItem('doc-check-history', JSON.stringify(updated))
safeSetItem('doc-check-history', JSON.stringify(updated))
break
}
if (pollData.status === 'failed') {