57 lines
2.2 KiB
TypeScript
57 lines
2.2 KiB
TypeScript
// 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<T extends HTMLElement>(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<void> {
|
|
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<HTMLParagraphElement>("runtime-status");
|
|
const provenance = requiredElement<HTMLOutputElement>("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}`);
|
|
});
|