Document private admin console milestone
This commit is contained in:
@@ -0,0 +1,62 @@
|
|||||||
|
_model: devlog-entry
|
||||||
|
---
|
||||||
|
schema_version: 1
|
||||||
|
---
|
||||||
|
title: Private operations arrive with graceful viewer disconnects
|
||||||
|
---
|
||||||
|
date: 2026-08-17
|
||||||
|
---
|
||||||
|
author: Codex and Christopher Chambers
|
||||||
|
---
|
||||||
|
summary: Twungeon gained a private, authenticated operator console and last-socket disconnect handling that sends absent viewers directly into AutoGuard instead of delaying every player phase.
|
||||||
|
---
|
||||||
|
tags: implementation, deployment, operations, admin panel, networking, security, multiplayer, AutoGuard, testing
|
||||||
|
---
|
||||||
|
source_commit: 8b1d14dceac8f9645f70cab106a045ed64bcd71c
|
||||||
|
---
|
||||||
|
body:
|
||||||
|
|
||||||
|
Live multi-viewer testing revealed an awkward failure mode: when a viewer left
|
||||||
|
the channel, their character remained in the dungeon with unspent action points.
|
||||||
|
Keeping the character was intentional because a refresh or temporary network
|
||||||
|
failure should not destroy a viewer's progress, but waiting for its action-point
|
||||||
|
deadline made each later player phase appear stuck.
|
||||||
|
|
||||||
|
Twungeon now tracks authenticated WebSocket connections per Twitch user. A
|
||||||
|
viewer is marked disconnected only after their final socket closes, so a second
|
||||||
|
tab remains valid and closing one of several connections does not incorrectly
|
||||||
|
end the turn. On the last close, unused action points immediately become Guard.
|
||||||
|
Extension-bound characters that remain disconnected also enter AutoGuard as
|
||||||
|
each later phase starts. Their characters stay on the board for a safe
|
||||||
|
reconnection while connected viewers can complete the phase normally.
|
||||||
|
|
||||||
|
The same milestone adds a private operator console for live troubleshooting.
|
||||||
|
It runs on a separate listener rather than the public Twungeon origin. The
|
||||||
|
production listener binds specifically to `10.138.4.44:3001`, and the
|
||||||
|
application rejects source addresses outside `10.138.0.0/16`. Basic
|
||||||
|
authentication, a unique generated deployment password, per-process form
|
||||||
|
tokens, no-store responses, a restrictive Content Security Policy, and frame
|
||||||
|
denial provide additional boundaries. The port is not exposed through the
|
||||||
|
public web listener or reverse proxy.
|
||||||
|
|
||||||
|
The server-rendered console shows the current run, floor, phase, players,
|
||||||
|
Twitch readiness, OAuth authorization, uptime, and the latest 40 action-log
|
||||||
|
entries. An operator can disconnect a viewer into AutoGuard, remove a character,
|
||||||
|
end the active player phase, or reset the run. These operations call the same
|
||||||
|
authoritative game core used by viewer commands and broadcast the resulting
|
||||||
|
snapshot to connected clients.
|
||||||
|
|
||||||
|
Configuration remains opt-in. The admin listener will not start unless it is
|
||||||
|
explicitly enabled with a `10.138.x.x` bind address and a password of at least
|
||||||
|
16 characters. Operator documentation records the environment settings,
|
||||||
|
network boundary, authentication flow, and the requirement not to publish or
|
||||||
|
proxy the private port.
|
||||||
|
|
||||||
|
Validation covered linting, strict type checking, a production build, 28 domain
|
||||||
|
tests, and 13 integration and end-to-end tests. Deployment checks confirmed
|
||||||
|
that the public service and Twitch adapter were ready, authenticated admin
|
||||||
|
health succeeded on the private address, unauthenticated access was rejected,
|
||||||
|
and the admin port was not listening on loopback.
|
||||||
|
|
||||||
|
The private operations and graceful-disconnect implementation is recorded in
|
||||||
|
[commit `8b1d14dceac8f9645f70cab106a045ed64bcd71c`](https://git.labyricorn.com/Labyricorn/Twungeon/commit/8b1d14dceac8f9645f70cab106a045ed64bcd71c).
|
||||||
Reference in New Issue
Block a user