5.2 KiB
5.2 KiB
Runtime Flow
Connect Flow
- User clicks connect.
- Client validates auth form and sets up local media.
- Client connects signaling websocket from the configured app origin.
- Server accepts the socket only on the configured instance websocket path and when the browser
OriginmatchesCHGRID_HOST_ORIGIN, then attempts cookie-based session resume from websocket handshake cookie (chgrid_session_token). - If resume does not authenticate, server sends
auth_required.- includes
authPolicylimits for username/password.
- includes
- Client sends
auth_loginorauth_register(or explicitauth_resumeif provided by caller). - Server sends
auth_result.- includes role + permissions for authenticated session.
- Client persists authenticated session into instance-scoped server-managed
HttpOnlycookie helpers under the active app base path viaGET <base_path>auth/session/set(Authorization: Bearer <sessionToken>,X-Chgrid-Auth-Client: 1), and clears it viaGET <base_path>auth/session/clearon logout/session errors.- the optional PHP media proxy validates that same cookie through
GET <base_path>auth/session/checkbefore relaying media
- the optional PHP media proxy validates that same cookie through
- Server sends
welcomewith users/items snapshot. - Client:
- applies
welcome.worldConfig.gridSizefor authoritative grid bounds/rendering - applies
welcome.worldConfig.movementTickMsas movement pacing guidance - applies
welcome.worldConfig.movementMaxStepsPerTickfor movement-rate parity - uses
welcome.playeras authoritative starting position (restored from server-side account state when available) - records
welcome.serverInfo(instanceId,version) for restart detection - if
welcome.serverInfo.versiondiffers from running client version, auto-reloads the page - applies
welcome.uiDefinitionsfor item menus/properties/options, server-backed command metadata, item-management metadata, and admin menu labels/order - sends initial
update_positionecho from server-assigned starting tile - sends initial
update_nickname - creates peer runtimes for known users
- syncs item runtimes (
radio,emit) - applies audio layer state
- starts signaling heartbeat monitor
- starts game loop
Main Loop
Each frame:
- Handle local movement input.
- Send movement intents; server remains authoritative on accepted movement updates.
- Update spatial voice audio.
- Update spatial radio audio.
- Update spatial item emit audio.
- Draw canvas scene.
Message Handling
Core incoming message effects:
signal: WebRTC negotiation and ICE exchange.auth_required: prompt client to authenticate before gameplay messages.auth_result: auth success/failure with optional session token + account metadata +authPolicy.auth_permissions: live permission refresh (role + permission set) after role/permission admin changes.admin_roles_list: role metadata + user counts + permission keys for role management UI.admin_users_list: user metadata list for role/ban admin flows.admin_action_result: success/error for role/user admin mutations.update_position: update peer position; may play movement/teleport world sound.teleport_complete: play peer teleport landing sound at final tile.update_nickname: update peer display name.chat_message: append/readable status; optional system sound class.item_upsert: replace item snapshot and resync item runtimes.item_remove: remove item and cleanup runtimes.item_action_result: success/error status for actions.item_use_sound: play one-shot spatial sample (world layer gated).item_piano_note: start/stop synthesized piano notes from remote users (item layer gated).item_piano_status: structured piano mode/record/playback transitions (client runtime state).pong:- positive
clientSentAt: user ping response (Pcommand) - negative
clientSentAt: internal heartbeat response
- positive
Stale Connection Recovery
- If websocket closes unexpectedly, client starts reconnect flow immediately.
- While running, client also sends heartbeat
pingevery 10 seconds (fallback for silent half-open cases). - If one heartbeat
pongis missed (10-second interval), client starts reconnect flow. - Reconnect flow waits 5 seconds and retries up to 3 times.
- If reconnect lands on a different
welcome.serverInfo.instanceId, client announces server restart. - Connect/reconnect status message is emitted from
welcomeand includes server version.
Authorization Runtime
- Server enforces item/chat/nickname/voice/admin permissions for each packet.
- Role and permission changes apply live to connected users without reconnect.
voice.sendrevocation is pushed immediately viaauth_permissions; client mutes outbound voice track.
Disconnect/Cleanup
On disconnect:
- Close signaling.
- Stop heartbeat monitor.
- Stop local media tracks.
- Cleanup peers and all audio runtimes.
- Reset UI/mode state and lists.
Runtime Components
PeerManager: peer connection lifecycle and remote track attach.RadioStationRuntime: shared stream sources + per-item output/effects/spatialization.ItemEmitRuntime: per-item looping emit source + spatialization.AudioEngine: shared audio context, samples, effects, voice graph.