// storage.js - Centralized localStorage operations and multi-tab synchronization //
// ===== Storage & Synchronization Utilities =====
export const LS_KEY = 'marm-sessions-v1';
export const CURRENT_SESSION_KEY = 'marm-current-session';
let hasDataChanged = false;
let sessionsRef = null;
export function setSessionsReference(sessions) {
sessionsRef = sessions;
}
if (typeof window !== 'undefined') {
window.addEventListener('storage', (event) => {
if (event.key === LS_KEY || event.key === CURRENT_SESSION_KEY) {
hasDataChanged = true;
}
});
window.addEventListener('focus', () => {
if (hasDataChanged && sessionsRef) {
restoreSessions();
hasDataChanged = false;
}
});
}
// ===== Session Persistence & Restoration =====
export function persistSessions() {
if (!sessionsRef) {
console.error('MARM: Sessions reference not set');
return false;
}
const isPersistenceEnabled = localStorage.getItem('marm-persistence-enabled') === 'true';
if (!isPersistenceEnabled) {
return false;
}
try {
localStorage.setItem(LS_KEY, JSON.stringify(sessionsRef));
return true;
} catch (e) {
if (e.name === 'QuotaExceededError') {
console.error('MARM: localStorage quota exceeded. Cannot save sessions.', e);
try {
localStorage.setItem(LS_KEY, JSON.stringify(sessionsRef));
return true;
} catch (retryError) {
console.error('MARM: Failed to save sessions even after cleanup.', retryError);
return false;
}
} else {
console.error('MARM: Failed to persist sessions:', e);
return false;
}
}
}
// --- Current Session Persistence ---
export function persistCurrentSession() {
if (!sessionsRef) {
console.error('MARM: Sessions reference not set');
return false;
}
try {
localStorage.setItem(CURRENT_SESSION_KEY, JSON.stringify(sessionsRef));
return true;
} catch (e) {
if (e.name === 'QuotaExceededError') {
console.error('MARM: localStorage quota exceeded. Cannot save current session.', e);
} else {
console.error('MARM: Failed to persist current session:', e);
}
return false;
}
}
export function restoreSessions() {
if (!sessionsRef) {
console.error('MARM: Sessions reference not set');
return;
}
try {
const currentRaw = localStorage.getItem(CURRENT_SESSION_KEY);
if (currentRaw) {
const restored = JSON.parse(currentRaw);
Object.keys(sessionsRef).forEach(key => delete sessionsRef[key]);
Object.assign(sessionsRef, restored);
}
} catch (e) {
console.error('MARM: Failed to restore current session:', e);
Object.keys(sessionsRef).forEach(key => delete sessionsRef[key]);
}
const isPersistenceEnabled = localStorage.getItem('marm-persistence-enabled') === 'true';
if (isPersistenceEnabled) {
try {
const savedRaw = localStorage.getItem(LS_KEY);
if (savedRaw) {
const savedSessions = JSON.parse(savedRaw);
Object.assign(sessionsRef, { ...savedSessions, ...sessionsRef });
}
} catch (e) {
console.error('MARM: Failed to restore saved sessions:', e);
}
}
}