Files
ocr_scanner/src/storage.js
T
vchuser 5fea22a8c1 Validiere Inhalt in loadSession statt nur Array-Form
loadSession pruefte bisher nur, ob stacks/entries Arrays sind, nicht
deren Inhalt. Ein fremder oder verfaelschter Eintrag unter dem
gleichen Schluessel kam dadurch als vermeintlich gueltige Sitzung
durch und liess die App beim naechsten Scan mit TypeError abstuerzen
(stack.spec fehlte). Falsch typisierte Felder (nextEntryId als String,
stack.count als String) wurden ebenfalls durchgereicht und verdarben
die Sitzung lautlos (doppelte entryIds, "3" + 1 = "31").

loadSession verlangt jetzt, dass nextEntryId eine endliche Zahl ist
und dass jeder Stapel/Eintrag ein echtes Objekt (kein Array, nicht
null) mit den Feldern ist, die session.js tatsaechlich weiterverwendet.
Schlaegt eine Pruefung fehl, liefert loadSession null - ein halb
brauchbarer Zustand wird nicht repariert oder teilweise uebernommen.
2026-07-28 16:03:23 +02:00

75 lines
2.0 KiB
JavaScript

// Reines Modul: kein window, kein document, kein localStorage.
const KEY = 'ram-sortierhilfe:session';
/**
* Absturzschutz, keine Bestandsfuehrung: die laufende Sitzung wird
* gesichert, damit ein versehentliches Neuladen sie nicht vernichtet.
*/
export function saveSession(session, store) {
try {
store.setItem(KEY, JSON.stringify(session));
} catch {
// Voller oder gesperrter Speicher darf das Sortieren nicht unterbrechen.
}
}
// Ein Objekt im Sinne dieser Pruefung: kein Array und nicht null - beides
// liefert typeof 'object', ist fuer stack.spec/entry.spec aber unbrauchbar.
function isPlainObject(value) {
return typeof value === 'object' && value !== null && !Array.isArray(value);
}
function isFiniteNumber(value) {
return typeof value === 'number' && Number.isFinite(value);
}
function isUsableStack(stack) {
return (
isPlainObject(stack)
&& typeof stack.id === 'string'
&& isFiniteNumber(stack.count)
&& isPlainObject(stack.spec)
);
}
function isUsableEntry(entry) {
return (
isPlainObject(entry)
&& isFiniteNumber(entry.entryId)
&& typeof entry.stackId === 'string'
&& isPlainObject(entry.spec)
);
}
/**
* @returns {object|null}
*
* Nur eine Sitzung, die session.js unveraendert weiterverwenden kann, wird
* zurueckgegeben. Ein halb brauchbarer Zustand wird nicht repariert oder
* teilweise uebernommen - dann lieber die Sitzung verlieren (null) als mit
* falschen Zaehlern oder doppelten entryIds lautlos weiterarbeiten.
*/
export function loadSession(store) {
try {
const raw = store.getItem(KEY);
if (!raw) return null;
const parsed = JSON.parse(raw);
if (!Array.isArray(parsed.stacks) || !Array.isArray(parsed.entries)) return null;
if (!isFiniteNumber(parsed.nextEntryId)) return null;
if (!parsed.stacks.every(isUsableStack)) return null;
if (!parsed.entries.every(isUsableEntry)) return null;
return parsed;
} catch {
return null;
}
}
export function clearSession(store) {
try {
store.removeItem(KEY);
} catch {
// siehe oben
}
}