INTEGRITY Документация

Сессионные залы

Примеры кода

Если вам удобнее учиться на примерах, посмотрите соответствующие репозитории с примерами.

Примеры Web

Сессионные залы позволяют участникам встречи разделиться на небольшие группы для целевых обсуждений и совместной работы. С распространением удалённой работы и онлайн-обучения сессионные залы стали незаменимым инструментом для повышения вовлечённости и укрепления сообщества в виртуальной среде. Это оптимальный выбор для воркшопов, онлайн-занятий или случаев, когда нужно поговорить наедине с отдельными участниками за пределами основной встречи.

В RealtimeKit breakout-комнаты создаются как отдельные встречи. Каждая breakout-комната представляет собой независимую встречу, которой можно управлять как любой другой встречей RealtimeKit. RealtimeKit предоставляет набор SDK API для создания и управления breakout-комнатами, а также для переключения между ними.

Ключевые функции

Ниже перечислены некоторые ключевые возможности сессионных залов RealtimeKit:

Роли в сессионном зале

Роли в сессионном зале управляются пресетами.

Host

Организаторы могут создавать сессионные залы, назначать в них участников, открывать и закрывать сессионные залы, а также переключаться между ними.

Участники

Как участник сессионного зала, вы можете:

Аудио и видео

Каждый сессионный зал функционирует как отдельная встреча. При переключении в сессионный зал из основной встречи аудио и видео автоматически переключаются на сессионную встречу. Вы можете включать и отключать звук, а также запускать и останавливать видео в любой момент сессионной встречи, точно так же, как и в основной встрече.

Когда встреча в сессионном зале завершается, ваши аудио и видео автоматически переключаются обратно на основную встречу.

Запись сессионных встреч

Каждая сессионная встреча представляет собой отдельную сессию. Запись каждой сессионной встречи хранится и управляется отдельно, как и для любой другой встречи RealtimeKit. Подробнее см. Запись.

Управление сессионными залами

Сессионные залы позволяют участникам разделиться на отдельные сессии. Организатор может создавать сессионные залы, распределять по ним участников, а также открывать и закрывать их.

Создание пресетов

Пресет представляет собой набор разрешений и настроек интерфейса, которые применяются к организаторам и участникам. Он определяет внешний вид, ощущения от использования и поведение сессионного зала.

Для сессионных залов необходимо предоставить организаторам и участникам следующие разрешения в Connected Meetings:

Host

Пресет организатора должен иметь Полный доступ разрешение в Connected Meetings. Это позволяет организатору:

Участники

Участникам можно предоставить следующие разрешения:

Сохраните пресет

  1. После того как вы внесли все изменения в пресет, нажмите Save
  2. Введите имя пресета и нажмите Save
  3. Ваш пресет отображается в списке. Нажмите Изменить чтобы внести какие-либо изменения

Создание встречи

Создание встречи RealtimeKit с использованием API создания встречи. Этот API возвращает уникальный идентификатор вашей встречи.

Добавьте участников

После создания встречи добавьте каждого участника с помощью API добавления участника. presetName созданный ранее, необходимо передать в теле запроса Add Participant API.

Запустить breakout-комнату

  1. Во время встречи RealtimeKit нажмите Сессионные залы
  2. В диалоговом окне Create Breakout укажите нужное количество комнат и нажмите Создание

После создания breakout-комнат распределите по ним участников. Сделать это можно одним из следующих способов:

Назначить участников автоматически

Чтобы назначать участников автоматически:

  1. В диалоговом окне Assign Participants нажмите кнопку перемешивания
  2. Участники распределяются по комнатам
  3. Измените названия комнат, нажав на значок карандаша рядом с названием комнаты (необязательно)
  4. Перемещение участников в другие залы при необходимости
  5. Нажмите Запустить сессионные залы
  6. Нажмите Да, начать в диалоговом окне подтверждения

Назначить участников вручную

Чтобы назначать участников вручную:

  1. В диалоговом окне Assign Participants выберите участников, которых нужно назначить в комнату
  2. В разделе Rooms нажмите Назначить
  3. Повторите для всех участников и комнат
  4. Нажмите Запустить сессионные залы
  5. Нажмите Да, начать в диалоговом окне подтверждения
  1. Во время встречи RealtimeKit коснитесь Сессионные залы
  2. В диалоговом окне Create Breakout укажите нужное количество комнат и коснитесь Создание

После создания breakout-комнат распределите по ним участников. Это можно сделать автоматически (RealtimeKit распределит их поровну) или вручную (вы сами решаете, кто куда попадёт).

Назначить участников автоматически

Чтобы назначать участников автоматически:

  1. В диалоговом окне Assign Participants коснитесь кнопки перемешивания
  2. RealtimeKit распределяет участников по комнатам
  3. Измените названия комнат, коснувшись значка карандаша рядом с названием комнаты (необязательно)
  4. Перемещение участников в другие залы при необходимости
  5. Нажмите Запустить сессионные залы
  6. Нажмите Да, начать в диалоговом окне подтверждения

Назначить участников вручную

Чтобы назначать участников вручную:

  1. В диалоговом окне Assign Participants выберите участников, которых нужно назначить в комнату
  2. В разделе Rooms коснитесь Назначить
  3. Повторите для всех участников и комнат
  4. Нажмите Запустить сессионные залы
  5. Нажмите Да, начать в диалоговом окне подтверждения
  1. Во время встречи RealtimeKit коснитесь Сессионные залы
  2. В диалоговом окне Create Breakout укажите нужное количество комнат и коснитесь Создание

После создания breakout-комнат распределите по ним участников. Это можно сделать автоматически (RealtimeKit распределит их поровну) или вручную (вы сами решаете, кто куда попадёт).

Назначить участников автоматически

Чтобы назначать участников автоматически:

  1. В диалоговом окне Assign Participants коснитесь кнопки перемешивания
  2. RealtimeKit распределяет участников по комнатам
  3. Измените названия комнат, коснувшись значка карандаша рядом с названием комнаты (необязательно)
  4. Перемещение участников в другие залы при необходимости
  5. Нажмите Запустить сессионные залы
  6. Нажмите Да, начать в диалоговом окне подтверждения

Назначить участников вручную

Чтобы назначать участников вручную:

  1. В диалоговом окне Assign Participants выберите участников, которых нужно назначить в комнату
  2. В разделе Rooms коснитесь Назначить
  3. Повторите для всех участников и комнат
  4. Нажмите Запустить сессионные залы
  5. Нажмите Да, начать в диалоговом окне подтверждения
  1. Во время встречи RealtimeKit коснитесь Сессионные залы
  2. В диалоговом окне Create Breakout укажите нужное количество комнат и коснитесь Создание

После создания breakout-комнат распределите по ним участников. Это можно сделать автоматически (RealtimeKit распределит их поровну) или вручную (вы сами решаете, кто куда попадёт).

Назначить участников автоматически

Чтобы назначать участников автоматически:

  1. В диалоговом окне Assign Participants коснитесь кнопки перемешивания
  2. RealtimeKit распределяет участников по комнатам
  3. Измените названия комнат, коснувшись значка карандаша рядом с названием комнаты (необязательно)
  4. Перемещение участников в другие залы при необходимости
  5. Нажмите Запустить сессионные залы
  6. Нажмите Да, начать в диалоговом окне подтверждения

Назначить участников вручную

Чтобы назначать участников вручную:

  1. В диалоговом окне Assign Participants выберите участников, которых нужно назначить в комнату
  2. В разделе Rooms коснитесь Назначить
  3. Повторите для всех участников и комнат
  4. Нажмите Запустить сессионные залы
  5. Нажмите Да, начать в диалоговом окне подтверждения

Интеграция сессионных залов

После настройки сессионных залов через 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. Теперь участники могут:

Для более продвинутой настройки ознакомьтесь со следующим: