/
som_cooper
/
book-lib
Обзор
Документация
Войти
/
som_cooper
/
book-lib
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
admin/src/lib/searchSessionStorage.js
113 строк
3 KB
imdbcooper
Fix Anna search results and Flibusta descriptions
25 май 2026, 12:15
25 май 2026, 12:15
07880dc
Код
Авторство
О чём код?
const STORAGE_KEY_PREFIX = 'book-library:admin:search-session:' const LAST_SESSION_KEY = 'book-library:admin:search-session:last' const SESSION_VERSION = 1 const SESSION_MAX_AGE_MS = 12 * 60 * 60 * 1000 function getStorage() { if (typeof window === 'undefined') return null try { return window.sessionStorage } catch { return null } } function buildSessionStorageKey(sessionId) { return `${STORAGE_KEY_PREFIX}${sessionId}` } function isValidSessionId(sessionId) { return typeof sessionId === 'string' && sessionId.trim().length > 0 } function isExpiredSnapshot(snapshot) { if (!snapshot?.updatedAt) return false const updatedAt = Date.parse(snapshot.updatedAt) if (!Number.isFinite(updatedAt)) return false return (Date.now() - updatedAt) > SESSION_MAX_AGE_MS } function readSnapshotRecord(storage, sessionId) { if (!storage || !isValidSessionId(sessionId)) return null try { const raw = storage.getItem(buildSessionStorageKey(sessionId)) if (!raw) return null const snapshot = JSON.parse(raw) if (!snapshot || snapshot.version !== SESSION_VERSION || snapshot.sessionId !== sessionId) { storage.removeItem(buildSessionStorageKey(sessionId)) return null } if (isExpiredSnapshot(snapshot)) { storage.removeItem(buildSessionStorageKey(sessionId)) if (storage.getItem(LAST_SESSION_KEY) === sessionId) { storage.removeItem(LAST_SESSION_KEY) } return null } return snapshot } catch { storage.removeItem(buildSessionStorageKey(sessionId)) return null } } export function createSearchSessionId() { return `search-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}` } export function readSearchSession(sessionId) { const storage = getStorage() return readSnapshotRecord(storage, sessionId) } export function readLatestSearchSession(query = '') { const storage = getStorage() if (!storage) return null const latestSessionId = storage.getItem(LAST_SESSION_KEY) const latestSnapshot = readSnapshotRecord(storage, latestSessionId) if (!latestSnapshot) return null const normalizedQuery = String(query || '').trim() if (normalizedQuery && latestSnapshot.query !== normalizedQuery) { return null } return latestSnapshot } export function writeSearchSession(snapshot) { if (!snapshot || !isValidSessionId(snapshot.sessionId)) return null const storage = getStorage() if (!storage) return null const timestamp = new Date().toISOString() const record = { version: SESSION_VERSION, createdAt: snapshot.createdAt || timestamp, updatedAt: timestamp, ...snapshot, } storage.setItem(buildSessionStorageKey(record.sessionId), JSON.stringify(record)) storage.setItem(LAST_SESSION_KEY, record.sessionId) return record } export function clearSearchSession(sessionId) { const storage = getStorage() if (!storage || !isValidSessionId(sessionId)) return storage.removeItem(buildSessionStorageKey(sessionId)) if (storage.getItem(LAST_SESSION_KEY) === sessionId) { storage.removeItem(LAST_SESSION_KEY) } }