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

Управление участниками сессии

Используйте элементы управления организатора RealtimeKit, чтобы управлять другими участниками в живой сессии. Вы можете отключать звук или видео, закреплять участника или удалять участников из сессии. Для этих действий требуются особые разрешения на управление хостом, включённые в пресете локального участника Preset. Прежде чем показывать элементы управления интерфейсом или вызывать эти методы, убедитесь, что у локального участника есть необходимые разрешения. В этом руководстве локальный участник обозначает пользователя, выполняющего действия.

Выберите удалённого участника

Чтобы выполнить действия с конкретным участником, сначала нужно получить его объект участника. Удалённые участники (остальные участники) доступны в meeting.participants. Локальный участник доступен в meeting.self. См. Разбор объекта встречи для получения подробностей.

const joinedParticipants = meeting.participants.joined.toArray();
const participant = joinedParticipants[0];
if (!participant) {
	// No remote participants are currently joined.
}

Чтобы выполнить действия с конкретным участником, сначала нужно получить его объект участника. Удалённые участники (остальные участники) доступны в meeting.participants. Локальный участник доступен в meeting.self. См. Разбор объекта встречи для получения подробностей.

const joinedParticipants = meeting.participants.joined.toArray();
const participant = joinedParticipants[0];
if (!participant) {
	// No remote participants are currently joined.
}

Чтобы выполнить действия с конкретным участником, сначала нужно получить его объект участника. Удалённые участники (остальные участники) доступны в meeting.participants. Локальный участник доступен в meeting.self. См. Разбор объекта встречи для получения подробностей.

const joinedParticipants = meeting.participants.joined.toArray();
const participant = joinedParticipants[0];
if (!participant) {
	// No remote participants are currently joined.
}

Чтобы выполнить действия с конкретным участником, получите его объект участника из participants свойство. Удаленные участники доступны в meeting.participants.joined. Локальный участник доступен в meeting.localUser.

val joinedParticipants = meeting.participants.joined
val participant = joinedParticipants.firstOrNull()
if (participant == null) {
	// No remote participants are currently joined.
}

Чтобы выполнить действия с конкретным участником, получите его объект участника из participants свойство. Удаленные участники доступны в meeting.participants.joined. Локальный участник доступен в meeting.localUser.

let joinedParticipants = meeting.participants.joined
guard let participant = joinedParticipants.first else {
	// No remote participants are currently joined.
	return
}

Чтобы выполнить действия с конкретным участником, получите его объект участника из participants свойство. Удаленные участники доступны в meeting.participants.joined. Локальный участник доступен в meeting.self.

const joinedParticipants = meeting.participants.joined;
const participant = joinedParticipants.toArray()[0];
if (!participant) {
	// No remote participants are currently joined.
}

Или используйте useRealtimeKitSelector хук:

import { useRealtimeKitSelector } from '@cloudflare/realtimekit-react-native';

const joinedParticipants = useRealtimeKitSelector((m) => m.participants.joined);

Отключить звук

Отключайте звук участников, если нужно справиться с фоновым шумом, промодерировать занятие или вебинар либо предотвратить помехи во время сессии. Для этого действия требуется Отключить звук (disable_participant_audio) с включённым в пресете локального участника разрешением на управление хостом.

Отключить звук участника

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

  1. Проверьте, что у локального участника есть разрешение отключать звук у других участников.

    const canMuteAudio =
    	meeting.self.permissions.canDisableParticipantAudio === true;
    if (!canMuteAudio) {
    	// Disable the control in your UI.
    }
  2. Вызовите disableAudio() для целевого участника.

    Если у локального участника нет необходимого разрешения, disableAudio() выбрасывает ClientError с кодом 1201.

    try {
    	await participant.disableAudio();
    } catch (err: any) {
    	if (err?.code === 1201) {
    		// The local participant does not have permission to mute other participants’ audio.
    		return;
    	}
    	throw err;
    }
  3. Обработайте результат, подписавшись на обновления.

    После успешного завершения вызова у целевого участника audioEnabled становится false, и SDK создаёт событие audioUpdate событие.

    Вариант A: Слушайте события на объекте participant

    participant.on("audioUpdate", ({ audioEnabled, audioTrack }) => {
    	// audioEnabled is false
    	// Update UI for the participant
    });

    Вариант B: Слушайте события на joined map

    meeting.participants.joined.on(
    	"audioUpdate",
    	(participant, { audioEnabled, audioTrack }) => {
    		if (participant.id === targetParticipantId) {
    			// audioEnabled is false
    			// Update UI for the participant
    		}
    	},
    );
  1. Проверьте, что у локального участника есть разрешение отключать звук у других участников.

    const canMuteAudio =
    	meeting.self.permissions.canDisableParticipantAudio === true;
    if (!canMuteAudio) {
    	// Disable the control in your UI.
    }
  2. Вызовите disableAudio() для целевого участника.

    Если у локального участника нет необходимого разрешения, disableAudio() выбрасывает ClientError с кодом 1201.

    try {
    	await participant.disableAudio();
    } catch (err: any) {
    	if (err?.code === 1201) {
    		// The local participant does not have permission to mute other participants’ audio.
    		return;
    	}
    	throw err;
    }
  3. Обработайте результат, подписавшись на обновления.

    После успешного завершения вызова у целевого участника audioEnabled становится false, и SDK создаёт событие audioUpdate событие.

    Вариант A: Слушайте события на объекте participant

    participant.on("audioUpdate", ({ audioEnabled, audioTrack }) => {
    	// audioEnabled is false
    	// Update UI for the participant
    });

    Вариант B: Слушайте события на joined map

    meeting.participants.joined.on(
    	"audioUpdate",
    	(participant, { audioEnabled, audioTrack }) => {
    		if (participant.id === targetParticipantId) {
    			// audioEnabled is false
    			// Update UI for the participant
    		}
    	},
    );
  1. Проверьте, что у локального участника есть разрешение отключать звук у других участников.

    const canMuteAudio =
    	meeting.self.permissions.canDisableParticipantAudio === true;
    if (!canMuteAudio) {
    	// Disable the control in your UI.
    }
  2. Вызовите disableAudio() для целевого участника.

    Если у локального участника нет необходимого разрешения, disableAudio() выбрасывает ClientError с кодом 1201.

    try {
    	await participant.disableAudio();
    } catch (err: any) {
    	if (err?.code === 1201) {
    		// The local participant does not have permission to mute other participants’ audio.
    		return;
    	}
    	throw err;
    }
  3. Обработайте результат, подписавшись на обновления.

    После успешного завершения вызова у целевого участника audioEnabled становится false, и SDK создаёт событие audioUpdate событие.

    Вариант A: Слушайте события на объекте participant

    participant.on("audioUpdate", ({ audioEnabled, audioTrack }) => {
    	// audioEnabled is false
    	// Update UI for the participant
    });

    Вариант B: Слушайте события на joined map

    meeting.participants.joined.on(
    	"audioUpdate",
    	(participant, { audioEnabled, audioTrack }) => {
    		if (participant.id === targetParticipantId) {
    			// audioEnabled is false
    			// Update UI for the participant
    		}
    	},
    );
  1. Проверьте, что у локального участника есть разрешение отключать звук у других участников.
val canMuteAudio = meeting.localUser.permissions.host.canMuteAudio
if (!canMuteAudio) {
	// Disable the control in your UI.
}
  1. Вызовите disableAudio() для целевого участника. Если у локального участника нет необходимого разрешения, disableAudio() возвращает HostError.
val error = participant.disableAudio()
if (error != null) {
	// Handle error - permission denied.
}
  1. Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у целевого участника audioEnabled становится false.
meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
	override fun onAudioUpdate(participant: RtkRemoteParticipant, isEnabled: Boolean) {
		// audioEnabled is false
		// Update UI for the participant
	}
})
  1. Проверьте, что у локального участника есть разрешение отключать звук у других участников.
let canMuteAudio = meeting.localUser.permissions.host.canMuteAudio
if !canMuteAudio {
	// Disable the control in your UI.
}
  1. Вызовите disableAudio() для целевого участника. Если у локального участника нет необходимого разрешения, disableAudio() возвращает HostError.
if let error = participant.disableAudio() {
	// Handle error - permission denied.
}
  1. Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у целевого участника audioEnabled становится false.
extension MeetingViewModel: RtkParticipantsEventListener {
	func onAudioUpdate(participant: RtkRemoteParticipant, isEnabled: Bool) {
		// audioEnabled is false
		// Update UI for the participant
	}
}

// Register the listener
meeting.addParticipantsEventListener(participantsEventListener: self)
  1. Проверьте, что у локального участника есть разрешение отключать звук у других участников.
const canDisableParticipantAudio = meeting.self.permissions.canDisableParticipantAudio;
if (!canDisableParticipantAudio) {
	// Disable the control in your UI.
}
  1. Вызовите disableAudio() для целевого участника.
participant
	.disableAudio()
	.catch((err) => {
		// Handle error - permission denied or other issue.
		console.log(err);
	});
  1. Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у целевого участника audioEnabled становится false.
meeting.participants.joined.on('audioUpdate', (participant) => {
	// participant.audioEnabled is false
	// Update UI for the participant
});

Отключить звук всех участников

Это затрагивает всех участников, включая локального участника. Чтобы отключить звук для всех участников сессии:

  1. Проверьте, что у локального участника есть разрешение отключать звук у других участников.

    const canMuteAudio =
    	meeting.self.permissions.canDisableParticipantAudio === true;
    if (!canMuteAudio) {
    	// Disable the control in your UI.
    }
  2. Вызовите disableAllAudio().

    Если у локального участника нет необходимого разрешения, disableAllAudio() выбрасывает ClientError с кодом 1201.

    try {
    	await meeting.participants.disableAllAudio();
    } catch (err: any) {
    	if (err?.code === 1201) {
    		// The local participant does not have permission to mute other participants’ audio.
    		return;
    	}
    	throw err;
    }
  3. Обработайте результат, подписавшись на обновления.

    После успешного завершения вызова у каждого участника audioEnabled становится false, и SDK создаёт событие audioUpdate событие. Локальный участник также получает audioUpdate на meeting.self.

    Прослушивайте обновления удалённого участника на joined map:

    meeting.participants.joined.on(
    	"audioUpdate",
    	(participant, { audioEnabled, audioTrack }) => {
    		// audioEnabled is false
    		// Update UI for the participant
    	},
    );

    Прослушивайте обновление локального участника на meeting.self:

    meeting.self.on("audioUpdate", ({ audioEnabled, audioTrack }) => {
    	// audioEnabled is false
    	// Update UI for the local participant
    });
  1. Проверьте, что у локального участника есть разрешение отключать звук у других участников.

    const canMuteAudio =
    	meeting.self.permissions.canDisableParticipantAudio === true;
    if (!canMuteAudio) {
    	// Disable the control in your UI.
    }
  2. Вызовите disableAllAudio().

    Если у локального участника нет необходимого разрешения, disableAllAudio() выбрасывает ClientError с кодом 1201.

    try {
    	await meeting.participants.disableAllAudio();
    } catch (err: any) {
    	if (err?.code === 1201) {
    		// The local participant does not have permission to mute other participants’ audio.
    		return;
    	}
    	throw err;
    }
  3. Обработайте результат, подписавшись на обновления.

    После успешного завершения вызова у каждого участника audioEnabled становится false, и SDK создаёт событие audioUpdate событие. Локальный участник также получает audioUpdate на meeting.self.

    Прослушивайте обновления удалённого участника на joined map:

    meeting.participants.joined.on(
    	"audioUpdate",
    	(participant, { audioEnabled, audioTrack }) => {
    		// audioEnabled is false
    		// Update UI for the participant
    	},
    );

    Прослушивайте обновление локального участника на meeting.self:

    meeting.self.on("audioUpdate", ({ audioEnabled, audioTrack }) => {
    	// audioEnabled is false
    	// Update UI for the local participant
    });
  1. Проверьте, что у локального участника есть разрешение отключать звук у других участников.

    const canMuteAudio =
    	meeting.self.permissions.canDisableParticipantAudio === true;
    if (!canMuteAudio) {
    	// Disable the control in your UI.
    }
  2. Вызовите disableAllAudio().

    Если у локального участника нет необходимого разрешения, disableAllAudio() выбрасывает ClientError с кодом 1201.

    try {
    	await meeting.participants.disableAllAudio();
    } catch (err: any) {
    	if (err?.code === 1201) {
    		// The local participant does not have permission to mute other participants’ audio.
    		return;
    	}
    	throw err;
    }
  3. Обработайте результат, подписавшись на обновления.

    После успешного завершения вызова у каждого участника audioEnabled становится false, и SDK создаёт событие audioUpdate событие. Локальный участник также получает audioUpdate на meeting.self.

    Прослушивайте обновления удалённого участника на joined map:

    meeting.participants.joined.on(
    	"audioUpdate",
    	(participant, { audioEnabled, audioTrack }) => {
    		// audioEnabled is false
    		// Update UI for the participant
    	},
    );

    Прослушивайте обновление локального участника на meeting.self:

    meeting.self.on("audioUpdate", ({ audioEnabled, audioTrack }) => {
    	// audioEnabled is false
    	// Update UI for the local participant
    });
  1. Проверьте, что у локального участника есть разрешение отключать звук у других участников.
val canMuteAudio = meeting.localUser.permissions.host.canMuteAudio
if (!canMuteAudio) {
	// Disable the control in your UI.
}
  1. Вызовите disableAllAudio() для объекта participants. Если у локального участника нет необходимого разрешения, disableAllAudio() возвращает HostError.
val error = meeting.participants.disableAllAudio()
if (error != null) {
	// Handle error - permission denied.
}
  1. Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у каждого участника audioEnabled становится false.
meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
	override fun onAudioUpdate(participant: RtkRemoteParticipant, isEnabled: Boolean) {
		// audioEnabled is false
		// Update UI for the participant
	}
})
  1. Проверьте, что у локального участника есть разрешение отключать звук у других участников.
let canMuteAudio = meeting.localUser.permissions.host.canMuteAudio
if !canMuteAudio {
	// Disable the control in your UI.
}
  1. Вызовите disableAllAudio() для объекта participants. Если у локального участника нет необходимого разрешения, disableAllAudio() возвращает HostError.
if let error = meeting.participants.disableAllAudio() {
	// Handle error - permission denied.
}
  1. Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у каждого участника audioEnabled становится false.
extension MeetingViewModel: RtkParticipantsEventListener {
	func onAudioUpdate(participant: RtkRemoteParticipant, isEnabled: Bool) {
		// audioEnabled is false
		// Update UI for the participant
	}
}

// Register the listener
meeting.addParticipantsEventListener(participantsEventListener: self)
  1. Проверьте, что у локального участника есть разрешение отключать звук у других участников.
const canDisableParticipantAudio = meeting.self.permissions.canDisableParticipantAudio;
if (!canDisableParticipantAudio) {
	// Disable the control in your UI.
}
  1. Вызовите disableAllAudio() для объекта participants.
meeting.participants
	.disableAllAudio(true)
	.catch((err) => {
		// Handle error - permission denied or other issue.
		console.log(err);
	});
  1. Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у каждого участника audioEnabled становится false.
meeting.participants.joined.on('audioUpdate', (participant) => {
	// participant.audioEnabled is false
	// Update UI for the participant
});

Отключение видео

Отключайте видео участников, когда нужно модерировать сессию, обеспечить конфиденциальность или предотвратить нежелательное видео во время урока или вебинара. Для этого действия требуется Отключить видео (disable_participant_video) с включённым в пресете локального участника разрешением на управление хостом.

Отключение видео участника

Чтобы отключить видео конкретного участника:

  1. Проверьте, что у локального участника есть разрешение отключать видео у других участников.

    const canDisableVideo =
    	meeting.self.permissions.canDisableParticipantVideo === true;
    if (!canDisableVideo) {
    	// Disable the control in your UI.
    }
  2. Вызовите disableVideo() для целевого участника.

    Если у локального участника нет необходимого разрешения, disableVideo() выбрасывает ClientError с кодом 1201.

    try {
    	await participant.disableVideo();
    } catch (err: any) {
    	if (err?.code === 1201) {
    		// The local participant does not have permission to disable other participants’ video.
    		return;
    	}
    	throw err;
    }
  3. Обработайте результат, подписавшись на обновления.

    После успешного завершения вызова у целевого участника videoEnabled становится false, и SDK создаёт событие videoUpdate событие.

    Вариант A: Слушайте события на объекте participant

    participant.on("videoUpdate", ({ videoEnabled, videoTrack }) => {
    	// videoEnabled is false
    	// Update UI for the participant
    });

    Вариант B: Слушайте события на joined map

    meeting.participants.joined.on(
    	"videoUpdate",
    	(participant, { videoEnabled, videoTrack }) => {
    		// videoEnabled is false
    		// Update UI for the participant
    	},
    );
  1. Проверьте, что у локального участника есть разрешение отключать видео у других участников.

    const canDisableVideo =
    	meeting.self.permissions.canDisableParticipantVideo === true;
    if (!canDisableVideo) {
    	// Disable the control in your UI.
    }
  2. Вызовите disableVideo() для целевого участника.

    Если у локального участника нет необходимого разрешения, disableVideo() выбрасывает ClientError с кодом 1201.

    try {
    	await participant.disableVideo();
    } catch (err: any) {
    	if (err?.code === 1201) {
    		// The local participant does not have permission to disable other participants’ video.
    		return;
    	}
    	throw err;
    }
  3. Обработайте результат, подписавшись на обновления.

    После успешного завершения вызова у целевого участника videoEnabled становится false, и SDK создаёт событие videoUpdate событие.

    Вариант A: Слушайте события на объекте participant

    participant.on("videoUpdate", ({ videoEnabled, videoTrack }) => {
    	// videoEnabled is false
    	// Update UI for the participant
    });

    Вариант B: Слушайте события на joined map

    meeting.participants.joined.on(
    	"videoUpdate",
    	(participant, { videoEnabled, videoTrack }) => {
    		// videoEnabled is false
    		// Update UI for the participant
    	},
    );
  1. Проверьте, что у локального участника есть разрешение отключать видео у других участников.

    const canDisableVideo =
    	meeting.self.permissions.canDisableParticipantVideo === true;
    if (!canDisableVideo) {
    	// Disable the control in your UI.
    }
  2. Вызовите disableVideo() для целевого участника.

    Если у локального участника нет необходимого разрешения, disableVideo() выбрасывает ClientError с кодом 1201.

    try {
    	await participant.disableVideo();
    } catch (err: any) {
    	if (err?.code === 1201) {
    		// The local participant does not have permission to disable other participants’ video.
    		return;
    	}
    	throw err;
    }
  3. Обработайте результат, подписавшись на обновления.

    После успешного завершения вызова у целевого участника videoEnabled становится false, и SDK создаёт событие videoUpdate событие.

    Вариант A: Слушайте события на объекте participant

    participant.on("videoUpdate", ({ videoEnabled, videoTrack }) => {
    	// videoEnabled is false
    	// Update UI for the participant
    });

    Вариант B: Слушайте события на joined map

    meeting.participants.joined.on(
    	"videoUpdate",
    	(participant, { videoEnabled, videoTrack }) => {
    		// videoEnabled is false
    		// Update UI for the participant
    	},
    );
  1. Проверьте, что у локального участника есть разрешение отключать видео у других участников.
val canMuteVideo = meeting.localUser.permissions.host.canMuteVideo
if (!canMuteVideo) {
	// Disable the control in your UI.
}
  1. Вызовите disableVideo() для целевого участника. Если у локального участника нет необходимого разрешения, disableVideo() возвращает HostError.
val error = participant.disableVideo()
if (error != null) {
	// Handle error - permission denied.
}
  1. Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у целевого участника videoEnabled становится false.
meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
	override fun onVideoUpdate(participant: RtkRemoteParticipant, isEnabled: Boolean) {
		// videoEnabled is false
		// Update UI for the participant
	}
})
  1. Проверьте, что у локального участника есть разрешение отключать видео у других участников.
let canMuteVideo = meeting.localUser.permissions.host.canMuteVideo
if !canMuteVideo {
	// Disable the control in your UI.
}
  1. Вызовите disableVideo() для целевого участника. Если у локального участника нет необходимого разрешения, disableVideo() возвращает HostError.
if let error = participant.disableVideo() {
	// Handle error - permission denied.
}
  1. Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у целевого участника videoEnabled становится false.
extension MeetingViewModel: RtkParticipantsEventListener {
	func onVideoUpdate(participant: RtkRemoteParticipant, isEnabled: Bool) {
		// videoEnabled is false
		// Update UI for the participant
	}
}

// Register the listener
meeting.addParticipantsEventListener(participantsEventListener: self)
  1. Проверьте, что у локального участника есть разрешение отключать видео у других участников.
const canDisableParticipantVideo = meeting.self.permissions.canDisableParticipantVideo;
if (!canDisableParticipantVideo) {
	// Disable the control in your UI.
}
  1. Вызовите disableVideo() для целевого участника.
participant
	.disableVideo()
	.catch((err) => {
		// Handle error - permission denied or other issue.
		console.log(err);
	});
  1. Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у целевого участника videoEnabled становится false.
meeting.participants.joined.on('videoUpdate', (participant) => {
	// participant.videoEnabled is false
	// Update UI for the participant
});

Отключение видео всех участников

Это затрагивает всех участников, включая локального участника. Чтобы отключить видео для всех участников сессии:

  1. Проверьте, что у локального участника есть разрешение отключать видео у других участников.

    const canDisableVideo =
    	meeting.self.permissions.canDisableParticipantVideo === true;
    if (!canDisableVideo) {
    	// Disable the control in your UI.
    }
  2. Вызовите disableAllVideo().

    Если у локального участника нет необходимого разрешения, disableAllVideo() выбрасывает ClientError с кодом 1201.

    try {
    	await meeting.participants.disableAllVideo();
    } catch (err: any) {
    	if (err?.code === 1201) {
    		// The local participant does not have permission to disable other participants’ video.
    		return;
    	}
    	throw err;
    }
  3. Обработайте результат, подписавшись на обновления.

    После успешного завершения вызова у каждого участника videoEnabled становится false, и SDK создаёт событие videoUpdate событие. Локальный участник также получает videoUpdate на meeting.self.

    Прослушивайте обновления удалённого участника на joined map:

    meeting.participants.joined.on(
    	"videoUpdate",
    	(participant, { videoEnabled, videoTrack }) => {
    		// videoEnabled is false
    		// Update UI for the participant
    	},
    );

    Прослушивайте обновление локального участника на meeting.self:

    meeting.self.on("videoUpdate", ({ videoEnabled, videoTrack }) => {
    	// videoEnabled is false
    	// Update UI for the local participant
    });
  1. Проверьте, что у локального участника есть разрешение отключать видео у других участников.

    const canDisableVideo =
    	meeting.self.permissions.canDisableParticipantVideo === true;
    if (!canDisableVideo) {
    	// Disable the control in your UI.
    }
  2. Вызовите disableAllVideo().

    Если у локального участника нет необходимого разрешения, disableAllVideo() выбрасывает ClientError с кодом 1201.

    try {
    	await meeting.participants.disableAllVideo();
    } catch (err: any) {
    	if (err?.code === 1201) {
    		// The local participant does not have permission to disable other participants’ video.
    		return;
    	}
    	throw err;
    }
  3. Обработайте результат, подписавшись на обновления.

    После успешного завершения вызова у каждого участника videoEnabled становится false, и SDK создаёт событие videoUpdate событие. Локальный участник также получает videoUpdate на meeting.self.

    Прослушивайте обновления удалённого участника на joined map:

    meeting.participants.joined.on(
    	"videoUpdate",
    	(participant, { videoEnabled, videoTrack }) => {
    		// videoEnabled is false
    		// Update UI for the participant
    	},
    );

    Прослушивайте обновление локального участника на meeting.self:

    meeting.self.on("videoUpdate", ({ videoEnabled, videoTrack }) => {
    	// videoEnabled is false
    	// Update UI for the local participant
    });
  1. Проверьте, что у локального участника есть разрешение отключать видео у других участников.

    const canDisableVideo =
    	meeting.self.permissions.canDisableParticipantVideo === true;
    if (!canDisableVideo) {
    	// Disable the control in your UI.
    }
  2. Вызовите disableAllVideo().

    Если у локального участника нет необходимого разрешения, disableAllVideo() выбрасывает ClientError с кодом 1201.

    try {
    	await meeting.participants.disableAllVideo();
    } catch (err: any) {
    	if (err?.code === 1201) {
    		// The local participant does not have permission to disable other participants’ video.
    		return;
    	}
    	throw err;
    }
  3. Обработайте результат, подписавшись на обновления.

    После успешного завершения вызова у каждого участника videoEnabled становится false, и SDK создаёт событие videoUpdate событие. Локальный участник также получает videoUpdate на meeting.self.

    Прослушивайте обновления удалённого участника на joined map:

    meeting.participants.joined.on(
    	"videoUpdate",
    	(participant, { videoEnabled, videoTrack }) => {
    		// videoEnabled is false
    		// Update UI for the participant
    	},
    );

    Прослушивайте обновление локального участника на meeting.self:

    meeting.self.on("videoUpdate", ({ videoEnabled, videoTrack }) => {
    	// videoEnabled is false
    	// Update UI for the local participant
    });
  1. Проверьте, что у локального участника есть разрешение отключать видео у других участников.
val canMuteVideo = meeting.localUser.permissions.host.canMuteVideo
if (!canMuteVideo) {
	// Disable the control in your UI.
}
  1. Вызовите disableAllVideo() для объекта participants. Если у локального участника нет необходимого разрешения, disableAllVideo() возвращает HostError.
val error = meeting.participants.disableAllVideo()
if (error != null) {
	// Handle error - permission denied.
}
  1. Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у каждого участника videoEnabled становится false.
meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
	override fun onVideoUpdate(participant: RtkRemoteParticipant, isEnabled: Boolean) {
		// videoEnabled is false
		// Update UI for the participant
	}
})
  1. Проверьте, что у локального участника есть разрешение отключать видео у других участников.
let canMuteVideo = meeting.localUser.permissions.host.canMuteVideo
if !canMuteVideo {
	// Disable the control in your UI.
}
  1. Вызовите disableAllVideo() для объекта participants. Если у локального участника нет необходимого разрешения, disableAllVideo() возвращает HostError.
if let error = meeting.participants.disableAllVideo() {
	// Handle error - permission denied.
}
  1. Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у каждого участника videoEnabled становится false.
extension MeetingViewModel: RtkParticipantsEventListener {
	func onVideoUpdate(participant: RtkRemoteParticipant, isEnabled: Bool) {
		// videoEnabled is false
		// Update UI for the participant
	}
}

// Register the listener
meeting.addParticipantsEventListener(participantsEventListener: self)
  1. Проверьте, что у локального участника есть разрешение отключать видео у других участников.
const canDisableParticipantVideo = meeting.self.permissions.canDisableParticipantVideo;
if (!canDisableParticipantVideo) {
	// Disable the control in your UI.
}
  1. Вызовите disableAllVideo() для объекта participants.
meeting.participants
	.disableAllVideo(true)
	.catch((err) => {
		// Handle error - permission denied or other issue.
		console.log(err);
	});
  1. Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у каждого участника videoEnabled становится false.
meeting.participants.joined.on('videoUpdate', (participant) => {
	// participant.videoEnabled is false
	// Update UI for the participant
});

Закрепление участников

Закрепите участника, чтобы выделить его, например ведущего вебинара или преподавателя. Это действие распространяется на всю сессию: закреплённого участника увидят в фокусе все участники. Для этого действия требуется Закрепить участника (pin_participant) с включённым в пресете локального участника разрешением на управление хостом.

Закрепление участника

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

  1. Проверьте, что у локального участника есть разрешение закреплять участников.

    const canPinParticipant = meeting.self.permissions.pinParticipant === true;
    if (!canPinParticipant) {
    	// Disable the control in your UI.
    }
  2. Вызовите pin() для целевого участника.

    Если у локального участника нет необходимого разрешения, pin() выбрасывает ClientError с кодом 1201.

    try {
    	await participant.pin();
    } catch (err: any) {
    	if (err?.code === 1201) {
    		// The local participant does not have permission to pin participants.
    		return;
    	}
    	throw err;
    }
  3. Обработайте результат, подписавшись на обновления.

    После успешного завершения вызова:

    • Целевого участника isPinned становится true.
    • Участник добавляется в meeting.participants.pinned.
    • SDK генерирует pinned событие.

    Вариант A: Слушайте события на объекте participant

    participant.on("pinned", (updatedParticipant) => {
    	// updatedParticipant.isPinned is true
    	// Update your UI.
    });

    Вариант B: Слушайте события на joined map

    meeting.participants.joined.on("pinned", (updatedParticipant) => {
    	// updatedParticipant.isPinned is true
    	// Update your UI.
    });

    Если ранее уже был закреплённый участник, SDK генерирует unpinned событие для этого участника.

  4. На стороне закреплённого участника, meeting.self.isPinned становится true и meeting.self генерирует pinned:

    meeting.self.on("pinned", (selfParticipant) => {
    	// Update the local UI to indicate the participant is pinned.
    });
  1. Проверьте, что у локального участника есть разрешение закреплять участников.

    const canPinParticipant = meeting.self.permissions.pinParticipant === true;
    if (!canPinParticipant) {
    	// Disable the control in your UI.
    }
  2. Вызовите pin() для целевого участника.

    Если у локального участника нет необходимого разрешения, pin() выбрасывает ClientError с кодом 1201.

    try {
    	await participant.pin();
    } catch (err: any) {
    	if (err?.code === 1201) {
    		// The local participant does not have permission to pin participants.
    		return;
    	}
    	throw err;
    }
  3. Обработайте результат, подписавшись на обновления.

    После успешного завершения вызова:

    • Целевого участника isPinned становится true.
    • Участник добавляется в meeting.participants.pinned.
    • SDK генерирует pinned событие.

    Вариант A: Слушайте события на объекте participant

    participant.on("pinned", (updatedParticipant) => {
    	// updatedParticipant.isPinned is true
    	// Update your UI.
    });

    Вариант B: Слушайте события на joined map

    meeting.participants.joined.on("pinned", (updatedParticipant) => {
    	// updatedParticipant.isPinned is true
    	// Update your UI.
    });

    Если ранее уже был закреплённый участник, SDK генерирует unpinned событие для этого участника.

  4. На стороне закреплённого участника, meeting.self.isPinned становится true и meeting.self генерирует pinned:

    meeting.self.on("pinned", (selfParticipant) => {
    	// Update the local UI to indicate the participant is pinned.
    });
  1. Проверьте, что у локального участника есть разрешение закреплять участников.

    const canPinParticipant = meeting.self.permissions.pinParticipant === true;
    if (!canPinParticipant) {
    	// Disable the control in your UI.
    }
  2. Вызовите pin() для целевого участника.

    Если у локального участника нет необходимого разрешения, pin() выбрасывает ClientError с кодом 1201.

    try {
    	await participant.pin();
    } catch (err: any) {
    	if (err?.code === 1201) {
    		// The local participant does not have permission to pin participants.
    		return;
    	}
    	throw err;
    }
  3. Обработайте результат, подписавшись на обновления.

    После успешного завершения вызова:

    • Целевого участника isPinned становится true.
    • Участник добавляется в meeting.participants.pinned.
    • SDK генерирует pinned событие.

    Вариант A: Слушайте события на объекте participant

    participant.on("pinned", (updatedParticipant) => {
    	// updatedParticipant.isPinned is true
    	// Update your UI.
    });

    Вариант B: Слушайте события на joined map

    meeting.participants.joined.on("pinned", (updatedParticipant) => {
    	// updatedParticipant.isPinned is true
    	// Update your UI.
    });

    Если ранее уже был закреплённый участник, SDK генерирует unpinned событие для этого участника.

  4. На стороне закреплённого участника, meeting.self.isPinned становится true и meeting.self генерирует pinned:

    meeting.self.on("pinned", (selfParticipant) => {
    	// Update the local UI to indicate the participant is pinned.
    });
  1. Проверьте, что у локального участника есть разрешение закреплять участников.
val canPinParticipant = meeting.localUser.permissions.host.canPinParticipant
if (!canPinParticipant) {
	// Disable the control in your UI.
}
  1. Вызовите pin() для целевого участника. Если у локального участника нет необходимого разрешения, pin() возвращает HostError.
val error = participant.pin()
if (error != null) {
	// Handle error - permission denied.
}
  1. Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у целевого участника isPinned становится true а участник доступен в meeting.participants.pinned.
meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
	override fun onParticipantPinned(participant: RtkRemoteParticipant) {
		// participant.isPinned is true
		// Update your UI.
	}
})
  1. Проверьте, что у локального участника есть разрешение закреплять участников.
let canPinParticipant = meeting.localUser.permissions.host.canPinParticipant
if !canPinParticipant {
	// Disable the control in your UI.
}
  1. Вызовите pin() для целевого участника. Если у локального участника нет необходимого разрешения, pin() возвращает HostError.
if let error = participant.pin() {
	// Handle error - permission denied.
}
  1. Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у целевого участника isPinned становится true а участник доступен в meeting.participants.pinned.
extension MeetingViewModel: RtkParticipantsEventListener {
	func onParticipantPinned(participant: RtkRemoteParticipant) {
		// participant.isPinned is true
		// Update your UI.
	}
}

// Register the listener
meeting.addParticipantsEventListener(participantsEventListener: self)
  1. Проверьте, что у локального участника есть разрешение закреплять участников.
const canPinParticipant = meeting.self.permissions.pinParticipant;
if (!canPinParticipant) {
	// Disable the control in your UI.
}
  1. Вызовите pin() для целевого участника.
participant.pin();
  1. Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у целевого участника isPinned становится true а участник доступен в meeting.participants.pinned.
meeting.participants.pinned.on('participantPinned', (participant) => {
	// participant.isPinned is true
	// Update your UI.
});

Открепление участника

Открепите участника, если нужно отменить выделение и вернуть сессию к обычной сетке или представлению активного спикера. Чтобы открепить закреплённого участника в сессии:

  1. Проверьте, что у локального участника есть разрешение откреплять участников.

    const canUnpinParticipant = meeting.self.permissions.pinParticipant === true;
    if (!canUnpinParticipant) {
    	// Disable the control in your UI.
    }
  2. Вызовите unpin() для целевого участника.

    Если у локального участника нет необходимого разрешения, unpin() выбрасывает ClientError с кодом 1201.

    try {
    	await participant.unpin();
    } catch (err: any) {
    	if (err?.code === 1201) {
    		// The local participant does not have permission to unpin participants.
    		return;
    	}
    	throw err;
    }
  3. Обработайте результат, подписавшись на обновления.

    После успешного завершения вызова:

    • Целевого участника isPinned становится false.
    • Участник удаляется из meeting.participants.pinned.
    • SDK генерирует unpinned событие.

    Вариант A: Слушайте события на объекте participant

    participant.on("unpinned", (updatedParticipant) => {
    	// updatedParticipant.isPinned is false
    	// Update your UI.
    });

    Вариант B: Слушайте события на joined map

    meeting.participants.joined.on("unpinned", (updatedParticipant) => {
    	// updatedParticipant.isPinned is false
    	// Update your UI.
    });
  4. На стороне откреплённого участника, meeting.self.isPinned становится false и meeting.self генерирует unpinned:

    meeting.self.on("unpinned", (selfParticipant) => {
    	// Update the local UI to indicate the participant is no longer pinned.
    });
  1. Проверьте, что у локального участника есть разрешение откреплять участников.

    const canUnpinParticipant = meeting.self.permissions.pinParticipant === true;
    if (!canUnpinParticipant) {
    	// Disable the control in your UI.
    }
  2. Вызовите unpin() для целевого участника.

    Если у локального участника нет необходимого разрешения, unpin() выбрасывает ClientError с кодом 1201.

    try {
    	await participant.unpin();
    } catch (err: any) {
    	if (err?.code === 1201) {
    		// The local participant does not have permission to unpin participants.
    		return;
    	}
    	throw err;
    }
  3. Обработайте результат, подписавшись на обновления.

    После успешного завершения вызова:

    • Целевого участника isPinned становится false.
    • Участник удаляется из meeting.participants.pinned.
    • SDK генерирует unpinned событие.

    Вариант A: Слушайте события на объекте participant

    participant.on("unpinned", (updatedParticipant) => {
    	// updatedParticipant.isPinned is false
    	// Update your UI.
    });

    Вариант B: Слушайте события на joined map

    meeting.participants.joined.on("unpinned", (updatedParticipant) => {
    	// updatedParticipant.isPinned is false
    	// Update your UI.
    });
  4. На стороне откреплённого участника, meeting.self.isPinned становится false и meeting.self генерирует unpinned:

    meeting.self.on("unpinned", (selfParticipant) => {
    	// Update the local UI to indicate the participant is no longer pinned.
    });
  1. Проверьте, что у локального участника есть разрешение откреплять участников.

    const canUnpinParticipant = meeting.self.permissions.pinParticipant === true;
    if (!canUnpinParticipant) {
    	// Disable the control in your UI.
    }
  2. Вызовите unpin() для целевого участника.

    Если у локального участника нет необходимого разрешения, unpin() выбрасывает ClientError с кодом 1201.

    try {
    	await participant.unpin();
    } catch (err: any) {
    	if (err?.code === 1201) {
    		// The local participant does not have permission to unpin participants.
    		return;
    	}
    	throw err;
    }
  3. Обработайте результат, подписавшись на обновления.

    После успешного завершения вызова:

    • Целевого участника isPinned становится false.
    • Участник удаляется из meeting.participants.pinned.
    • SDK генерирует unpinned событие.

    Вариант A: Слушайте события на объекте participant

    participant.on("unpinned", (updatedParticipant) => {
    	// updatedParticipant.isPinned is false
    	// Update your UI.
    });

    Вариант B: Слушайте события на joined map

    meeting.participants.joined.on("unpinned", (updatedParticipant) => {
    	// updatedParticipant.isPinned is false
    	// Update your UI.
    });
  4. На стороне откреплённого участника, meeting.self.isPinned становится false и meeting.self генерирует unpinned:

    meeting.self.on("unpinned", (selfParticipant) => {
    	// Update the local UI to indicate the participant is no longer pinned.
    });
  1. Проверьте, что у локального участника есть разрешение откреплять участников.
val canPinParticipant = meeting.localUser.permissions.host.canPinParticipant
if (!canPinParticipant) {
	// Disable the control in your UI.
}
  1. Вызовите unpin() для целевого участника. Если у локального участника нет необходимого разрешения, unpin() возвращает HostError.
val error = participant.unpin()
if (error != null) {
	// Handle error - permission denied.
}
  1. Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у целевого участника isPinned становится false.
meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
	override fun onParticipantUnpinned(participant: RtkRemoteParticipant) {
		// participant.isPinned is false
		// Update your UI.
	}
})
  1. Проверьте, что у локального участника есть разрешение откреплять участников.
let canPinParticipant = meeting.localUser.permissions.host.canPinParticipant
if !canPinParticipant {
	// Disable the control in your UI.
}
  1. Вызовите unpin() для целевого участника. Если у локального участника нет необходимого разрешения, unpin() возвращает HostError.
if let error = participant.unpin() {
	// Handle error - permission denied.
}
  1. Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у целевого участника isPinned становится false.
extension MeetingViewModel: RtkParticipantsEventListener {
	func onParticipantUnpinned(participant: RtkRemoteParticipant) {
		// participant.isPinned is false
		// Update your UI.
	}
}

// Register the listener
meeting.addParticipantsEventListener(participantsEventListener: self)
  1. Проверьте, что у локального участника есть разрешение откреплять участников.
const canPinParticipant = meeting.self.permissions.pinParticipant;
if (!canPinParticipant) {
	// Disable the control in your UI.
}
  1. Вызовите unpin() для целевого участника.
participant.unpin();
  1. Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у целевого участника isPinned становится false.
meeting.participants.pinned.on('unpinned', (participant) => {
	// participant.isPinned is false
	// Update your UI.
});

Удалите участников

Удаляйте участников из сессии, когда нужно пресекать деструктивное поведение или обеспечивать соблюдение правил сессии. Для этого действия в пресете локального участника должно быть включено право хоста Удаление участников (kick_participant) с включённым в пресете локального участника разрешением на управление хостом.

Удалите участника

Чтобы удалить конкретного участника из сессии:

  1. Проверьте, что у локального участника есть разрешение удалять участников.

    const canKickParticipant = meeting.self.permissions.kickParticipant === true;
    if (!canKickParticipant) {
    	// Disable the control in your UI.
    }
  2. Вызовите kick() для целевого участника.

    Если у локального участника нет необходимого разрешения, kick() выбрасывает ClientError с кодом 1201.

    try {
    	await participant.kick();
    } catch (err: any) {
    	if (err?.code === 1201) {
    		// The local participant does not have permission to remove participants.
    		return;
    	}
    	throw err;
    }
  3. Обработайте результат, подписавшись на обновления.

    После успешного завершения вызова:

    • Исключённый участник удаляется из meeting.participants.joined.
    • Участник удаляется из других map участников, в которых он находился (например, meeting.participants.pinned).
    • SDK генерирует participantLeft на meeting.participants.joined.
    meeting.participants.joined.on("participantLeft", (participant) => {
    	// Remove the participant tile from the UI.
    });

    Об уходе участника узнают и другие участники сессии благодаря participantLeft.

  4. На стороне удалённого участника сессия отключается, и meeting.self генерирует roomLeft событие с состоянием, равным kicked.

    meeting.self.on("roomLeft", ({ state }) => {
    	if (state === "kicked") {
    		// Show a message and navigate the user out of the meeting UI.
    	}
    });
  1. Проверьте, что у локального участника есть разрешение удалять участников.

    const canKickParticipant = meeting.self.permissions.kickParticipant === true;
    if (!canKickParticipant) {
    	// Disable the control in your UI.
    }
  2. Вызовите kick() для целевого участника.

    Если у локального участника нет необходимого разрешения, kick() выбрасывает ClientError с кодом 1201.

    try {
    	await participant.kick();
    } catch (err: any) {
    	if (err?.code === 1201) {
    		// The local participant does not have permission to remove participants.
    		return;
    	}
    	throw err;
    }
  3. Обработайте результат, подписавшись на обновления.

    После успешного завершения вызова:

    • Исключённый участник удаляется из meeting.participants.joined.
    • Участник удаляется из других map участников, в которых он находился (например, meeting.participants.pinned).
    • SDK генерирует participantLeft на meeting.participants.joined.
    meeting.participants.joined.on("participantLeft", (participant) => {
    	// Remove the participant tile from the UI.
    });

    Об уходе участника узнают и другие участники сессии благодаря participantLeft.

  4. На стороне удалённого участника сессия отключается, и meeting.self генерирует roomLeft событие с состоянием, равным kicked.

    meeting.self.on("roomLeft", ({ state }) => {
    	if (state === "kicked") {
    		// Show a message and navigate the user out of the meeting UI.
    	}
    });
  1. Проверьте, что у локального участника есть разрешение удалять участников.

    const canKickParticipant = meeting.self.permissions.kickParticipant === true;
    if (!canKickParticipant) {
    	// Disable the control in your UI.
    }
  2. Вызовите kick() для целевого участника.

    Если у локального участника нет необходимого разрешения, kick() выбрасывает ClientError с кодом 1201.

    try {
    	await participant.kick();
    } catch (err: any) {
    	if (err?.code === 1201) {
    		// The local participant does not have permission to remove participants.
    		return;
    	}
    	throw err;
    }
  3. Обработайте результат, подписавшись на обновления.

    После успешного завершения вызова:

    • Исключённый участник удаляется из meeting.participants.joined.
    • Участник удаляется из других map участников, в которых он находился (например, meeting.participants.pinned).
    • SDK генерирует participantLeft на meeting.participants.joined.
    meeting.participants.joined.on("participantLeft", (participant) => {
    	// Remove the participant tile from the UI.
    });

    Об уходе участника узнают и другие участники сессии благодаря participantLeft.

  4. На стороне удалённого участника сессия отключается, и meeting.self генерирует roomLeft событие с состоянием, равным kicked.

    meeting.self.on("roomLeft", ({ state }) => {
    	if (state === "kicked") {
    		// Show a message and navigate the user out of the meeting UI.
    	}
    });
  1. Проверьте, что у локального участника есть разрешение удалять участников.
val canKickParticipant = meeting.localUser.permissions.host.canKickParticipant
if (!canKickParticipant) {
	// Disable the control in your UI.
}
  1. Вызовите kick() для целевого участника. Если у локального участника нет необходимого разрешения, kick() возвращает HostError.
val error = participant.kick()
if (error != null) {
	// Handle error - permission denied.
}
  1. Обработайте результат, подписавшись на обновления. После успешного выполнения вызова исключенный участник удаляется из meeting.participants.joined.
meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
	override fun onParticipantLeave(participant: RtkRemoteParticipant) {
		// Remove the participant tile from the UI.
	}
})
  1. Проверьте, что у локального участника есть разрешение удалять участников.
let canKickParticipant = meeting.localUser.permissions.host.canKickParticipant
if !canKickParticipant {
	// Disable the control in your UI.
}
  1. Вызовите kick() для целевого участника. Если у локального участника нет необходимого разрешения, kick() возвращает HostError.
if let error = participant.kick() {
	// Handle error - permission denied.
}
  1. Обработайте результат, подписавшись на обновления. После успешного выполнения вызова исключенный участник удаляется из meeting.participants.joined.
extension MeetingViewModel: RtkParticipantsEventListener {
	func onParticipantLeave(participant: RtkRemoteParticipant) {
		// Remove the participant tile from the UI.
	}
}

// Register the listener
meeting.addParticipantsEventListener(participantsEventListener: self)
  1. Проверьте, что у локального участника есть разрешение удалять участников.
const canKickParticipant = meeting.self.permissions.kickParticipant;
if (!canKickParticipant) {
	// Disable the control in your UI.
}
  1. Вызовите kick() для целевого участника.
participant
	.kick()
	.catch((err) => {
		// Handle error - permission denied or other issue.
		console.log(err);
	});
  1. Обработайте результат, подписавшись на обновления. После успешного выполнения вызова исключенный участник удаляется из meeting.participants.joined.
meeting.participants.joined.on('participantLeft', (participant) => {
	// Remove the participant tile from the UI.
});

Удалите всех участников

Это удаляет всех из сессии, включая локального участника. Это завершает сессию для всех.

Полное описание процесса завершения сессии см. в Завершение сессии.

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

  1. Проверьте, что у локального участника есть разрешение удалять участников.

    const canKickParticipant = meeting.self.permissions.kickParticipant === true;
    if (!canKickParticipant) {
    	// Disable the control in your UI.
    }
  2. Вызовите kickAll().

    Если у локального участника нет необходимого разрешения, kickAll() выбрасывает ClientError с кодом 1201.

    try {
    	await meeting.participants.kickAll();
    } catch (err: any) {
    	if (err?.code === 1201) {
    		// The local participant does not have permission to remove participants.
    		return;
    	}
    	throw err;
    }
  3. Обработайте результат, подписавшись на обновления.

    После успешного завершения вызова все участники выходят из сессии. На каждом клиенте meeting.self генерирует roomLeft с состоянием, установленным в ended.

    meeting.self.on("roomLeft", ({ state }) => {
    	if (state === "ended") {
    		// Show a message and navigate the user out of the meeting UI.
    	}
    });
  1. Проверьте, что у локального участника есть разрешение удалять участников.

    const canKickParticipant = meeting.self.permissions.kickParticipant === true;
    if (!canKickParticipant) {
    	// Disable the control in your UI.
    }
  2. Вызовите kickAll().

    Если у локального участника нет необходимого разрешения, kickAll() выбрасывает ClientError с кодом 1201.

    try {
    	await meeting.participants.kickAll();
    } catch (err: any) {
    	if (err?.code === 1201) {
    		// The local participant does not have permission to remove participants.
    		return;
    	}
    	throw err;
    }
  3. Обработайте результат, подписавшись на обновления.

    После успешного завершения вызова все участники выходят из сессии. На каждом клиенте meeting.self генерирует roomLeft с состоянием, установленным в ended.

    meeting.self.on("roomLeft", ({ state }) => {
    	if (state === "ended") {
    		// Show a message and navigate the user out of the meeting UI.
    	}
    });
  1. Проверьте, что у локального участника есть разрешение удалять участников.

    const canKickParticipant = meeting.self.permissions.kickParticipant === true;
    if (!canKickParticipant) {
    	// Disable the control in your UI.
    }
  2. Вызовите kickAll().

    Если у локального участника нет необходимого разрешения, kickAll() выбрасывает ClientError с кодом 1201.

    try {
    	await meeting.participants.kickAll();
    } catch (err: any) {
    	if (err?.code === 1201) {
    		// The local participant does not have permission to remove participants.
    		return;
    	}
    	throw err;
    }
  3. Обработайте результат, подписавшись на обновления.

    После успешного завершения вызова все участники выходят из сессии. На каждом клиенте meeting.self генерирует roomLeft с состоянием, установленным в ended.

    meeting.self.on("roomLeft", ({ state }) => {
    	if (state === "ended") {
    		// Show a message and navigate the user out of the meeting UI.
    	}
    });
  1. Проверьте, что у локального участника есть разрешение удалять участников.
val canKickParticipant = meeting.localUser.permissions.host.canKickParticipant
if (!canKickParticipant) {
	// Disable the control in your UI.
}
  1. Вызовите kickAll() для объекта participants. Если у локального участника нет необходимого разрешения, kickAll() возвращает HostError.
val error = meeting.participants.kickAll()
if (error != null) {
	// Handle error - permission denied.
}
  1. Обработайте результат, подписавшись на обновления. После успешного выполнения вызова все участники покидают сессию.
meeting.addMeetingRoomEventListener(object : RtkMeetingRoomEventListener {
	override fun onMeetingEnded() {
		// Show a message and navigate the user out of the meeting UI.
	}
})
  1. Проверьте, что у локального участника есть разрешение удалять участников.
let canKickParticipant = meeting.localUser.permissions.host.canKickParticipant
if !canKickParticipant {
	// Disable the control in your UI.
}
  1. Вызовите kickAll() для объекта participants. Если у локального участника нет необходимого разрешения, kickAll() возвращает HostError.
if let error = meeting.participants.kickAll() {
	// Handle error - permission denied.
}
  1. Обработайте результат, подписавшись на обновления. После успешного выполнения вызова все участники покидают сессию.
extension MeetingViewModel: RtkMeetingRoomEventListener {
	func onMeetingEnded() {
		// Show a message and navigate the user out of the meeting UI.
	}
}

// Register the listener
meeting.addMeetingRoomEventListener(meetingRoomEventListener: self)
  1. Проверьте, что у локального участника есть разрешение удалять участников.
const canKickParticipant = meeting.self.permissions.kickParticipant;
if (!canKickParticipant) {
	// Disable the control in your UI.
}
  1. Вызовите kickAll() для объекта participants.
meeting.participants
	.kickAll()
	.catch((err) => {
		// Handle error - permission denied or other issue.
		console.log(err);
	});
  1. Обработайте результат, подписавшись на обновления. После успешного выполнения вызова все участники покидают сессию.
meeting.self.on('roomLeft', ({ state }) => {
	if (state === 'kicked') {
		// Show a message and navigate the user out of the meeting UI.
	}
});

Следующие шаги