// 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 } }