Commit Graph

12 Commits

Author SHA1 Message Date
ameer
b8e29e9b1e fix(room): widen WS handler exception scope to JSONDecodeError + RuntimeError
A single malformed JSON message (or a "WebSocket is not connected" race
on disconnect) was killing the per-client handler with an uncaught
exception in the ASGI app. The surrounding try/except only caught
WebSocketDisconnect, so the server would log a stack trace and the
client would silently drop.

Wrap receive_json() to catch JSONDecodeError, send a structured
{"type":"error","code":"bad_message"} ack, and continue. Widen the
outer except to (WebSocketDisconnect, RuntimeError) so disconnect
races on send/receive after close exit the handler cleanly instead
of bubbling up the ASGI stack.

Both student_ws and instructor_ws hardened in parallel. 31/31 pytest
suite still passes; this fixes the recurring fuzz-scenario warn and
the cycle-187-style cascade observed in the stress loop.
2026-05-02 17:31:25 +08:00
ameer
95a4dd2475 tests/stress: add Node-based adversarial stress harness
Two suites under tests/stress/, plus a tmux-friendly run_loop.sh
runner. Both boot a fresh uvicorn on an isolated DB per cycle and
log JSON line summaries to runs/.

api_stress.mjs covers WS-level scenarios that the existing pytest
suite does not exercise: 20-student happy path, late joiners with
correct remaining_ms, mid-question disconnect, browser-sleep + wake
to a different question_idx, cookie tampering and cross-session
cookie reuse, duplicate student_id, bad submit (out-of-order, wrong
idx, resubmit no-op), close-boundary race with auto-close, malformed
JSON fuzz, and flaky reconnect.

ui_stress.mjs drives the same flows in a real Chromium context via
playwright: happy UI, sleep/wake by closing+reopening a context with
the persisted cookie, document.cookie tampering attempt, and two
browser contexts joining with the same student_id.

Findings will be summarised in runs/summary.jsonl over time. One known
issue surfaces from the fuzz scenario: app/room.py student_ws's
receive_json call propagates JSONDecodeError out of the only
try/except (which catches WebSocketDisconnect), killing that client's
WS handler. Other clients are unaffected.
2026-05-02 15:26:18 +08:00
ameer
0f8824bd43 Add documentation and implementation report 2026-05-02 03:10:39 +08:00
ameer
63a03c0367 Add required test suite and websocket fixes 2026-05-02 03:08:48 +08:00
ameer
dfebfe2ee8 Add student and admin frontends 2026-05-02 03:02:08 +08:00
ameer
81e8173fb9 Add API routes and websocket room manager 2026-05-02 02:59:34 +08:00
ameer
a02f735c26 Add signed cookie auth 2026-05-02 02:59:34 +08:00
ameer
a4061331e5 Add scoring and pool validation 2026-05-02 02:59:34 +08:00
ameer
f689b8f297 Add configuration and database core 2026-05-02 02:59:34 +08:00
ameer
f5ac80a7a5 Scaffold project layout 2026-05-02 02:54:34 +08:00
ameer
320f1e4440 Add codex implementation brief 2026-05-02 02:52:43 +08:00
ameer
114c8af50d Add v1.0 implementation spec for live in-lecture quiz portal 2026-05-02 02:52:14 +08:00