From 1ab146e4b012f80890756f12a910f7ee1faf5667 Mon Sep 17 00:00:00 2001 From: Max Ronzhin Date: Mon, 10 Aug 2026 16:09:44 +0300 Subject: [PATCH] =?UTF-8?q?fix(room):=20=D0=BD=D0=BE=D1=80=D0=BC=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D1=81=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B8=D0=BD=D0=B5=D0=BB=20"default"=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=B0=20=D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit usePersistentUserChoices хранит «устройство не выбрано» как литерал "default", а не пустую строку — deviceId: userChoices.audioDeviceId || undefined на него не срабатывал, и в deviceId уходил сентинел. В Chrome это давало OverconstrainedError на первом визите с лишним неудачным проходом до фолбэка. Та же нормализация уже была сделана в 0.0.33 для useDeviceCheckAccess.ts — здесь то же самое для комнаты. --- frontend/src/pages/RoomPage.tsx | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/frontend/src/pages/RoomPage.tsx b/frontend/src/pages/RoomPage.tsx index 14cad30..d83f808 100644 --- a/frontend/src/pages/RoomPage.tsx +++ b/frontend/src/pages/RoomPage.tsx @@ -452,8 +452,23 @@ export function RoomPage() { // dynacast: паблишер прекращает отдавать слои, на которые нет подписчиков. adaptiveStream: true, dynacast: true, - audioCaptureDefaults: { deviceId: userChoices.audioDeviceId || undefined }, - videoCaptureDefaults: { deviceId: userChoices.videoDeviceId || undefined }, + // `usePersistentUserChoices` хранит «устройство не выбрано» как литерал + // `"default"` (`@livekit/components-core`, `defaultUserChoices`), а не + // пустую строку — `|| undefined` его не отсекает, и в Chrome это давало + // `OverconstrainedError` на первом визите (см. тот же сентинел в + // `useDeviceCheckAccess.ts::openStream`). + audioCaptureDefaults: { + deviceId: + userChoices.audioDeviceId && userChoices.audioDeviceId !== 'default' + ? userChoices.audioDeviceId + : undefined, + }, + videoCaptureDefaults: { + deviceId: + userChoices.videoDeviceId && userChoices.videoDeviceId !== 'default' + ? userChoices.videoDeviceId + : undefined, + }, // Аудиовыход (колонки/наушники/bluetooth) — отдельный персист, не через // usePersistentUserChoices: LocalUserChoices LiveKit про него не знает // (см. lib/audioOutputDevice.ts). Читаем один раз при монтировании —