fix(client): fall back to defaults when preset storage is corrupt - #5184
fix(client): fall back to defaults when preset storage is corrupt#5184jeffrey701 wants to merge 1 commit into
Conversation
|
Warning You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again! |
loadPresets was the lone localStorage loader that JSON.parse'd without a try/catch (loadActiveGame, loadWsSession, loadActiveQuickDraft, … all guard and return a fallback). A malformed 'phase-game-presets' value threw a SyntaxError, and because savePreset/deletePreset both call loadPresets first, all three crashed and took down the game-setup preset UI. Wrap the parse and fall back to DEFAULT_PRESETS.
8a040ab to
d059c30
Compare
|
Deferred by maintainer intake policy — not ignored. This current head ( A maintainer must explicitly take this PR or add a local frontend-review exception before it can receive substantive review. The defer label is a routing marker only, not a verdict on the change. |
3 similar comments
|
Deferred by maintainer intake policy — not ignored. This current head ( A maintainer must explicitly take this PR or add a local frontend-review exception before it can receive substantive review. The defer label is a routing marker only, not a verdict on the change. |
|
Deferred by maintainer intake policy — not ignored. This current head ( A maintainer must explicitly take this PR or add a local frontend-review exception before it can receive substantive review. The defer label is a routing marker only, not a verdict on the change. |
|
Deferred by maintainer intake policy — not ignored. This current head ( A maintainer must explicitly take this PR or add a local frontend-review exception before it can receive substantive review. The defer label is a routing marker only, not a verdict on the change. |
Problem
loadPresets(client/src/services/presets.ts) is the only localStorage loader in the module that callsJSON.parsewithout a try/catch:Every sibling loader (
loadActiveGame,loadWsSession,loadActiveQuickDraft, …) wraps the parse and returns a fallback. So a corrupt/partialphase-game-presetsvalue (e.g. a write interrupted mid-flush, or an older schema) throws aSyntaxError. And becausesavePresetanddeletePresetboth callloadPresets()first, all three throw — the game-setup preset UI crashes rather than recovering.Fix
Wrap the parse in try/catch and fall back to
DEFAULT_PRESETS, matching the other loaders.Tests
Adds
presets.test.ts: corrupt storage ("{oops") makesloadPresets/savePreset/deletePresetthrow before the fix and return/no-throw after; empty storage yields the defaults; valid storage round-trips a saved preset.Self-contained: only
presets.ts+ a new test; no engine/Rust/protocol changes.Model: claude-opus-4-8