import { StorageType } from "./enums"; import { encryptAndSign, verifyAndDecrypt } from "./crypto"; import { StoreOptions } from "./types"; /** * Resolves the storage object based on type. * @param {StorageType} [type=StorageType.Local] - The storage type. * @returns {Storage} The storage object. */ export function resolveStorage(type: StorageType = StorageType.Local): Storage { return type === StorageType.Session ? window.sessionStorage : window.localStorage; } /** * Retrieves persisted state from storage. * @template T * @param {string} name - Store name. * @param {T} initialState - Initial state. * @param {Storage} storage - Storage object. * @param {StoreOptions} [options] - Store options. * @returns {Promise} The persisted state or initial state. */ export async function getPersistedState(name: string, initialState: T, storage: Storage, options?: StoreOptions): Promise { const raw = storage.getItem(`store:${name}`); if (!raw) return initialState; try { if (options?.enableEncryption && options.encryptionKey) { const decrypted = await verifyAndDecrypt(raw, options.encryptionKey); return decrypted ? { ...initialState, ...decrypted as T } : initialState; } else { return { ...initialState, ...JSON.parse(raw) }; } } catch { console.warn(`[stadojs] Failed to parse persisted state for store "${name}".`); return initialState; } } /** * Persists the current state if enabled. * @template T * @param {string} name - Store name. * @param {T} state - State to persist. * @param {Storage} storage - Storage object. * @param {StoreOptions} [options] - Store options. * @returns {Promise} */ export async function persistState(name: string, state: T, storage: Storage, options?: StoreOptions) { try { let toStore: string; if (options?.enableEncryption && options.encryptionKey) { toStore = await encryptAndSign(state, options.encryptionKey); } else { toStore = JSON.stringify(state); } storage.setItem(`store:${name}`, toStore); } catch { console.warn(`[stadojs] Could not persist state for "${name}".`); } }