Files
h-school/docs/phases/19-presence-screen.md
T
Leonid Pershin 3c54f981b7
ci / server (push) Failing after 3m44s
ci / client (push) Successful in 15s
Update wire protocol to version 7 and enhance presence management features
- Bumped the wire protocol version to 7, reflecting significant changes in the communication structure.
- Introduced a new presence message type for real-time occupancy updates, including node activity and individual presence states.
- Updated the API to include a directory endpoint for fetching short id→name mappings, improving client-side name resolution.
- Revised the map snapshot structure to be static, with people and current lessons now handled through the presence stream.
- Enhanced client-side handling of presence updates, including UI adjustments to display live occupancy and activity.
- Updated documentation to reflect the new protocol features and changes in presence management.
- Added tests to validate the new presence functionalities and ensure robust handling of real-time data.
2026-08-19 17:00:53 +03:00

4.2 KiB

Фаза 19. Присутствие на экране

Зависимости

Зачем

Школа впервые видна живой: в дереве идут числа, на перемене коридор наполняется, к звонку кабинеты сходятся обратно.

Задачи

  • Новое сообщение присутствия, ~2 раза в секунду, только по открытой школе: узлы со счётчиками и люди с их узлом и состоянием
  • Снимок карты становится статическим: люди и текущий урок уезжают в присутствие, структура уходит один раз при открытии. Пересылка на смене слота убирается
  • ProtocolCodec.cs, protocol.ts и docs/protocol.md правятся тем же коммитом, версия бумпится до 7
  • Справочник «id → имя» по HTTP: клиент забирает один раз при открытии школы и перечитывает, увидев незнакомый id. Имена в кадр присутствия не кладутся
  • Дерево: число людей рядом с узлом, живое. Пустой узел остаётся без числа
  • Панель локации: кто здесь сейчас, списком с именами; урок в комнате берётся из присутствия, а не из снимка
  • Карточка человека: где он сейчас — узел, «в пути» или «вне школы»
  • Присутствие приходит по всей школе, выбранный узел фильтрует клиент
  • Кадр часов несёт разрешение на пропуск; клиент это разрешение не вычисляет
  • Намерение «пропустить» — своё сообщение, как пауза и скорость. Сервер проверяет условия заново: кадр из браузера не доверенный
  • Кнопка рядом с паузой и скоростями: появляется только когда сервер разрешил, подписана датой, к которой перенесёт
  • Строки через t(...), обе локали

Тесты, без которых фаза не закрыта

  • Байтовая раскладка присутствия сходится с обеих сторон
  • Круговой прогон сообщения: сервер → клиент → те же значения
  • Снимок карты больше не содержит людей и урока
  • Кадр часов с разрешением на пропуск читается обеими сторонами одинаково
  • Пропуск, присланный в учебное время, сервер отбрасывает, а не исполняет

Критерий готовности

  • Открыть школу в 8:25 и увидеть, как двор и вестибюль пустеют, а кабинеты наполняются
  • На перемене коридор — самый людный узел дерева
  • В каникулы дерево без чисел, а карточки говорят «вне школы»
  • В пятницу после уроков дождаться, пока школа опустеет, нажать «пропустить» и оказаться в понедельник в 6:00; вечером буднего дня та же кнопка ведёт в завтрашнее утро
  • dotnet test, npm test и npm run build проходят

Стоп

Не рисовать перемещение анимацией. Не заводить серверный OpenLocation. Не добавлять нужды и действия.