-
Notifications
You must be signed in to change notification settings - Fork 0
overview architecture
Sergey Bogorad edited this page Jul 29, 2026
·
4 revisions
Вся бизнес-логика каждого тренажёра изолирована в хуке use{Module}Engine.ts. UI-компоненты получают только state и экшены, не содержат логики.
UI Component ←→ use{Module}Engine ←→ EventBus ←→ Analytics / Subscribers
| Событие | Эмиттер | Подписчики |
|---|---|---|
CELL_CLICK |
Engine | Analytics, Recorder |
TRAINING_COMPLETE |
Engine | DB-writer, Leaderboard |
MISTAKE_MADE |
Engine | Analytics |
STABILITY_UPDATE |
Analytics | UI (HUD widgets) |
DIFFICULTY_SUGGESTION |
Analytics worker | Engine (Adaptive mode) |
Все генераторы (schulte-generator.ts, движки N-Back, Spatial) принимают seed. Это гарантирует воспроизводимость тестов:
const grid1 = generateGrid(5, 'classic', 42);
const grid2 = generateGrid(5, 'classic', 42);
expect(grid1).toEqual(grid2); // всегда trueТекущий аналитический слой:
-
JS Worker:
src/workers/analytics.worker.tsдержит расчёты за worker-границей -
JS Metrics:
src/lib/cognitive-metrics.ts— текущие реализации метрик -
WASM-ready contract: будущий Rust/WASM модуль должен сохранить публичный
ClickEventконтракт
server.ts отдаёт и API, и статику Vite-билда. Канонический порт: 3006.
graph TD
UI[UI Component] --> Engine[use{Module}Engine]
Engine --> Bus[EventBus]
Bus --> Analytics[Analytics Worker]
Bus --> Persistence[DB Writer]
Bus --> UI_Widgets[HUD / ConcentrationCurve]
Analytics -->|DIFFICULTY_SUGGESTION| Engine
| Система | Зона ответственности |
|---|---|
| Prisma / PostgreSQL | Сессии тренировок, XP, история, лидерборд |
| Express / Socket.io | API, real-time дуэли, SymbolChat |
| StorageGateway | Аудируемый доступ браузера к localStorage |
- EventBus:
src/core/events/event-bus.ts - Engine pattern:
src/hooks/useSchulteEngine.ts(пример) - Analytics worker:
src/workers/analytics.worker.ts - Cognitive metrics:
src/lib/cognitive-metrics.ts - Server entry:
server.ts