fix(room): нормализовать сентинел "default" выбора устройства

usePersistentUserChoices хранит «устройство не выбрано» как литерал
"default", а не пустую строку — deviceId: userChoices.audioDeviceId ||
undefined на него не срабатывал, и в deviceId уходил сентинел. В Chrome
это давало OverconstrainedError на первом визите с лишним неудачным
проходом до фолбэка. Та же нормализация уже была сделана в 0.0.33 для
useDeviceCheckAccess.ts — здесь то же самое для комнаты.
This commit is contained in:
2026-08-10 16:09:44 +03:00
parent 9abe5b5102
commit 1ab146e4b0

View File

@@ -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). Читаем один раз при монтировании —