- самом Gateway, и
- клиентах, подключенных к Gateway (приложение для Mac, WebChat, CLI и т. д.)
Поля presence (что отображается)
Записи presence — это структурированные объекты с такими полями, как:instanceId(необязательно, но настоятельно рекомендуется): стабильная идентичность клиента (обычноconnect.client.instanceId)host: удобное для человека имя хостаip: IP-адрес по принципу best-effortversion: строка версии клиентаdeviceFamily/modelIdentifier: подсказки об оборудованииmode:ui,webchat,cli,backend,probe,test,node, …lastInputSeconds: «секунды с момента последнего пользовательского ввода» (если известно)reason:self,connect,node-connected,periodic, …ts: метка времени последнего обновления (мс с начала эпохи)
Производители (откуда берется presence)
Записи presence создаются несколькими источниками и объединяются.1) Собственная запись Gateway
Gateway всегда создает «собственную» запись при запуске, чтобы интерфейсы показывали хост Gateway еще до подключения клиентов.2) Подключение WebSocket
Каждый WS-клиент начинает с запросаconnect. После успешного рукопожатия
Gateway выполняет upsert записи presence для этого подключения.
Почему разовые команды CLI не отображаются
CLI часто подключается для коротких разовых команд. Чтобы не засорять список Instances,client.mode === "cli" не превращается в запись presence.
3) Маяки system-event
Клиенты могут отправлять более насыщенные периодические маяки через метод system-event. Приложение для Mac
использует это, чтобы сообщать имя хоста, IP и lastInputSeconds.
4) Подключения Node (роль: node)
Когда узел подключается через WebSocket Gateway сrole: node, Gateway
выполняет upsert записи presence для этого узла (тот же поток, что и для других WS-клиентов).
Правила объединения и дедупликации (почему важен instanceId)
Записи presence хранятся в единой карте в памяти:
- Записи индексируются по ключу presence.
- Лучший ключ — стабильный
instanceId(изconnect.client.instanceId), который сохраняется после перезапусков. - Ключи нечувствительны к регистру.
instanceId, он может появиться как
дублирующаяся строка.
TTL и ограниченный размер
Presence намеренно эфемерен:- TTL: записи старше 5 минут удаляются
- Максимум записей: 200 (самые старые удаляются первыми)
Ограничение удаленного доступа/туннеля (loopback IP)
Когда клиент подключается через SSH-туннель / перенаправление локального порта, Gateway может видеть удаленный адрес как127.0.0.1. Чтобы не перезаписать хороший IP,
сообщенный клиентом, удаленные loopback-адреса игнорируются.
Потребители
Вкладка Instances в macOS
Приложение macOS отображает выводsystem-presence и применяет небольшой индикатор состояния
(Active/Idle/Stale) на основе возраста последнего обновления.
Советы по отладке
- Чтобы увидеть сырой список, вызовите
system-presenceдля Gateway. - Если вы видите дубликаты:
- убедитесь, что клиенты отправляют стабильный
client.instanceIdв рукопожатии - убедитесь, что периодические маяки используют тот же
instanceId - проверьте, отсутствует ли
instanceIdв записи, полученной из подключения (дубликаты ожидаемы)
- убедитесь, что клиенты отправляют стабильный
Связанное
Индикаторы набора текста
Когда отправляются индикаторы набора текста и как их настраивать.
Потоковая передача и разбиение на фрагменты
Исходящая потоковая передача, разбиение на фрагменты и форматирование для отдельных каналов.
Архитектура Gateway
Компоненты Gateway и протокол WebSocket, который управляет обновлениями presence.
Протокол Gateway
Проводной протокол для
connect, system-event и system-presence.