0.3.5-alpha.7
This commit is contained in:
@@ -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>
|
||||
@@ -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)}`;
|
||||
}
|
||||
});
|
||||
17
Web/game-realtime-webtransport-browser-smoke/package.json
Normal file
17
Web/game-realtime-webtransport-browser-smoke/package.json
Normal 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"
|
||||
}
|
||||
}
|
||||
35
Web/game-realtime-webtransport-browser-smoke/tsconfig.json
Normal file
35
Web/game-realtime-webtransport-browser-smoke/tsconfig.json
Normal 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"
|
||||
]
|
||||
}
|
||||
50
Web/game-realtime-webtransport-browser-smoke/vite.config.ts
Normal file
50
Web/game-realtime-webtransport-browser-smoke/vite.config.ts
Normal 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,
|
||||
},
|
||||
});
|
||||
Reference in New Issue
Block a user