# x0gp · PoC web client Минимальный vanilla JS клиент для проверки PoC-сервера из этой же папки. Без сборки, без зависимостей — открывается в браузере. ## Запуск Вариант А — открыть файл напрямую: ```bash # Windows start web/index.html # Linux xdg-open web/index.html # macOS open web/index.html ``` > Некоторые браузеры не разрешают `WebSocket` к чужим origin со страницы, > открытой по `file://`. Если что — поднимите мини-сервер (вариант Б). Вариант Б — раздать через тот же poc-server: В `cmd/poc-server/main.go` есть TODO — добавить `http.FileServer` для `web/`. После этого клиент будет доступен по `http://localhost:8080/`. Вариант В — `python -m http.server`: ```bash cd server/web python -m http.server 5173 # открыть http://localhost:5173/ ``` ## Подключение к серверу 1. Запустите `poc-server` (см. корневой `server/README.md`). 2. В UI клиента проверьте `WS URL` — по умолчанию `ws://localhost:8080/ws`. 3. Укажите `driver_id` (например `driver-1`). 4. **Connect** → **Join race**. 5. Управление: - `W` / `↑` — газ - `S` / `↓` — тормоз - `A` / `←` — руль влево - `D` / `→` — руль вправо - `Space` — ручник 6. На canvas появится ваша машинка (синяя) и машинки других подключённых драйверов (оранжевые). ## Что смотреть - **tick Hz** в верхней панели — частота приходящих `race_snapshot`. Должно держаться ~30 Hz. - **rtt** — round-trip ping/pong, в PoC без сети это 0–2 ms. - **seq** — растёт с каждым отправленным сообщением. - **Телеметрия** — speed/heading/lap/sector вашей машинки. - **Лог** — все входящие/исходящие сообщения (кроме ping/pong). ## Что PoC делает - Открывает WebSocket, шлёт `client_hello`. - По кнопке— `join_race` / `leave_race`. - Каждые 33 ms (≈30 Hz) шлёт `input_state` (throttle/brake/steer/handbrake). - Каждые 1000 ms шлёт `ping` для измерения RTT. - Получает `race_snapshot` и рисует все машинки на канвасе. - Получает `input_ack`, `race_event`, `correction`, `error` и логирует их. ## Что PoC НЕ делает - Нет предиктивного сглаживания (interpolation/extrapolation) — увидите «дёрганье», это нормально для PoC. - Нет клиент-сайд предикции — добавим, когда появится настоящая модель физики. - Нет тач-управления для мобильных — клавиатура только. - Нет авторизации, биллинга, чата — это всё вне PoC. ## Что дальше - Когда `proto/` будет сгенерирован в Go и JS — заменим JSON на protobuf. - Подключим `gRPC-Web` или бинарный WS-фрейминг. - Добавим предиктивный слой и интерполяцию. - Добавим мобильный layout (touch steering + pedals).