// Point d'entrée de l'application dans le navigateur (index.html) : le seul // endroit qui assemble le domaine, le moteur, le stockage et l'interface // (ADR 0007, vérifié par dependency-cruiser). // // Copyright (C) 2026 les auteurs d'Ustagammon. // Licence : GPLv3 ou ultérieure (voir LICENSE). import { Game } from "./domain/game/game.js"; import { createWasmEngine } from "./engine/wasm-engine.js"; import { startEngineWorker } from "./engine/worker-run.js"; import { createGameStore } from "./storage/game-store.js"; import { startApp } from "./ui/app.js"; // Ce fichier est servi sous app/ ; le Worker et le service worker sont à la // racine du site. const worker = startEngineWorker(new URL("../engine-worker.mjs", import.meta.url)); const engine = createWasmEngine(worker.run); const store = createGameStore(window.localStorage); startApp({ engineReady: worker.ready, newGame: () => Game.start(engine), savedGame: () => { const journal = store.load(); if (journal === null) { return null; } try { return Game.resume(engine, journal); } catch { return null; // partie illisible : on en commence une nouvelle } }, saveGame: (journal) => store.save(journal), confirm: (question) => window.confirm(question), }); // Hors ligne : le service worker met tout le site en cache. Le navigateur le // refuse hors https (sauf localhost) : l'application marche alors sans. // Il est enregistré une fois le moteur chargé : si le Worker et le service // worker téléchargent les données du moteur (8,7 Mo) en même temps, Chromium // fait échouer l'installation (« Cache.add() encountered a network error »), // et l'application n'est pas disponible hors ligne. Cela évite aussi de // télécharger deux fois ces données à la première visite. if ("serviceWorker" in navigator) { const sw = new URL("../sw.js", import.meta.url); worker.ready.then(() => navigator.serviceWorker.register(sw)).catch(() => {}); }