web/ : le moteur tourne dans un Web Worker (module ES) ; la page de test donne le meilleur coup d'une position et son temps de calcul ; la page de mesure chronomètre les positions de référence, mesure la taille téléchargée et la mémoire, compare aux seuils de l'étape 0b et produit un rapport à copier. make bench fait la même mesure sous Node, make deploy-web sert les pages sur le réseau local. Guide de test pour le Fairphone 4 dans docs/guide-test-etape-0.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
66 lines
2.4 KiB
JavaScript
66 lines
2.4 KiB
JavaScript
// engine-client.mjs -- le moteur vu depuis la page : démarre le Web Worker
|
|
// (engine-worker.mjs) et lui envoie les commandes.
|
|
//
|
|
// Copyright (C) 2026 les auteurs d'Ustagammon.
|
|
// Licence : GPLv3 ou ultérieure (voir LICENSE).
|
|
//
|
|
// Toutes les fonctions renvoient une promesse de { result, ms, memoryBytes } :
|
|
// result est l'objet JSON d'engine-cli, ms le temps de calcul mesuré dans le
|
|
// Worker. La promesse est rejetée si le moteur signale une erreur.
|
|
|
|
import { commands } from "./engine-wasm.mjs";
|
|
|
|
export function startEngine() {
|
|
const worker = new Worker(new URL("engine-worker.mjs", import.meta.url), { type: "module" });
|
|
const pending = new Map();
|
|
let nextId = 1;
|
|
let resolveReady, rejectReady;
|
|
const ready = new Promise((resolve, reject) => {
|
|
resolveReady = resolve;
|
|
rejectReady = reject;
|
|
});
|
|
|
|
worker.onmessage = (event) => {
|
|
const message = event.data;
|
|
if (message.type === "ready") {
|
|
resolveReady(message);
|
|
} else if (message.type === "failed") {
|
|
rejectReady(new Error(message.message));
|
|
} else {
|
|
const { resolve, reject } = pending.get(message.id);
|
|
pending.delete(message.id);
|
|
if (message.error) {
|
|
reject(new Error(message.error));
|
|
} else {
|
|
resolve(message);
|
|
}
|
|
}
|
|
};
|
|
// Erreur au chargement du Worker lui-même (fichier absent, navigateur
|
|
// trop ancien pour les Workers en module ES…).
|
|
worker.onerror = (event) => {
|
|
rejectReady(new Error(event.message || "le Web Worker du moteur n'a pas démarré"));
|
|
};
|
|
|
|
function run(args) {
|
|
const id = nextId++;
|
|
return new Promise((resolve, reject) => {
|
|
pending.set(id, { resolve, reject });
|
|
worker.postMessage({ id, args: args.map(String) });
|
|
});
|
|
}
|
|
|
|
return {
|
|
// Promesse de { loadMs, memoryBytes } une fois le moteur chargé.
|
|
ready,
|
|
bestMove: (positionId, matchId, dice, ply) =>
|
|
run(commands.bestMove(positionId, matchId, dice, ply)),
|
|
cubeDecision: (positionId, matchId, ply) =>
|
|
run(commands.cubeDecision(positionId, matchId, ply)),
|
|
evaluate: (positionId, matchId, ply) =>
|
|
run(commands.evaluate(positionId, matchId, ply)),
|
|
reference: (positionId, matchId, dice, ply) =>
|
|
run(commands.reference(positionId, matchId, dice, ply)),
|
|
};
|
|
}
|