fix(room): разрыв связи выбрасывал участника в лобби вместо возврата в конференцию
Телефон с погасшим экраном (и просто свёрнутый браузер) выпадал из конференции: Chrome срезает фоновой вкладке ресурсы, ICE перестаёт отвечать, и LiveKit закрывает участника через 5 с после потери соединения. Замерено на проде: 37 с после блокировки экрана, 23 с после сворачивания браузера. Восстановить сессию после этого нельзя (сервер отвечает "could not restart participant") — нужен полный повторный вход, и livekit-client его пытается сделать сам, но его бюджет повторов в фоновой вкладке успевает сгореть. Тогда приходило событие Disconnected, и страница уводила пользователя в лобби. Теперь непреднамеренный разрыв не уводит со страницы, а сбрасывает joinState — дальше работает уже написанный путь авто-перезахода: резолв конференции, свежий токен, вход заново. Намеренный выход отличается по флагу от кнопки "Выйти", а не по коду причины: причина CLIENT_INITIATED приходит и от кнопки, и от самого livekit-client, который при заморозке вкладки (событие freeze) вызывает disconnect() сам — и эта его подписка не отключается опцией disconnectOnPageLeave. Разрывы, после которых возвращаться нельзя (выгнал организатор, конференция закрыта, вход той же личностью с другого устройства), уводят в лобби как раньше. От бесконечного цикла "вошёл — сразу выбросило" защищает лимит в 5 перезаходов подряд; соединение, прожившее дольше 30 с, счётчик обнуляет.
This commit is contained in:
@@ -71,6 +71,14 @@ interface RoomToolbarProps extends StageViewProps {
|
||||
onLowerHandById: (identity: string) => void
|
||||
/** Тулбар в оверлее полноэкранного режима — см. докстринг `RoomTopbar.overlayVisible`, тот же механизм. */
|
||||
overlayVisible?: boolean
|
||||
/**
|
||||
* Пользователь нажал «Выйти» — вызывается ПЕРЕД тем, как `DisconnectButton`
|
||||
* отключит комнату (обработчики в `mergeProps` вызываются цепочкой). Нужен
|
||||
* `RoomPage`, чтобы отличить намеренный выход от разрыва: причина
|
||||
* `CLIENT_INITIATED` приходит и от кнопки, и от livekit-client при заморозке
|
||||
* вкладки — см. докстринг `handleDisconnected`.
|
||||
*/
|
||||
onLeave?: () => void
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -116,6 +124,7 @@ export function RoomToolbar({
|
||||
hideOthers,
|
||||
onHideOthersChange,
|
||||
overlayVisible,
|
||||
onLeave,
|
||||
}: RoomToolbarProps) {
|
||||
const toast = useToast()
|
||||
const isCompact = useIsCompactViewport()
|
||||
@@ -306,7 +315,7 @@ export function RoomToolbar({
|
||||
</button>
|
||||
)}
|
||||
|
||||
<DisconnectButton className="tb-btn danger" aria-label="Выйти из конференции">
|
||||
<DisconnectButton className="tb-btn danger" aria-label="Выйти из конференции" onClick={onLeave}>
|
||||
<span className="icon-shell">
|
||||
<LogOut className="lucide" aria-hidden="true" />
|
||||
</span>
|
||||
|
||||
Reference in New Issue
Block a user