import type { PetState } from "../types.ts"; import { petEngine } from "./engine.ts"; import { fresh, parseSave } from "./save-format.ts"; import { store } from "./store.ts"; import { errorMessage } from "./utils.ts"; export { fresh, parseSave } from "./save-format.ts"; export function load(): PetState { let raw = null; try { raw = localStorage.getItem(KEY); } catch { return fresh(); } // storage unavailable if (raw == null) return fresh(); try { return parseSave(raw); } catch (e) { store.badEgg = { raw, why: errorMessage(e), newer: e instanceof Error && "newer" in e && !!e.newer, }; return fresh(); } } let saveTimer = 0; export function save() { // Never write while a hard reset reloads the page, over a save this page // could not read, or from a tab that no longer holds the pet. if (store.resetting || store.badEgg || !store.tabOwned) return; clearTimeout(saveTimer); saveTimer = setTimeout(() => { if (store.resetting || store.badEgg || !store.tabOwned) return; try { localStorage.setItem(KEY, petEngine().stateJson()); } catch { /* quota or private mode */ } }, 200); } export const KEY = "tokenling.v1"; export const BAD_KEY = "tokenling.bad"; export function cancelSave() { clearTimeout(saveTimer); } // Ownership changes need a confirmed write, not a best-effort debounce. export function saveNow() { if (store.resetting || store.badEgg || !store.tabOwned) throw new Error("This tab cannot save the pet right now."); cancelSave(); localStorage.setItem(KEY, petEngine().stateJson()); }