Browser version - Self-hosted proxy (server/) that serves the web build and bridges WebSocket connections to Mumble servers over TLS, with a server allowlist or allow-any mode - WebSocket transport and a browser platform layer; identities live in the browser - npm run build:web, dev:web, proxy and test:e2e:web; proxy unit tests Interface - Toolbar next to mute and deafen: description editor, settings, expand or collapse all - Channels with a description show a marker; resting on the row previews it - Collapse all keeps channels with people open - Hints (title tooltips) can be switched on in a new Accessibility settings tab - New identities can set the username suggested when connecting - Own user information tells the client address from the one the server sees Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
20 lines
1.1 KiB
TypeScript
20 lines
1.1 KiB
TypeScript
// Starts the web proxy from environment variables (see the README, "Browser version").
|
|
import path from 'node:path';
|
|
import { existsSync } from 'node:fs';
|
|
import { configFromEnv, startProxy } from './proxy.ts';
|
|
|
|
const config = configFromEnv(process.env);
|
|
// The web build sits next to this script's folder, both in the repository and when bundled
|
|
config.staticDir ??= [path.resolve(import.meta.dirname, '../dist-web')].find(d => existsSync(path.join(d, 'index.html'))) ?? null;
|
|
|
|
try {
|
|
const { port } = await startProxy(config);
|
|
console.log(`mumh5 proxy listening on http://${config.bind}:${port}`);
|
|
console.log(config.allowAny ? `Allowed servers: any${config.allowPrivate ? ', private addresses included' : ' public address'}` : `Allowed servers: ${config.servers.map(s => `${s.host}:${s.port}`).join(', ')}`);
|
|
if (config.sendProxy) console.log('Announcing client addresses with the PROXY protocol; the allowed servers must expect it');
|
|
console.log(config.staticDir ? `Serving the web app from ${config.staticDir}` : 'No web build found (npm run build:web); serving the API only');
|
|
} catch (e) {
|
|
console.error((e as Error).message);
|
|
process.exit(1);
|
|
}
|