// file: crates/apps/game-snake-poc-tauri/frontend/ts/main.ts // version: 1 import init, { SnakeWasmGame } from "@snake-wasm"; import "../css/main.css"; import { getRuntimeDescriptor, reportFrontendReady } from "./bridge"; import { frontendError, frontendInfo, initializeFrontendTracing } from "./logging"; function requiredElement(identifier: string): T { const element = document.getElementById(identifier); if (element === null) { throw new Error(`Élément frontend requis absent : ${identifier}`); } return element as T; } async function bootstrap(): Promise { await initializeFrontendTracing(); frontendInfo("Snake Tauri frontend bootstrap started"); const descriptor = await getRuntimeDescriptor(); await init(); const game = new SnakeWasmGame(); const configured = game.configure_runtime_provenance( descriptor.platformFamily, descriptor.runtimeHost, descriptor.deviceClass, descriptor.inputProfile, ); if (!configured) { game.free(); throw new Error("La provenance Tauri Android n'a pas été acceptée par l'adapter Snake WASM."); } const status = requiredElement("runtime-status"); const provenance = requiredElement("runtime-provenance"); status.textContent = "Runtime minimal initialisé. Le Canvas et les contrôles arrivent dans 0-pre.3."; provenance.value = [ game.provenance_platform_family(), game.provenance_runtime_host(), game.provenance_execution_model(), game.provenance_device_class(), game.provenance_input_profile(), ].join(" / "); window.addEventListener("pagehide", () => game.free(), { once: true }); await reportFrontendReady(); frontendInfo(`Snake Tauri frontend ready: ${provenance.value}`); } void bootstrap().catch(reason => { const message = reason instanceof Error ? reason.message : String(reason); document.body.dataset.runtimeState = "error"; const status = document.getElementById("runtime-status"); if (status !== null) { status.textContent = `Échec d'initialisation : ${message}`; } frontendError(`Snake Tauri frontend bootstrap failed: ${message}`); });