feat(web): второй ряд дашборда и пинг участников в голосовой комнате
- дашборд инстанса: два ряда полукругов с подписями сверху — «Контейнер инстанса» (лимиты профиля) и «Сервер целиком» (вся машина); - голосовая комната: рядом с качеством связи видно пинг участника («Отличное соединение, 42 мс») и он обновляется раз в секунду. Свой RTT измеряется по статистике WebRTC, чужой приходит по data-каналу LiveKit (`glchat.latency`, lossy), поэтому пинг виден для каждого участника; - статистика берётся с любой своей дорожки: в аудио-сессии RTT раньше был недоступен (отчёт читался только с видео); - в «Аудио-видео» появился тумблер «Показывать пинг в голосовой комнате»: выключенный не опрашивает SDK и не публикует своё значение; - тесты: ряд хоста и подписи, пинг в плитке своего и чужого участника, публикация по служебной теме, выключенный пинг не дёргает SDK.
This commit is contained in:
@@ -39,9 +39,11 @@ export function VoiceSettingsSection() {
|
||||
const pttKey = useVoiceStore((state) => state.pttKey);
|
||||
const eventSoundsEnabled = useVoiceStore((state) => state.eventSoundsEnabled);
|
||||
const soundboardEnabled = useVoiceStore((state) => state.soundboardEnabled);
|
||||
const latencySharingEnabled = useVoiceStore((state) => state.latencySharingEnabled);
|
||||
const setMicActivation = useVoiceStore((state) => state.setMicActivation);
|
||||
const setPttKey = useVoiceStore((state) => state.setPttKey);
|
||||
const setEventSoundsEnabled = useVoiceStore((state) => state.setEventSoundsEnabled);
|
||||
const setLatencySharingEnabled = useVoiceStore((state) => state.setLatencySharingEnabled);
|
||||
const setSoundboardEnabled = useVoiceStore((state) => state.setSoundboardEnabled);
|
||||
|
||||
return (
|
||||
@@ -149,6 +151,21 @@ export function VoiceSettingsSection() {
|
||||
<p className="ml-6 text-xs text-fg-muted">{t('settings.voice.soundboardHint')}</p>
|
||||
</fieldset>
|
||||
|
||||
{/* Пинг участников: задержка в комнате и публикация своей (AGENT.md 7.14). */}
|
||||
<fieldset className="mt-5 border-t border-border/40 pt-4">
|
||||
<legend className="text-sm font-semibold">{t('settings.voice.latency')}</legend>
|
||||
<label className="mt-2 flex items-center gap-2 text-sm">
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={latencySharingEnabled}
|
||||
aria-label={t('settings.voice.latencySharing')}
|
||||
onChange={(event) => setLatencySharingEnabled(event.target.checked)}
|
||||
/>
|
||||
<span>{t('settings.voice.latencySharing')}</span>
|
||||
</label>
|
||||
<p className="ml-6 text-xs text-fg-muted">{t('settings.voice.latencySharingHint')}</p>
|
||||
</fieldset>
|
||||
|
||||
<p className="mt-4 text-xs text-fg-muted">{t('settings.voice.stub')}</p>
|
||||
</SettingsSection>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user