webchat: improve logging and static serving

This commit is contained in:
Peter Steinberger
2025-12-10 15:32:29 +00:00
parent 4db69c8eac
commit 3796882d22
4 changed files with 81 additions and 25 deletions

View File

@@ -50,6 +50,7 @@ class GatewaySocket {
this.ws = ws;
ws.onopen = () => {
logStatus(`ws: open -> sending hello (${this.url})`);
const hello = {
type: "hello",
minProtocol: 1,
@@ -65,9 +66,15 @@ class GatewaySocket {
ws.send(JSON.stringify(hello));
};
ws.onerror = (err) => reject(err);
ws.onerror = (err) => {
logStatus(`ws: error ${formatError(err)}`);
reject(err);
};
ws.onclose = (ev) => {
logStatus(
`ws: close code=${ev.code} reason=${ev.reason || "n/a"} clean=${ev.wasClean}`,
);
if (this.pending.size > 0) {
for (const [, p] of this.pending)
p.reject(new Error("gateway closed"));
@@ -84,6 +91,9 @@ class GatewaySocket {
return;
}
if (msg.type === "hello-ok") {
logStatus(
`ws: hello-ok presence=${msg?.snapshot?.presence?.length ?? 0} healthOk=${msg?.snapshot?.health?.ok ?? "n/a"}`,
);
this.handlers.set("snapshot", msg.snapshot);
resolve(msg);
return;
@@ -267,14 +277,22 @@ const startChat = async () => {
const params = new URLSearchParams(window.location.search);
const sessionKey = params.get("session") || "main";
const wsUrl = (() => {
const u = new URL(window.location.href);
u.protocol = u.protocol.replace("http", "ws");
u.port = params.get("gatewayPort") || "18789";
u.pathname = "/";
u.search = "";
const loc = new URL(window.location.href);
const requestedPort = Number.parseInt(
params.get("gatewayPort") ?? "",
10,
);
const gatewayPort =
Number.isInteger(requestedPort) &&
requestedPort > 0 &&
requestedPort <= 65_535
? requestedPort
: 18_789;
const gatewayHost = params.get("gatewayHost") || loc.hostname || "127.0.0.1";
const u = new URL(`ws://${gatewayHost}:${gatewayPort}/`);
return u.toString();
})();
logStatus("boot: connecting gateway");
logStatus(`boot: connecting gateway (${wsUrl})`);
const gateway = new GatewaySocket(wsUrl);
const hello = await gateway.connect();
const healthOkRef = { current: Boolean(hello?.snapshot?.health?.ok ?? true) };