Кто на карте

Кто сейчас работает с картой этого города и какие правки сети только что сделали другие — в вебе и в десктопе.

Где найти
значок с людьми в шапке справа, рядом с меню пользователя.
Права
доступно всем, кто вошёл.
Читаю как

Возможности

  • Кто сейчас открыл карту этого города: имя, что правит («правит: …»), кнопка «Показать, где смотрит» — перейти к его виду карты.
  • «Последние правки» сети — веба и десктопа: кто, что и сколько объектов; «Показать на карте» приближает к месту правки.
  • Сообщение «Изменения на карте — …», когда другой пользователь сохранил правку, — не чаще раза в 10 секунд.
  • Тайлы сети обновляются сами, когда данные изменились (правка, расчёт, импорт), — без перезагрузки страницы.

Как это работает

Присутствие. Каждая открытая вкладка раз в 20 секунд сообщает серверу центр и масштаб своей карты и что сейчас правит (таблица tgid_live_presence). Через 60 секунд без сообщений человек пропадает из списка; при закрытии вкладки — сразу.

Лента правок. Сервер раз в 2 секунды читает новые строки журнала изменений audit_log. Журнал пишут триггеры базы, поэтому в ленту попадают и правки из десктопа («десктоп (имя)»). Новости уходят в браузер одним потоком событий (SSE): кто пришёл и ушёл, что изменилось, новая версия данных. Поток переподключается сам раз в 10 минут и после обрыва связи.

Версия данных. Сервер считает версию данных карты по счётчикам записей таблиц базы города. Служебные таблицы (само присутствие, вебхуки, показания датчиков, короткие ссылки) в счёт не идут. Новая версия — новые адреса тайлов, и карта перерисовывает сеть свежими данными. Пока версия та же, все пользователи получают одни и те же тайлы из кеша.

Что нужно для работы

  • Вход в систему (любая роль).
  • Миграция 20261031_live_presence.sql в базе города (API применяет её сам).
  • Прокси не должен держать поток /api/v1/live/stream в буфере: API сам отвечает заголовком X-Accel-Buffering: no, nginx его понимает.

Шаги

  1. Значок «Кто на карте» в шапке; зелёный счётчик — сколько ещё людей сейчас на карте.

    Кто на карте: шаг 1

  2. Нажмите значок: список «Сейчас на карте» (кто и что правит, кнопка «Показать, где смотрит») и «Последние правки» с переходом к месту на карте.

    Кто на карте: шаг 2

Примеры

Двое правят один квартал. Оператор открыл карточку участка; у второго пользователя в списке «Сейчас на карте» рядом с его именем — «правит:» и что именно. Если оба откроют этот участок, второй увидит предупреждение «Этот объект сейчас правит …».

Правка в десктопе. Инженер в десктопе меняет 12 узлов. Через 2–4 секунды в «Последних правках» веба — «десктоп (инженер): узлы — 12», а сеть на карте перерисована.

Если не получается

  • «Нет связи с сервером — переподключаемся…» — поток событий оборвался (сеть, перезапуск API); список вернётся сам.
  • Значка нет — на стенде без входа и без связи с потоком он скрыт.

Для администратора

  • Пределы на процесс API: не больше 500 подписчиков потока (дальше — ответ 503), 50 объектов в одном событии, 2000 строк журнала за один опрос.
  • Поток — длинный HTTP-ответ: таймаут чтения прокси должен быть больше 15 секунд (сервер шлёт пустое событие раз в 15 секунд). Буферизацию nginx выключает сам по заголовку X-Accel-Buffering: no.

Для разработчика

  • API: routers/live.py, database/live.py — GET /api/v1/live/stream (SSE; события hello, presence, network.changed, data_version, resync), POST /api/v1/live/presence, DELETE /api/v1/live/presence/{session_id}; версия данных — DATA_VERSION_SQL, служебные таблицы — DATA_VERSION_IGNORED_TABLES; тот же SQL отдаёт GET /api/v1/map/data-version.
  • Веб: components/LivePresence.vue, stores/liveStore.ts, utils/liveStream.ts (поток через fetch: EventSource не умеет заголовок авторизации).
  • Тесты: tests/test_live.py, tests/test_map_data_version.py; веб — tests/utils/liveStream.spec.ts.
Хотите увидеть эту функцию на своих данных?Покажем ТГИД на демонстрации и ответим на вопросы инженеров.
Запросить демо