Кооперативный платформер для двоих: три локации, подарки и общий финиш. Один создаёт комнату и отправляет ссылку, второй подключается. Оба нажимают «Готов».
- TypeScript, Node.js 24.
- Клиент: Preact, PixiJS 8, Vite.
- Сервер: HTTP на Node.js, WebSocket через
ws, валидация данных через Zod. - Тесты: Vitest, Testing Library, Playwright; линтинг: ESLint. Для E2E нужны nginx, openssl и Chromium из Playwright.
- Деплой: Docker, Docker Compose, nginx.
- Хранение комнат: в памяти сервера, без базы данных.
npm ci
npm run dev:server
# в другом терминале
npm run devОткрыть http://localhost:5173/date-run/.
Для телефона в той же сети откройте http://<IP-компьютера>:5173/date-run/. При запуске dev:server добавьте этот origin (схема, IP и порт, без /date-run/) в ALLOWED_ORIGINS через запятую вместе с адресами localhost. После изменения переменной сервер нужно перезапустить.
Стрелки или A/D - движение, пробел/W/↑ - прыжок, E - взять свой подарок. На телефоне есть экранные кнопки. После подарков нужно одновременно встать на две площадки и встретиться у арки.
npm run lint
npm run typecheck
npm test
npm run build
ALLOWED_ORIGINS=http://localhost:3000 npm startСборка доступна на http://localhost:3000/date-run/. Для production нужны ALLOWED_ORIGINS, NODE_ENV=production и APP_REVISION (40 символов Git SHA). Шаблоны Docker и nginx - в deploy/. Лаунчер deploy/launcher.sh требует существующий коммит и чистую рабочую копию; незакоммиченные изменения к релизу не допускаются.
Комнаты хранятся в памяти одного сервера: перезапуск завершает игры. При обрыве связи место сохраняется 30 секунд после обнаружения отключения.
npm run test:e2e запускает обычный E2E-набор в CI. Для отдельной проверки под CPU-нагрузкой запустите npm run test:e2e:slow: Chromium замедляется в 4 раза на каждой странице. На Linux можно ограничить весь процесс двумя доступными CPU: taskset -c 0,1 npm run test:e2e:slow (номера CPU проверьте через taskset -pc $$). Замедленный профиль временно выполняется отдельно от CI на время разбора reconnect-сбоя; прогоны используют общие порты и запускаются последовательно. Повторы упавших сценариев отключены.