/**
* Bun server: HTML import (bundles src/app.js + src/style.css and everything
* they import) + static assets from public/ + a tiny /api/config so the
* client's boot() doesn't log a 404 in direct-connect mode.
*
* This rebuild ships direct-connect only: no /api/session load-balancer
* proxy (that needs backend credentials this rebuild doesn't have). Point
* Settings -> "Direct server URL" at a running s2s realtime endpoint
* (ws://.../v1/realtime) to talk to it.
*/
import index from "./index.html";
const PUBLIC_DIR = `${import.meta.dir}/public`;
Bun.serve({
port: Number(process.env.PORT ?? 7860),
routes: {
"/": index,
"/api/config": () =>
Response.json({ lb: false, allowDirect: true }),
},
async fetch(req) {
const url = new URL(req.url);
// Static assets: public/worklets/*, public/vendor/*, public/avatars/*.
const path = decodeURIComponent(url.pathname);
if (path === "/" || path.startsWith("/api/")) {
return new Response("Not found", { status: 404 });
}
const file = Bun.file(`${PUBLIC_DIR}${path}`);
if (await file.exists()) {
return new Response(file);
}
return new Response("Not found", { status: 404 });
},
development: {
hmr: true,
console: true,
},
});
console.log(`Gemma Avatar listening on http://localhost:${process.env.PORT ?? 7860}`);