Node's default keepAliveTimeout (5s) is shorter than ingress-nginx's
default upstream keepalive idle timeout (60s). Under that mismatch,
nginx can forward a request onto a pooled connection Node has *just*
closed, which the browser sees as a 502 — and it never shows up in
this process's own traces because Node never received the request.
/api/rooms is polled every 5s from idle clients, landing almost
exactly on that 5s boundary, which is why it was the one showing up
for external users.
Also add abort/slow-request logging (tagged with the active trace ID
so it can be pivoted to from RUM) and a clientError handler, so a
genuine backend-side failure is now visible instead of indistinguishable
from the proxy-side race.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
New visitors (no nickname in localStorage) get a blocking welcome
modal instead of a silently-generated guest-N name, so everyone in a
room has a name they actually chose. It doubles as quick-start help
(join a channel, mic/deafen/share shortcuts, drag-to-reposition on the
spatial map) reachable any time via the new ? button. The sidebar nick
field no longer falls back to a random name when cleared — it now
just rejects the blank edit.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The custom pointer-capture + frozen-camera drag math was fragile and
felt worse than before. Konva handles the drag gesture itself; the
"me" node's screen position stays pinned to the stage center via
dragBoundFunc + a worldLayer offset that recenters on every dragmove,
so the world pans under the avatar instead of the avatar drifting off
center. Grid, peers, and the audible-range circle all live in the same
world-space layer so they pan together.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Mic button now swaps glyph (mic vs muted) and syncs immediately on
join/leave/load instead of relying on a subtle CSS underline.
- Spatial minimap camera now follows the local user, matching how the
audio panning is already centered on them, instead of plotting
absolute room coordinates stretched across whatever width the
screen happens to be.
- Screen-share tiles now show a speaking glow and muted badge, kept in
sync on the existing audio-meter tick without tearing down <video>
elements.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>