Stockage ouvert pendant le chargement du moteur ; test navigateur : nombre de parties

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Pierre MARTIN
2026-11-03 20:29:18 +01:00
co-authored by Claude Opus 5.5
parent 71ee3605d4
commit e3aaa0b3a3
3 changed files with 71 additions and 26 deletions
+41 -23
View File
@@ -24,33 +24,51 @@ const engine = createWasmEngine(worker.run);
const localStorage = attempt(() => window.localStorage);
const settings = createSettingsStore(localStorage ?? memoryStorage());
// Les parties enregistrées (IndexedDB, ou localStorage en repli).
const { library } = await openGameLibrary({
indexedDB: attempt(() => window.indexedDB),
localStorage,
});
// Le niveau de l'ordinateur : celui de Game.start (STANDARD_PLY).
const session = createGameSession(
library,
{ start: () => Game.start(engine), resume: (journal) => Game.resume(engine, journal) },
"2ply",
);
const saved = await session.restore();
// Les parties enregistrées (IndexedDB, ou localStorage en repli), ouvertes
// pendant que le moteur se charge : le plateau est dessiné sans les
// attendre. L'écran de jeu ne s'en sert qu'une fois engineReady résolue.
const opening = (async () => {
const { library } = await openGameLibrary({
indexedDB: attempt(() => window.indexedDB),
localStorage,
});
// Le niveau de l'ordinateur : celui de Game.start (STANDARD_PLY).
const session = createGameSession(
library,
{ start: () => Game.start(engine), resume: (journal) => Game.resume(engine, journal) },
"2ply",
);
const saved = await session.restore();
return { library, session, saved };
})();
let stored: Awaited<typeof opening> | null = null;
/** Le stockage, ouvert (toujours le cas une fois engineReady résolue). */
function storage(): Awaited<typeof opening> {
if (stored === null) {
throw new Error("stockage pas encore ouvert");
}
return stored;
}
startApp({
engineReady: worker.ready,
newGame: () => session.newGame(),
savedGame: () => saved,
resumePrevious: () => session.resumePrevious(),
saveGame: (journal) => session.save(journal),
engineReady: Promise.all([
worker.ready,
opening.then((opened) => {
stored = opened;
}),
]),
newGame: () => storage().session.newGame(),
savedGame: () => storage().saved,
resumePrevious: () => storage().session.resumePrevious(),
saveGame: (journal) => storage().session.save(journal),
games: {
list: () => library.list(),
journal: async (id) => (await library.load(id))?.journal ?? null,
shownId: () => session.shownId,
open: (id, branchHead) => session.open(id, branchHead),
remove: (id) => library.remove(id),
list: () => storage().library.list(),
journal: async (id) => (await storage().library.load(id))?.journal ?? null,
shownId: () => storage().session.shownId,
open: (id, branchHead) => storage().session.open(id, branchHead),
remove: (id) => storage().library.remove(id),
exportSgf: async (id) => {
const game = await library.load(id);
const game = await storage().library.load(id);
if (game === null) {
throw new Error("partie introuvable");
}
+2
View File
@@ -447,6 +447,7 @@ export function startApp(options: AppOptions): void {
]) {
button.disabled = busy;
}
ui.menuGames.disabled = false;
ui.cancel.disabled = busy || game.pendingHalfMoves.length === 0;
renderPanel(game, landscape, doubled);
renderMenu();
@@ -491,6 +492,7 @@ export function startApp(options: AppOptions): void {
}
ui.moveHint.hidden = true;
ui.menuNewGame.disabled = true;
ui.menuGames.disabled = true;
renderMenu();
}