← Cloudflare Realtime / realtime / realtimekit / ui-kit
Сессионные залы
Примеры кода
Если вам удобнее учиться на примерах, посмотрите соответствующие репозитории с примерами.
Примеры Web
Сессионные залы позволяют участникам встречи разделиться на небольшие группы для целевых обсуждений и совместной работы. С распространением удалённой работы и онлайн-обучения сессионные залы стали незаменимым инструментом для повышения вовлечённости и укрепления сообщества в виртуальной среде. Это оптимальный выбор для воркшопов, онлайн-занятий или случаев, когда нужно поговорить наедине с отдельными участниками за пределами основной встречи.
В RealtimeKit breakout-комнаты создаются как отдельные встречи. Каждая breakout-комната представляет собой независимую встречу, которой можно управлять как любой другой встречей RealtimeKit. RealtimeKit предоставляет набор SDK API для создания и управления breakout-комнатами, а также для переключения между ними.
Ключевые функции
Ниже перечислены некоторые ключевые возможности сессионных залов RealtimeKit:
- Управляйте разрешениями и правами организаторов и участников с помощью пресетов
- Организаторы могут создавать сессионные залы, назначать в них участников, открывать и закрывать сессионные залы, а также переключаться между ними
- Участники могут запускать и останавливать видео, взаимодействовать с другими участниками с помощью чата и опросов, а также включать и отключать звук
- Запись каждой сессионной встречи отдельно, как в случае обычной встречи RealtimeKit
Роли в сессионном зале
Роли в сессионном зале управляются пресетами.
Host
Организаторы могут создавать сессионные залы, назначать в них участников, открывать и закрывать сессионные залы, а также переключаться между ними.
Участники
Как участник сессионного зала, вы можете:
- Переключиться на основную встречу - Переключитесь обратно в основную встречу (при наличии необходимых прав)
- Переключение между Connected Meetings - Перейдите из основной встречи в небольшие тематические группы обсуждения (сессионные залы) для совместной работы
- Совместная работа - Используйте такие инструменты, как чат и опросы, во время сессионных встреч
Аудио и видео
Каждый сессионный зал функционирует как отдельная встреча. При переключении в сессионный зал из основной встречи аудио и видео автоматически переключаются на сессионную встречу. Вы можете включать и отключать звук, а также запускать и останавливать видео в любой момент сессионной встречи, точно так же, как и в основной встрече.
Когда встреча в сессионном зале завершается, ваши аудио и видео автоматически переключаются обратно на основную встречу.
- Если во время breakout-сессии видео было включено, оно останется включенным после возврата в основную сессию
- Если во время breakout-сессии микрофон был включен, он останется включенным после возврата в основную сессию
Запись сессионных встреч
Каждая сессионная встреча представляет собой отдельную сессию. Запись каждой сессионной встречи хранится и управляется отдельно, как и для любой другой встречи RealtimeKit. Подробнее см. Запись.
Управление сессионными залами
Сессионные залы позволяют участникам разделиться на отдельные сессии. Организатор может создавать сессионные залы, распределять по ним участников, а также открывать и закрывать их.
Создание пресетов
Пресет представляет собой набор разрешений и настроек интерфейса, которые применяются к организаторам и участникам. Он определяет внешний вид, ощущения от использования и поведение сессионного зала.
Для сессионных залов необходимо предоставить организаторам и участникам следующие разрешения в Connected Meetings:
Host
Пресет организатора должен иметь Полный доступ разрешение в Connected Meetings. Это позволяет организатору:
- Создание сессионных залов
- Назначить участников по залам
- Запускайте и закрывайте сессионные залы
- Переключение между комнатами
Участники
Участникам можно предоставить следующие разрешения:
- Переключение между Connected Meetings - Позволяет участникам переходить между сессионными залами
- Переключиться на основную встречу - Позволяет участникам вернуться в основную встречу
Сохраните пресет
- После того как вы внесли все изменения в пресет, нажмите Save
- Введите имя пресета и нажмите Save
- Ваш пресет отображается в списке. Нажмите Изменить чтобы внести какие-либо изменения
Создание встречи
Создание встречи RealtimeKit с использованием API создания встречи. Этот API возвращает уникальный идентификатор вашей встречи.
Добавьте участников
После создания встречи добавьте каждого участника с помощью API добавления участника. presetName созданный ранее, необходимо передать в теле запроса Add Participant API.
Запустить breakout-комнату
- Во время встречи RealtimeKit нажмите Сессионные залы
- В диалоговом окне Create Breakout укажите нужное количество комнат и нажмите Создание
После создания breakout-комнат распределите по ним участников. Сделать это можно одним из следующих способов:
- Назначить участников автоматически - RealtimeKit равномерно распределяет участников по залам
- Назначить участников вручную - Выберите, каких участников вы хотите видеть в каждом зале
Назначить участников автоматически
Чтобы назначать участников автоматически:
- В диалоговом окне Assign Participants нажмите кнопку перемешивания
- Участники распределяются по комнатам
- Измените названия комнат, нажав на значок карандаша рядом с названием комнаты (необязательно)
- Перемещение участников в другие залы при необходимости
- Нажмите Запустить сессионные залы
- Нажмите Да, начать в диалоговом окне подтверждения
Назначить участников вручную
Чтобы назначать участников вручную:
- В диалоговом окне Assign Participants выберите участников, которых нужно назначить в комнату
- В разделе Rooms нажмите Назначить
- Повторите для всех участников и комнат
- Нажмите Запустить сессионные залы
- Нажмите Да, начать в диалоговом окне подтверждения
- Во время встречи RealtimeKit коснитесь Сессионные залы
- В диалоговом окне Create Breakout укажите нужное количество комнат и коснитесь Создание
После создания breakout-комнат распределите по ним участников. Это можно сделать автоматически (RealtimeKit распределит их поровну) или вручную (вы сами решаете, кто куда попадёт).
Назначить участников автоматически
Чтобы назначать участников автоматически:
- В диалоговом окне Assign Participants коснитесь кнопки перемешивания
- RealtimeKit распределяет участников по комнатам
- Измените названия комнат, коснувшись значка карандаша рядом с названием комнаты (необязательно)
- Перемещение участников в другие залы при необходимости
- Нажмите Запустить сессионные залы
- Нажмите Да, начать в диалоговом окне подтверждения
Назначить участников вручную
Чтобы назначать участников вручную:
- В диалоговом окне Assign Participants выберите участников, которых нужно назначить в комнату
- В разделе Rooms коснитесь Назначить
- Повторите для всех участников и комнат
- Нажмите Запустить сессионные залы
- Нажмите Да, начать в диалоговом окне подтверждения
- Во время встречи RealtimeKit коснитесь Сессионные залы
- В диалоговом окне Create Breakout укажите нужное количество комнат и коснитесь Создание
После создания breakout-комнат распределите по ним участников. Это можно сделать автоматически (RealtimeKit распределит их поровну) или вручную (вы сами решаете, кто куда попадёт).
Назначить участников автоматически
Чтобы назначать участников автоматически:
- В диалоговом окне Assign Participants коснитесь кнопки перемешивания
- RealtimeKit распределяет участников по комнатам
- Измените названия комнат, коснувшись значка карандаша рядом с названием комнаты (необязательно)
- Перемещение участников в другие залы при необходимости
- Нажмите Запустить сессионные залы
- Нажмите Да, начать в диалоговом окне подтверждения
Назначить участников вручную
Чтобы назначать участников вручную:
- В диалоговом окне Assign Participants выберите участников, которых нужно назначить в комнату
- В разделе Rooms коснитесь Назначить
- Повторите для всех участников и комнат
- Нажмите Запустить сессионные залы
- Нажмите Да, начать в диалоговом окне подтверждения
- Во время встречи RealtimeKit коснитесь Сессионные залы
- В диалоговом окне Create Breakout укажите нужное количество комнат и коснитесь Создание
После создания breakout-комнат распределите по ним участников. Это можно сделать автоматически (RealtimeKit распределит их поровну) или вручную (вы сами решаете, кто куда попадёт).
Назначить участников автоматически
Чтобы назначать участников автоматически:
- В диалоговом окне Assign Participants коснитесь кнопки перемешивания
- RealtimeKit распределяет участников по комнатам
- Измените названия комнат, коснувшись значка карандаша рядом с названием комнаты (необязательно)
- Перемещение участников в другие залы при необходимости
- Нажмите Запустить сессионные залы
- Нажмите Да, начать в диалоговом окне подтверждения
Назначить участников вручную
Чтобы назначать участников вручную:
- В диалоговом окне Assign Participants выберите участников, которых нужно назначить в комнату
- В разделе Rooms коснитесь Назначить
- Повторите для всех участников и комнат
- Нажмите Запустить сессионные залы
- Нажмите Да, начать в диалоговом окне подтверждения
Интеграция сессионных залов
После настройки сессионных залов через API их нужно интегрировать в приложение с помощью RealtimeKit SDK.
Инициализируйте SDK с поддержкой breakout-комнат
Инициализируйте SDK и добавьте обработчик событий для breakout-комнат:
import {
RealtimeKitProvider,
useRealtimeKitClient,
} from "@cloudflare/realtimekit-react";
import { RtkMeeting } from "@cloudflare/realtimekit-react-ui";
import { useEffect, useState } from "react";
function App() {
const [meeting, initMeeting] = useRealtimeKitClient();
const [authToken, setAuthToken] = useState("<participant_auth_token>");
useEffect(() => {
if (authToken) {
initMeeting({
authToken: authToken,
});
}
}, [authToken]);
// Add event handler for breakout rooms
useEffect(() => {
if (meeting) {
meeting.connectedMeetings.on("meetingChanged", (newMeeting) => {
// Meeting object is automatically updated in React
console.log("Switched to breakout room or main meeting");
});
}
}, [meeting]);
return (
<RealtimeKitProvider value={meeting}>
<RtkMeeting showSetupScreen={true} meeting={meeting} />
</RealtimeKitProvider>
);
} meetingChanged событие срабатывает, когда участник переключается между основной встречей и сессионными залами. В React объект meeting автоматически управляется провайдером.
<script type="module">
import RealtimeKitClient from "https://cdn.jsdelivr.net/npm/@cloudflare/realtimekit@latest/dist/index.es.js";
let meeting = await RealtimeKitClient.init({
authToken: "<participant_auth_token>",
});
// Add event handler for breakout rooms
meeting.connectedMeetings.on("meetingChanged", (newMeeting) => {
meeting = newMeeting;
document.querySelector("rtk-meeting").meeting = meeting;
});
</script> meetingChanged событие срабатывает, когда участник переключается между основной встречей и сессионными залами. При срабатывании этого события обновляйте ссылку на объект meeting.
import { Component, ViewChild, AfterViewInit } from '@angular/core';
import RealtimeKitClient from '@cloudflare/realtimekit';
import { RtkMeeting } from '@cloudflare/realtimekit-angular';
@Component({
selector: 'app-root',
template: `<rtk-meeting #myid [showSetupScreen]="true"></rtk-meeting>`
})
export class AppComponent implements AfterViewInit {
@ViewChild('myid') meetingComponent: RtkMeeting;
rtkMeeting: RealtimeKitClient;
async ngAfterViewInit() {
let meeting = await RealtimeKitClient.init({
authToken: '<participant_auth_token>',
});
// Add event handler for breakout rooms
meeting.connectedMeetings.on('meetingChanged', (newMeeting) => {
meeting = newMeeting;
if (this.meetingComponent) {
this.meetingComponent.meeting = meeting;
}
});
this.rtkMeeting = meeting;
if (this.meetingComponent) {
this.meetingComponent.meeting = meeting;
}
}
} meetingChanged событие срабатывает, когда участник переключается между основной встречей и сессионными залами. При срабатывании этого события обновляйте ссылку на объект meeting.
При использовании RealtimeKitUI.startMeeting(), SDK автоматически управляет RtkConnectedMeetingsListener, дополнительная настройка для переключения между breakout-комнатами не требуется.
Если вы создаёте собственный UI встречи (в обход MeetingViewController), зарегистрируйте слушатель самостоятельно:
import RealtimeKit
import RealtimeKitUI
let listener = RtkConnectedMeetingsListener(rtkClient: rtkClient)
listener.onChangingMeeting = { meetingId in
// Show a loading overlay; the SDK is switching rooms
let isReturningToMain = meetingId == rtkClient.connectedMeetings.parentMeeting?.id
showLoadingOverlay(message: isReturningToMain ? "Returning to Main Room\u{2026}" : "Joining breakout room\u{2026}")
}
listener.onMeetingChanged = { error in
hideLoadingOverlay()
if let error {
showErrorAlert(message: error.message)
} else {
// Re-register all feature event listeners — the SDK clears them during the room switch
// Re-register your listener instances, for example:
// rtkClient.addSelfEventListener(selfEventListener: mySelfListener)
// rtkClient.addParticipantsEventListener(participantsEventListener: myParticipantsListener)
}
}
listener.onStateUpdate = { meetings, parentMeeting in
// Refresh your breakout-rooms UI list
}При использовании RealtimeKitUIBuilder + startMeeting(), SDK автоматически регистрирует и управляет RtkConnectedMeetingsEventListener, дополнительная настройка для переключения между breakout-комнатами не требуется.
Если вы создаёте собственный UI встречи, зарегистрируйте слушатель самостоятельно:
import com.cloudflare.realtimekit.ui.RtkConnectedMeetingsEventListener
import com.cloudflare.realtimekit.models.MeetingError
val connectedMeetingsListener = object : RtkConnectedMeetingsEventListener {
override fun onChangingMeeting(meetingId: String) {
// Show a transition screen; the SDK is switching rooms
val isReturningToMain = meetingId == meeting.connectedMeetings.parentMeeting?.id
showLoadingOverlay(isReturningToMain)
}
override fun onMeetingChanged(error: MeetingError?) {
hideLoadingOverlay()
if (error != null) {
showErrorMessage(error.message)
}
// No need to re-register listeners — the SDK handles this automatically
}
}
meeting.addConnectedMeetingsEventListener(connectedMeetingsListener) onChangingMeeting колбэк срабатывает, когда SDK начинает покидать текущую комнату. onMeetingChanged колбэк срабатывает при завершении переключения (успешном или неуспешном).
useRealtimeKitClient хук автоматически обрабатывает meetingChanged событие и меняет активную ссылку на клиент при перемещении участника между сессионными залами. Ручная обработка события не требуется.
import { useEffect } from "react";
import { useRealtimeKitClient } from "@cloudflare/realtimekit-react-native";
import { RtkMeeting } from "@cloudflare/realtimekit-react-native-ui";
function App() {
const [meeting, initMeeting] = useRealtimeKitClient();
useEffect(() => {
initMeeting({ authToken: "<participant_auth_token>" });
}, []);
if (!meeting) return null;
return <RtkMeeting meeting={meeting} showSetupScreen={true} />;
}RtkMeeting автоматически показывает переходный экран «Joining…» при переключении между сессионными залами. Дополнительная настройка не требуется.
Отрисовка UI собрания
Используйте стандартный компонент интерфейса встречи, который включает встроенную поддержку сессионных залов:
import {
RealtimeKitProvider,
useRealtimeKitClient,
} from "@cloudflare/realtimekit-react";
import { RtkMeeting } from "@cloudflare/realtimekit-react-ui";
import { useEffect, useState } from "react";
function App() {
const [meeting, initMeeting] = useRealtimeKitClient();
const [authToken, setAuthToken] = useState("<participant_auth_token>");
useEffect(() => {
if (authToken) {
initMeeting({
authToken: authToken,
});
}
}, [authToken]);
useEffect(() => {
if (meeting) {
meeting.connectedMeetings.on("meetingChanged", (newMeeting) => {
console.log("Switched to breakout room or main meeting");
});
}
}, [meeting]);
return (
<RealtimeKitProvider value={meeting}>
<RtkMeeting showSetupScreen={true} meeting={meeting} />
</RealtimeKitProvider>
);
} showSetupScreen свойство определяет, отображается ли экран настройки, позволяя участникам просмотреть свои аудио и видео перед присоединением к сессии.
<body>
<rtk-meeting id="my-meeting"></rtk-meeting>
<script type="module">
import RealtimeKitClient from "https://cdn.jsdelivr.net/npm/@cloudflare/realtimekit@latest/dist/index.es.js";
let meeting = await RealtimeKitClient.init({
authToken: "<participant_auth_token>",
});
// Add event handler for breakout rooms
meeting.connectedMeetings.on("meetingChanged", (newMeeting) => {
meeting = newMeeting;
document.querySelector("rtk-meeting").meeting = meeting;
});
document.querySelector("rtk-meeting").showSetupScreen = true;
document.querySelector("rtk-meeting").meeting = meeting;
</script>
</body> showSetupScreen свойство определяет, отображается ли экран настройки, позволяя участникам просмотреть свои аудио и видео перед присоединением к сессии.
<rtk-meeting #myid [showSetupScreen]="true"></rtk-meeting>import { Component, ViewChild, AfterViewInit } from '@angular/core';
import RealtimeKitClient from '@cloudflare/realtimekit';
import { RtkMeeting } from '@cloudflare/realtimekit-angular';
@Component({
selector: 'app-root',
templateUrl: './app.component.html'
})
export class AppComponent implements AfterViewInit {
@ViewChild('myid') meetingComponent: RtkMeeting;
rtkMeeting: RealtimeKitClient;
async ngAfterViewInit() {
let meeting = await RealtimeKitClient.init({
authToken: '<participant_auth_token>',
});
// Add event handler for breakout rooms
meeting.connectedMeetings.on('meetingChanged', (newMeeting) => {
meeting = newMeeting;
if (this.meetingComponent) {
this.meetingComponent.meeting = meeting;
}
});
this.rtkMeeting = meeting;
if (this.meetingComponent) {
this.meetingComponent.meeting = meeting;
}
}
} showSetupScreen свойство определяет, отображается ли экран настройки, позволяя участникам просмотреть свои аудио и видео перед присоединением к сессии.
import RealtimeKit
import RealtimeKitUI
let meetingInfo = RtkMeetingInfo(authToken: "<participant_auth_token>")
let rtkUI = RealtimeKitUI(meetingInfo: meetingInfo)
let setupVC = rtkUI.startMeeting { [weak self] in
// Called when the participant leaves or ends the meeting
self?.dismiss(animated: true)
}
present(setupVC, animated: true)Экран настройки (предпросмотр аудио и видео) отображается по умолчанию. Встроенная поддержка сессионных залов, включая оверлей переключения залов и обновление заголовков залов, обрабатывается автоматически MeetingViewController.
import com.cloudflare.realtimekit.models.RtkMeetingInfo
import com.cloudflare.realtimekit.ui.RealtimeKitUIBuilder
import com.cloudflare.realtimekit.ui.RealtimeKitUIInfo
val meetingInfo = RtkMeetingInfo(authToken = "<participant_auth_token>")
val uiKitInfo = RealtimeKitUIInfo(
activity = this,
rtkMeetingInfo = meetingInfo,
)
val rtkUIKit = RealtimeKitUIBuilder.build(uiKitInfo)
rtkUIKit.startMeeting()Встроенная поддержка сессионных залов обеспечивается автоматически с помощью RtkMeetingActivity. Когда SDK перемещает участников между комнатами, он отображает переходное наложение с локализованным сообщением. Организатор может управлять сессионными залами через RtkBreakoutRoomsBottomSheet, которая отображается автоматически при нажатии кнопки сессионных залов на панели управления.
import { useEffect } from "react";
import { useRealtimeKitClient } from "@cloudflare/realtimekit-react-native";
import { RtkMeeting } from "@cloudflare/realtimekit-react-native-ui";
function App() {
const [meeting, initMeeting] = useRealtimeKitClient();
useEffect(() => {
initMeeting({ authToken: "<participant_auth_token>" });
}, []);
if (!meeting) return null;
return <RtkMeeting meeting={meeting} showSetupScreen={true} />;
}Встроенная поддержка сессионных залов обеспечивается автоматически с помощью RtkMeeting. При перемещении участника между комнатами автоматически отображается переходный экран «Joining…». Организатор может управлять сессионными залами с помощью RtkBreakoutRoomsManager, который доступен через RtkBreakoutRoomsToggle на панели управления.
Следующие шаги
Вы успешно интегрировали сессионные залы в своё приложение RealtimeKit. Теперь участники могут:
- Присоединиться к основной встрече
- Быть распределённым по сессионным залам организатором
- Переключение между основной встречей и breakout-комнатами
- Совместная работа в небольших тематических группах
Для более продвинутой настройки ознакомьтесь со следующим:
- Библиотека компонентов UI Kit - Просмотр доступных компонентов
- Состояния UI Kit - Узнайте, как синхронизируются компоненты
- Создание собственного интерфейса - Создание пользовательских интерфейсов встреч