From b15f2883059e983a8e3639709bf3c00bae69e593 Mon Sep 17 00:00:00 2001 From: otivm Date: Sat, 25 Apr 2026 15:05:13 +0000 Subject: [PATCH] =?UTF-8?q?Add=20api.js=20=E2=80=94=20save/load=20client?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api.js | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/api.js diff --git a/src/api.js b/src/api.js new file mode 100644 index 0000000..5736643 --- /dev/null +++ b/src/api.js @@ -0,0 +1,37 @@ +// Thin client for the OTIVM save API +// Backend: GET /api/save/:token — load state +// POST /api/save/:token — write state + +const BASE = '/api/save' + +// Generate a random 8-character hex token +export function generateToken() { + return Array.from(crypto.getRandomValues(new Uint8Array(4))) + .map((b) => b.toString(16).padStart(2, '0')) + .join('') +} + +// Load state from server — returns parsed state object or null +export async function loadState(token) { + try { + const res = await fetch(`${BASE}/${token}`) + if (!res.ok) return null + return await res.json() + } catch { + return null + } +} + +// Save state to server — returns true on success +export async function saveState(token, state) { + try { + const res = await fetch(`${BASE}/${token}`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(state), + }) + return res.ok + } catch { + return false + } +}