0.3.5-alpha.7

This commit is contained in:
2026-09-22 06:36:54 +02:00
parent 0ef5e1a233
commit 1764eb9bed
20 changed files with 1021 additions and 55 deletions

View File

@@ -0,0 +1,27 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>games.sasedev WebTransport browser smoke</title>
</head>
<body>
<main>
<h1>WebTransport browser smoke</h1>
<p id="environment-status">Checking browser environment…</p>
<label>
WebTransport endpoint
<input id="endpoint" type="text" size="72" autocomplete="off">
</label>
<br>
<label>
Certificate SHA-256
<input id="certificate-hash" type="text" size="72" autocomplete="off">
</label>
<br>
<button id="run" type="button">Run smoke</button>
<pre id="result">IDLE</pre>
</main>
<script type="module" src="./ts/main.ts"></script>
</body>
</html>

View File

@@ -0,0 +1,69 @@
// file: Web/game-realtime-webtransport-browser-smoke/frontend/ts/main.ts
// version: 1
import init, { run_browser_smoke } from "@webtransport-browser-smoke-wasm";
function requireElement<T extends Element>(selector: string): T {
const element = document.querySelector<T>(selector);
if (element === null) {
throw new Error(`Required browser smoke element is missing: ${selector}`);
}
return element;
}
function populateFromQuery(endpoint: HTMLInputElement, certificateHash: HTMLInputElement): void {
const parameters = new URLSearchParams(window.location.search);
const endpointValue = parameters.get("endpoint");
const hashValue = parameters.get("sha256");
if (endpointValue !== null) {
endpoint.value = endpointValue;
}
if (hashValue !== null) {
certificateHash.value = hashValue;
}
}
async function main(): Promise<void> {
const environmentStatus = requireElement<HTMLParagraphElement>("#environment-status");
const endpoint = requireElement<HTMLInputElement>("#endpoint");
const certificateHash = requireElement<HTMLInputElement>("#certificate-hash");
const run = requireElement<HTMLButtonElement>("#run");
const result = requireElement<HTMLPreElement>("#result");
populateFromQuery(endpoint, certificateHash);
if (!window.isSecureContext) {
environmentStatus.textContent = "FAIL: page is not running in a secure context";
run.disabled = true;
return;
}
if (!("WebTransport" in window)) {
environmentStatus.textContent = "FAIL: this browser does not expose WebTransport";
run.disabled = true;
return;
}
await init();
environmentStatus.textContent = "Secure context and WebTransport available; WASM loaded";
run.addEventListener("click", () => {
run.disabled = true;
result.textContent = "RUNNING";
void run_browser_smoke(endpoint.value.trim(), certificateHash.value.trim())
.then(message => {
result.textContent = message;
})
.catch(caughtError => {
result.textContent = `game-realtime-webtransport-browser-smoke: FAIL: ${String(caughtError)}`;
})
.finally(() => {
run.disabled = false;
});
});
if (endpoint.value.length > 0 && certificateHash.value.length > 0) {
run.click();
}
}
void main().catch(caughtError => {
const result = document.querySelector<HTMLPreElement>("#result");
if (result !== null) {
result.textContent = `game-realtime-webtransport-browser-smoke: FAIL: ${String(caughtError)}`;
}
});

View File

@@ -0,0 +1,17 @@
{
"name": "game-realtime-webtransport-browser-smoke-web",
"private": true,
"version": "0.3.5-alpha.7",
"type": "module",
"scripts": {
"wasm:dev": "cargo build -p game-realtime-webtransport-browser-smoke --lib --target wasm32-unknown-unknown && wasm-bindgen ../../builds/sasedev-games/target/wasm32-unknown-unknown/debug/game_realtime_webtransport_browser_smoke.wasm --target web --out-dir ../../builds/sasedev-games/game-realtime-webtransport-browser-smoke/wasm --out-name game_realtime_webtransport_browser_smoke",
"wasm:build": "cargo build -p game-realtime-webtransport-browser-smoke --lib --release --target wasm32-unknown-unknown && wasm-bindgen ../../builds/sasedev-games/target/wasm32-unknown-unknown/release/game_realtime_webtransport_browser_smoke.wasm --target web --out-dir ../../builds/sasedev-games/game-realtime-webtransport-browser-smoke/wasm --out-name game_realtime_webtransport_browser_smoke",
"dev": "npm run wasm:dev && vite",
"build": "npm run wasm:build && tsc && vite build"
},
"devDependencies": {
"@types/node": "^26.1",
"typescript": "^7.0",
"vite": "^8.2"
}
}

View File

@@ -0,0 +1,35 @@
{
"compilerOptions": {
"target": "ES2022",
"useDefineForClassFields": true,
"module": "ESNext",
"lib": [
"ES2022",
"DOM",
"DOM.Iterable"
],
"skipLibCheck": true,
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"isolatedModules": true,
"noEmit": true,
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"allowSyntheticDefaultImports": true,
"types": [
"vite/client",
"node"
],
"paths": {
"@webtransport-browser-smoke-wasm": [
"../../builds/sasedev-games/game-realtime-webtransport-browser-smoke/wasm/game_realtime_webtransport_browser_smoke.d.ts"
]
}
},
"include": [
"frontend",
"vite.config.ts"
]
}

View File

@@ -0,0 +1,50 @@
// file: Web/game-realtime-webtransport-browser-smoke/vite.config.ts
// version: 1
import { fileURLToPath } from "node:url";
import { resolve } from "node:path";
import { defineConfig, normalizePath } from "vite";
const appRoot = fileURLToPath(new URL(".", import.meta.url));
const repositoryRoot = normalizePath(resolve(appRoot, "../.."));
const frontendRoot = normalizePath(resolve(appRoot, "frontend"));
const externalBuildRoot = normalizePath(resolve(repositoryRoot, "../builds/sasedev-games/game-realtime-webtransport-browser-smoke"));
const wasmRoot = normalizePath(resolve(externalBuildRoot, "wasm"));
const wasmModule = normalizePath(resolve(wasmRoot, "game_realtime_webtransport_browser_smoke.js"));
const frontendDist = normalizePath(resolve(externalBuildRoot, "dist"));
const viteCacheDir = normalizePath(resolve(externalBuildRoot, "vite-cache"));
export default defineConfig({
base: "./",
cacheDir: viteCacheDir,
clearScreen: false,
root: frontendRoot,
publicDir: false,
input: {
main: normalizePath(resolve(frontendRoot, "main.html")),
},
resolve: {
alias: {
"@webtransport-browser-smoke-wasm": wasmModule,
},
},
build: {
outDir: frontendDist,
emptyOutDir: true,
minify: true,
sourcemap: false,
},
server: {
host: "127.0.0.1",
port: 1435,
strictPort: true,
fs: {
allow: [appRoot, repositoryRoot, externalBuildRoot],
},
},
preview: {
host: "127.0.0.1",
port: 4175,
strictPort: true,
},
});