fix: URL-based room routing — /manwe serves index.html with room pre-filled

ServeDir now falls back to index.html for unknown paths (SPA routing).
https://host:port/manwe loads the page with room input pre-filled as "manwe".
JS getRoom() already reads the path, now the page actually loads.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Siavash Sameni
2026-03-28 15:51:47 +04:00
parent 634cd40fdc
commit 6f4e8eb9f6
2 changed files with 16 additions and 2 deletions

View File

@@ -99,10 +99,17 @@ async fn main() -> anyhow::Result<()> {
"static"
};
// Serve index.html for any path that isn't /ws/, /metrics, or a static file.
// This lets URLs like /manwe load the SPA which reads the room from the path.
let static_service = ServeDir::new(static_dir)
.fallback(tower_http::services::ServeFile::new(
format!("{}/index.html", static_dir),
));
let app = Router::new()
.route("/ws/{room}", get(ws_handler))
.route("/metrics", get(metrics::metrics_handler))
.fallback_service(ServeDir::new(static_dir))
.fallback_service(static_service)
.with_state(state);
let listen: SocketAddr = format!("0.0.0.0:{port}").parse()?;

View File

@@ -66,7 +66,6 @@ let statsInterval = null;
// Use room from URL path or input field
function getRoom() {
// Check URL: /roomname or /#roomname
const path = location.pathname.replace(/^\//, '').replace(/\/$/, '');
if (path && path !== 'index.html') return path;
const hash = location.hash.replace('#', '');
@@ -74,6 +73,14 @@ function getRoom() {
return document.getElementById('room').value.trim() || 'default';
}
// Pre-fill room input from URL on page load
(function() {
const path = location.pathname.replace(/^\//, '').replace(/\/$/, '');
if (path && path !== 'index.html') {
document.getElementById('room').value = path;
}
})();
function setStatus(msg) { document.getElementById('status').textContent = msg; }
function setStats(msg) { document.getElementById('stats').textContent = msg; }