getHealth обогащён: вердикт здоровья (ok/warning/critical) по порогам
(память %, диск, ошибки/24ч, лаг event-loop, размер БД) + причины; реальный
% памяти, лаг event-loop (perf_hooks), load average, свободное место на диске
(statfs), PID/NODE_ENV, версия+git-commit, число активных SSE-соединений,
размер WAL, разбивка БД по крупнейшим таблицам.
sse.js: экспорт stats() (онлайн-пользователи/гости/соединения).
admin.js loadHealth: светофор-баннер вердикта с причинами, тумблер
авто-обновления (live, поллинг 5с с самоостановкой при уходе с вкладки),
8 карточек (uptime/БД/файлы/ошибки/SSE/память/event-loop/диск), панели
платформы и активности, горизонтальные бары крупнейших таблиц БД.
Проверено: getHealth собирает полный payload, вердикт срабатывает (диск<2ГБ
→ warning), NaN-лаг защищён.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Classroom performance:
- WebSocket server (ws-server.js) for low-latency cursor & stroke preview
Replaces HTTP POST per event → eliminates per-message auth overhead
Session member cache (30s TTL) avoids SQLite query per WS message
Fallback to HTTP POST when WS not connected
- Cursor throttle reduced 100ms → 33ms (~30fps)
- Stroke preview throttle reduced 50ms → 20ms
- whiteboard.js: render() is now rAF-gated (_doRender/_rafPending)
Multiple render() calls within one frame collapse into one repaint
document.hidden check — zero CPU when tab is in background
visibilitychange listener restores canvas on tab focus
Guest board:
- guestClassroom.js route: public token-based read-only access
- guest-board.html: name entry + read-only whiteboard + SSE
- SSE: addGuestClient/removeGuestClient/emitToGuests
Screen share picker:
- Discord-style modal with tab switching (screen/window/tab)
- Live video preview before confirming share
- useExistingScreenStream() in ClassroomRTC
Fullscreen exit overlay:
- #cr-fs-exit-overlay button inside cr-board-wrap
- Visible only via CSS :fullscreen selector (touchpad users)
File sharing from library:
- Teacher picks file from library, sends as styled card in chat
- crDownloadLibraryFile() fetches with Bearer auth
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>