Backend (src/server, runs on Bun): - GibbzHttpServer (health, /api/ice, /api/rooms, static, keepalive tuning) - SignalingServer with Peer/Room/RoomRegistry classes and typed messages - IceConfigProvider (env STUN/TURN + coturn HMAC ephemeral creds) - StaticFileServer (dist/ with public/ fallback, traversal guard) - Tracing (OpenTelemetry SDK), AppConfig; createApp() factory for tests Frontend (src/client, built by Vite): - VoiceApp orchestrator implementing VoiceAppContext - WebRtcManager + PeerSession (perfect negotiation, pc rebuild, quality monitor) - SignalingClient + ReconnectController, AudioManager, SpatialAudio, Microphone/ScreenShare controllers, ScreensUi/RosterUi/SpatialMap/ SpeakingMonitor, Settings/Welcome dialogs, LayoutManager, MatrixChat Tooling: bun scripts (dev/start/test/typecheck), vite.config.ts root src/client with publicDir public/static, vitest-config for CI-less runs, bun-based Dockerfile (oven/bun:1), Makefile + README updated, legacy server.js/tracing.js/test.js/public js removed. Verified locally: tsc --noEmit clean, vitest run 6/6 green, vite build ok, server smoke-tested serving dist + signaling endpoints under Node. Local bun binary segfaults (SIGILL) on this host, so 'bun test' itself was not executable here; tests are vitest-API compatible which bun test maps.
30 lines
882 B
TypeScript
30 lines
882 B
TypeScript
import { defineConfig } from 'vite';
|
|
import { nodePolyfills } from 'vite-plugin-node-polyfills';
|
|
import path from 'node:path';
|
|
|
|
// The client lives in src/client (index.html is the Vite root); static PWA
|
|
// assets stay in public/static and are served/copied verbatim from the root.
|
|
export default defineConfig({
|
|
root: path.resolve(import.meta.dirname, 'src/client'),
|
|
publicDir: path.resolve(import.meta.dirname, 'public/static'),
|
|
plugins: [
|
|
nodePolyfills({
|
|
include: ['buffer', 'crypto', 'events', 'stream', 'util'],
|
|
globals: {
|
|
Buffer: true,
|
|
global: true,
|
|
process: true,
|
|
},
|
|
}),
|
|
],
|
|
build: {
|
|
outDir: path.resolve(import.meta.dirname, 'dist'),
|
|
emptyOutDir: true,
|
|
target: 'esnext',
|
|
minify: 'esbuild',
|
|
rollupOptions: {
|
|
input: path.resolve(import.meta.dirname, 'src/client/index.html'),
|
|
},
|
|
},
|
|
});
|