This commit is contained in:
2026-10-17 20:16:24 +07:00
parent f5dc9c1e5b
commit 40456eebf1
16 changed files with 2122 additions and 54 deletions
+67
View File
@@ -107,3 +107,70 @@
Инструкция ручной проверки — docs/SCREEN-005_ACCEPTANCE.md, запуск npm run acceptance.
- Следующий шаг: SCREEN-006 — существующая авторизация, выбор игры/скачивание
через интерфейс, снимок результатов и получение команд существующего сервера.
## SCREEN-006 — Подключение игры и синхронизация с сервером
- Статус: `DONE`
- Зависимости: SCREEN-002, SCREEN-005 (DONE, см. COMPLETED_TASKS.md).
- Цель: выбирать доступную организатору игру онлайн и сохранять автономность показа.
- Объём: существующая авторизация, список игр, загрузка пакета, снимок результатов,
индикатор связи, проверка новой версии материалов, синхронизация статуса показа.
Телефон отправляет команды существующему серверу сайта; desktop получает
обновления через экранную сессию и GetScreenState (существующий polling 1000 мс).
Серверные команды применяются локальным контроллером к подготовленным файлам;
повторная версия не применяется дважды. Прямого подключения телефона к desktop нет.
Уточнить минимальный серверный контракт по фактической реализации.
- Готовность: готовая игра открывается после перезапуска офлайн; секреты хранятся
средствами ОС, не в пакете; истечение сессии не обрывает уже подготовленный
локальный показ; обновления активируются явно. Результаты имеют время снимка.
Возврат сети не повторяет устаревшие команды поверх локальных действий.
При доступном сервере телефон управляет показом через существующий сайт; без сети
воспроизведение и пульт компьютера продолжают работать.
- Проверка: сценарии offline/reconnect/истёкшей сессии/обновления игры; проверки
затронутых репозиториев; существующий браузерный экран продолжает работать.
- Не входит: полноценная офлайн-игра, LAN-сервер и отдельный мобильный пульт desktop.
- Дата: 2026-10-17. Реализация только screen; бэкенд, сайт и protobuf не менялись.
- Результат: вход по email/паролю, проверка существующих прав, список игр,
единое обновление JWT для конкурентных запросов, выход без прерывания показа.
Токены и экранная сессия остаются в main; сохранение через safeStorage отдельно
от пакетов. При недоступном шифровании ОС (включая Linux basic_text) вход только
в памяти. Пароль не сохраняется, отказ в правах удаляет сохранённый вход.
- Материалы: загрузка/прогресс/отмена/проверка описания/повторная загрузка/удаление
через существующий PackageStore. Выбранная игра обновляется только при закрытом
показе; на время подготовки запрещены её открытие и смена выбора. Ошибка/отмена
сохраняют прежний пакет; новая версия включается остановленной. Ключ выбранного
пакета сохраняется, после перезапуска проверенная игра доступна офлайн без
автоматического открытия окна и звука. Снимок результатов сохраняется отдельно
по ключу пакета, содержит только поля таблицы и время получения; ошибка API
оставляет последний успешный снимок. Сервер выдаёт результаты после finish.
- Управление: по выбору владельца общий пульт телефона и компьютера. Создание и
привязка экранной сессии существующим API; GetScreenState раз в 1000 мс только
при открытом показе, без параллельных запросов. Первая версия при подключении,
повторном открытии и восстановлении сети — исходная отметка без старых команд.
Локальные действия немедленны и не рассылаются другим экранам. Версии int64
сравниваются без потери точности, повторы и откат версии не повторяют команды;
устаревшие ответы от другого окна/пакета/сессии отклоняются. Звук учитывается
независимо от версии, первоначальное назначение звука не запускает медиа.
Неподготовленные плейлисты не стримятся; переход музыки локальный, серверный
AdvanceScreenMusic вызывается однократно только для соответствующего трека.
- Контракт: сервер не принимает точные подтверждения проигрывания/ошибки от экрана.
На сайте сохраняется существующий heartbeat connected/disconnected; фактические
подтверждения видны в desktop. Последнее состояние может объединять несколько
команд между опросами. metadataVersion не обнаруживает замену байтов по тому же
URL, для этого нужна повторная загрузка. После неопределённого исхода перехода
музыки повторного POST нет. Права и публичная выдача файлов остались прежними.
- Проверки: type-check, ESLint, Stylelint, 63 теста (17 новых), сборка и GUI smoke —
PASS. GUI с реальным тестовым HTTP-сервером проверил форму входа, загрузку,
привязку, серверный play локального WAV, запрет обновления во время показа,
локальную паузу при повторном опросе, offline/reconnect без старого STOP,
новую команду после reconnect, результаты/выход и запреты IPC для окна показа.
Старые сценарии всех восьми режимов, медиа, Range и preview также прошли.
git diff --check — PASS; новые зависимости не добавлены, commit/push не выполнялись.
- Ограничения: тестовый сервер воспроизводит текущий JSON-контракт; рабочий сервер,
реальные игровые файлы и прежний браузерный экран вручную не проверялись.
GUI выполнен на Linux x64 с синтетическим внешним дисплеем и тестовыми флагами
no-sandbox/mute-audio/disable-gpu. Хранилища секретов остальных ОС, физический
звук/проектор и матрица платформ остаются для ручной приёмки; релизные архивы
не пересобирались. SCREEN-001/SCREEN-004 сохраняют IN_PROGRESS.
- Инструкция: docs/SCREEN-006_ACCEPTANCE.md. Следующий этап: SCREEN-007 —
устойчивость при отключении дисплея, управление сном и восстановление окон.