Кто на карте
Кто сейчас работает с картой этого города и какие правки сети только что сделали другие — в вебе и в десктопе.
Возможности
- Кто сейчас открыл карту этого города: имя, что правит («правит: …»), кнопка «Показать, где смотрит» — перейти к его виду карты.
- «Последние правки» сети — веба и десктопа: кто, что и сколько объектов; «Показать на карте» приближает к месту правки.
- Сообщение «Изменения на карте — …», когда другой пользователь сохранил правку, — не чаще раза в 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 его понимает.
Шаги
Значок «Кто на карте» в шапке; зелёный счётчик — сколько ещё людей сейчас на карте.

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

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