0f8f8698bd
Three fixes around the dev sandbox end-to-end path. Each one was flushed out by an actual login walkthrough after the previous commit. Backend bootstrap now treats `cancelled`, `finished`, and `start_failed` as terminal: the per-boot find-or-create skips such games and provisions a fresh one. Without this, a single bad shutdown cascade leaves the developer staring at a dead lobby tile forever (cancelled games don't transition back). Covered by TestTerminalSandboxStatus. Tools/local-dev: stop killing engine containers in `make down`. The runtime treats the disappearance of an engine as a real failure (cascading the lobby game to `cancelled`); leaving the container running across `down/up` lets the runtime reconciler re-attach on the next boot. The teardown happens only in `make clean`, where the DB is wiped anyway. Compose now also exposes :9090 (authenticated EdgeGateway listener) on the host so the Vite dev proxy can reach the Connect-Web surface, and bumps the gateway anti-abuse limits for `public_misc` so the same surface is not blanket-rejected with 413. Ui/frontend: the lobby's `My Games` cards are now clickable only for the playable statuses (`running`, `paused`, `finished`). All other statuses render as disabled buttons so a click on a draft or cancelled game no longer drops the user on a 404 — the in-game view at /games/:id/* doesn't exist before Phase 10 and never makes sense for a cancelled game. Vite proxy splits the dev targets so `/api/*` continues to talk to the REST listener and `/galaxy.gateway.v1.EdgeGateway/*` is routed to the Connect-Web listener via VITE_DEV_GRPC_PROXY_TARGET (defaults to :9090). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
53 lines
1.8 KiB
TypeScript
53 lines
1.8 KiB
TypeScript
import { sveltekit } from "@sveltejs/kit/vite";
|
|
import { defineConfig } from "vite";
|
|
import { readFileSync } from "node:fs";
|
|
import { fileURLToPath } from "node:url";
|
|
|
|
const pkg = JSON.parse(
|
|
readFileSync(
|
|
fileURLToPath(new URL("./package.json", import.meta.url)),
|
|
"utf8",
|
|
),
|
|
) as { version: string };
|
|
|
|
// Default upstream gateway addresses used by the dev proxy. Override
|
|
// by pointing `VITE_DEV_PROXY_TARGET` (REST surface) and
|
|
// `VITE_DEV_GRPC_PROXY_TARGET` (Connect-Web surface) at a different
|
|
// gateway when working with a remote stack instead of
|
|
// `tools/local-dev/`. In production the two surfaces sit behind a
|
|
// single host; the split here exists only because local-dev runs the
|
|
// REST listener on :8080 and the authenticated Connect-Web listener
|
|
// on :9090.
|
|
const DEV_PROXY_TARGET =
|
|
process.env.VITE_DEV_PROXY_TARGET ?? "http://localhost:8080";
|
|
const DEV_GRPC_PROXY_TARGET =
|
|
process.env.VITE_DEV_GRPC_PROXY_TARGET ?? "http://localhost:9090";
|
|
|
|
export default defineConfig({
|
|
plugins: [sveltekit()],
|
|
define: {
|
|
__APP_VERSION__: JSON.stringify(pkg.version),
|
|
},
|
|
server: {
|
|
// Same-origin proxy so the browser sees only `localhost:5173`
|
|
// and never trips a cross-origin preflight against the
|
|
// gateway's REST + Connect-Web surfaces. Production deployments
|
|
// serve the UI and the gateway behind a single host, so the
|
|
// proxy is purely a dev-time convenience.
|
|
proxy: {
|
|
"/api": {
|
|
target: DEV_PROXY_TARGET,
|
|
changeOrigin: false,
|
|
},
|
|
"/galaxy.gateway.v1.EdgeGateway": {
|
|
target: DEV_GRPC_PROXY_TARGET,
|
|
changeOrigin: false,
|
|
// Connect-Web server-streaming (`SubscribeEvents`) uses
|
|
// chunked HTTP responses; http-proxy passes them through
|
|
// transparently as long as buffering stays off, which is
|
|
// the default.
|
|
},
|
|
},
|
|
},
|
|
});
|