このページでは、meeting.participants と関連する参加者マップが発行するイベントの概要を説明します。参加者の参加や退出、ピン留めの更新、アクティブスピーカーの変更、グリッドの表示モードやページ変更などに合わせて、UI を同期できます。
これらのイベントで、グリッドの変更を監視できます。
ACTIVE_GRID と PAGINATED のあいだで表示モードが変わったときに発生します。
meeting.participants.on(
"viewModeChanged",
({ viewMode, currentPage, pageCount }) => {
console.log("view mode changed", viewMode);
},
);ACTIVE_GRID と PAGINATED のあいだで表示モードが変わったときに発生します。
const viewMode = useRealtimeKitSelector((m) => m.participants.viewMode);またはイベントリスナーを使います。
meeting.participants.on(
"viewModeChanged",
({ viewMode, currentPage, pageCount }) => {
console.log("view mode changed", viewMode);
},
);このイベントはこのプラットフォームでは利用できません。
ACTIVE_GRID と PAGINATED のあいだで表示モードが変わったときに発生します。
const viewMode = useRealtimeKitSelector((m) => m.participants.viewMode);またはイベントリスナーを使います。
meeting.participants.on(
"viewModeChanged",
({ viewMode, currentPage, pageCount }) => {
console.log("view mode changed", viewMode);
},
);ページネーションモードでページが変わったときに発生します。
meeting.participants.on(
"pageChanged",
({ viewMode, currentPage, pageCount }) => {
console.log("page changed", currentPage);
},
);ページネーションモードでページが変わったときに発生します。
const currentPage = useRealtimeKitSelector((m) => m.participants.currentPage);
const pageCount = useRealtimeKitSelector((m) => m.participants.pageCount);このイベントはこのプラットフォームでは利用できません。
ページネーションモードでページが変わったときに発生します。
const currentPage = useRealtimeKitSelector((m) => m.participants.currentPage);
const pageCount = useRealtimeKitSelector((m) => m.participants.pageCount);参加者が話し始めたときに発生します。
meeting.participants.on("activeSpeaker", (participant) => {
console.log(`${participant.id} is currently speaking`);
});const activeSpeaker = useRealtimeKitSelector(
(m) => m.participants.lastActiveSpeaker,
);またはイベントリスナーを使います。
meeting.participants.on("activeSpeaker", (participant) => {
console.log(`${participant.id} is currently speaking`);
});meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
override fun onActiveSpeakerChanged(participant: RtkRemoteParticipant?) {
participant?.let {
println("${it.id} is currently speaking")
}
}
})extension MeetingViewModel: RtkParticipantsEventListener {
func onActiveSpeakerChanged(participant: RtkRemoteParticipant?) {
if let participant = participant {
print("\(participant.id) is currently speaking")
}
}
}
meeting.addParticipantsEventListener(self)const activeSpeaker = useRealtimeKitSelector(
(m) => m.participants.lastActiveSpeaker,
);またはイベントリスナーを使います。
meeting.participants.on("activeSpeaker", (participant) => {
console.log(`${participant.id} is currently speaking`);
});これらのイベントで、リモート参加者マップの変更を監視できます。参加者がミーティングに参加または退出したとき、ピン留めされたとき、グリッドから外れたときに通知を受け取れます。
いずれかの参加者がミーティングに参加したときに発生します。
meeting.participants.joined.on("participantJoined", (participant) => {
console.log(`A participant with id "${participant.id}" has joined`);
});const joinedParticipants = useRealtimeKitSelector((m) => m.participants.joined);またはイベントリスナーを使います。
meeting.participants.joined.on("participantJoined", (participant) => {
console.log(`A participant with id "${participant.id}" has joined`);
});meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
override fun onParticipantJoin(participant: RtkRemoteParticipant) {
println("A participant with id ${participant.id} has joined")
}
})extension MeetingViewModel: RtkParticipantsEventListener {
func onParticipantJoin(participant: RtkRemoteParticipant) {
print("A participant with id \(participant.id) has joined")
}
}
meeting.addParticipantsEventListener(self)const joinedParticipants = useRealtimeKitSelector((m) => m.participants.joined);またはイベントリスナーを使います。
meeting.participants.joined.on("participantJoined", (participant) => {
console.log(`A participant with id "${participant.id}" has joined`);
});いずれかの参加者がミーティングから退出したときに発生します。
meeting.participants.joined.on("participantLeft", (participant) => {
console.log(`A participant with id "${participant.id}" has left the meeting`);
});const joinedParticipants = useRealtimeKitSelector((m) => m.participants.joined);またはイベントリスナーを使います。
meeting.participants.joined.on("participantLeft", (participant) => {
console.log(`A participant with id "${participant.id}" has left the meeting`);
});meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
override fun onParticipantLeave(participant: RtkRemoteParticipant) {
println("A participant with id ${participant.id} has left the meeting")
}
})extension MeetingViewModel: RtkParticipantsEventListener {
func onParticipantLeave(participant: RtkRemoteParticipant) {
print("A participant with id \(participant.id) has left the meeting")
}
}
meeting.addParticipantsEventListener(self)const joinedParticipants = useRealtimeKitSelector((m) => m.participants.joined);またはイベントリスナーを使います。
meeting.participants.joined.on("participantLeft", (participant) => {
console.log(`A participant with id "${participant.id}" has left the meeting`);
});各参加者マップは participantJoined と participantLeft イベントを発行します。
// Listen for when a participant gets pinned
meeting.participants.pinned.on("participantJoined", (participant) => {
console.log(`Participant ${participant.name} got pinned`);
});
// Listen for when a participant gets unpinned
meeting.participants.pinned.on("participantLeft", (participant) => {
console.log(`Participant ${participant.name} got unpinned`);
});meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
override fun onActiveParticipantsChanged(active: List<RtkRemoteParticipant>) {
// Called when active participants change
}
})extension MeetingViewModel: RtkParticipantsEventListener {
func onActiveParticipantsChanged(active: [RtkRemoteParticipant]) {
// Called when active participants change
}
}
meeting.addParticipantsEventListener(self)参加者がピン留めされたときに発生します。
meeting.participants.joined.on("pinned", (participant) => {
console.log(`Participant with id "${participant.id}" was pinned`);
});const pinnedParticipants = useRealtimeKitSelector((m) => m.participants.pinned);またはイベントリスナーを使います。
meeting.participants.joined.on("pinned", (participant) => {
console.log(`Participant with id "${participant.id}" was pinned`);
});meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
override fun onParticipantPinned(participant: RtkRemoteParticipant) {
println("Participant with id ${participant.id} was pinned")
}
})extension MeetingViewModel: RtkParticipantsEventListener {
func onParticipantPinned(participant: RtkRemoteParticipant) {
print("Participant with id \(participant.id) was pinned")
}
}
meeting.addParticipantsEventListener(self)const pinnedParticipants = useRealtimeKitSelector((m) => m.participants.pinned);またはイベントリスナーを使います。
meeting.participants.joined.on("pinned", (participant) => {
console.log(`Participant with id "${participant.id}" was pinned`);
});参加者のピン留めが解除されたときに発生します。
meeting.participants.joined.on("unpinned", (participant) => {
console.log(`Participant with id "${participant.id}" was unpinned`);
});const pinnedParticipants = useRealtimeKitSelector((m) => m.participants.pinned);またはイベントリスナーを使います。
meeting.participants.joined.on("unpinned", (participant) => {
console.log(`Participant with id "${participant.id}" was unpinned`);
});meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
override fun onParticipantUnpinned(participant: RtkRemoteParticipant) {
println("Participant with id ${participant.id} was unpinned")
}
})extension MeetingViewModel: RtkParticipantsEventListener {
func onParticipantUnpinned(participant: RtkRemoteParticipant) {
print("Participant with id \(participant.id) was unpinned")
}
}
meeting.addParticipantsEventListener(self)const pinnedParticipants = useRealtimeKitSelector((m) => m.participants.pinned);またはイベントリスナーを使います。
meeting.participants.joined.on("unpinned", (participant) => {
console.log(`Participant with id "${participant.id}" was unpinned`);
});次のイベントで、特定の参加者の変更を監視できます。
いずれかの参加者がビデオを開始または停止したときに発生します。
meeting.participants.joined.on("videoUpdate", (participant) => {
console.log(
`A participant with id "${participant.id}" updated their video track`,
);
if (participant.videoEnabled) {
// Use participant.videoTrack
} else {
// Handle stop video
}
});// Check for one participant
const videoEnabled = useRealtimeKitSelector(
(m) => m.participants.joined.get(participantId)?.videoEnabled,
);
// All video enabled participants
const videoEnabledParticipants = useRealtimeKitSelector((m) =>
m.participants.joined.toArray().filter((p) => p.videoEnabled),
);meeting.addParticipantEventListener(object : RtkParticipantEventListener {
override fun onVideoUpdate(participant: RtkRemoteParticipant, isEnabled: Boolean) {
println("Participant ${participant.id} video is now ${if (isEnabled) "enabled" else "disabled"}")
}
})extension MeetingViewModel: RtkParticipantEventListener {
func onVideoUpdate(participant: RtkRemoteParticipant, isEnabled: Bool) {
print("Participant \(participant.id) video is now \(isEnabled ? "enabled" : "disabled")")
}
}
meeting.addParticipantEventListener(self)// Check for one participant
const videoEnabled = useRealtimeKitSelector(
(m) => m.participants.joined.get(participantId)?.videoEnabled,
);
// All video enabled participants
const videoEnabledParticipants = useRealtimeKitSelector((m) =>
m.participants.joined.toArray().filter((p) => p.videoEnabled),
);いずれかの参加者が音声を開始または停止したときに発生します。
meeting.participants.joined.on("audioUpdate", (participant) => {
console.log(
`A participant with id "${participant.id}" updated their audio track`,
);
if (participant.audioEnabled) {
// Use participant.audioTrack
} else {
// Handle stop audio
}
});// Check for one participant
const audioEnabled = useRealtimeKitSelector(
(m) => m.participants.joined.get(participantId)?.audioEnabled,
);
// All audio enabled participants
const audioEnabledParticipants = useRealtimeKitSelector((m) =>
m.participants.joined.toArray().filter((p) => p.audioEnabled),
);meeting.addParticipantEventListener(object : RtkParticipantEventListener {
override fun onAudioUpdate(participant: RtkRemoteParticipant, isEnabled: Boolean) {
println("Participant ${participant.id} audio is now ${if (isEnabled) "enabled" else "disabled"}")
}
})extension MeetingViewModel: RtkParticipantEventListener {
func onAudioUpdate(participant: RtkRemoteParticipant, isEnabled: Bool) {
print("Participant \(participant.id) audio is now \(isEnabled ? "enabled" : "disabled")")
}
}
meeting.addParticipantEventListener(self)// Check for one participant
const audioEnabled = useRealtimeKitSelector(
(m) => m.participants.joined.get(participantId)?.audioEnabled,
);
// All audio enabled participants
const audioEnabledParticipants = useRealtimeKitSelector((m) =>
m.participants.joined.toArray().filter((p) => p.audioEnabled),
);いずれかの参加者が画面共有を開始または停止したときに発生します。
meeting.participants.joined.on("screenShareUpdate", (participant) => {
console.log(
`A participant with id "${participant.id}" updated their screen share`,
);
if (participant.screenShareEnabled) {
// Use participant.screenShareTracks
} else {
// Handle stop screen share
}
});// Check for one participant
const screensharingParticipant = useRealtimeKitSelector((m) =>
m.participants.joined.toArray().find((p) => p.screenShareEnabled),
);
// All screen sharing participants
const screenSharingParticipants = useRealtimeKitSelector((m) =>
m.participants.joined.toArray().filter((p) => p.screenShareEnabled),
);meeting.addParticipantEventListener(object : RtkParticipantEventListener {
override fun onScreenShareUpdate(participant: RtkRemoteParticipant, isEnabled: Boolean) {
println("Participant ${participant.id} screen share is now ${if (isEnabled) "enabled" else "disabled"}")
}
})extension MeetingViewModel: RtkParticipantEventListener {
func onScreenShareUpdate(participant: RtkRemoteParticipant, isEnabled: Bool) {
print("Participant \(participant.id) screen share is now \(isEnabled ? "enabled" : "disabled")")
}
}
meeting.addParticipantEventListener(self)// Check for one participant
const screensharingParticipant = useRealtimeKitSelector((m) =>
m.participants.joined.toArray().find((p) => p.screenShareEnabled),
);
// All screen sharing participants
const screenSharingParticipants = useRealtimeKitSelector((m) =>
m.participants.joined.toArray().filter((p) => p.screenShareEnabled),
);mediaScoreUpdate イベントで、参加者のネットワーク品質を監視します。
meeting.participants.joined.on(
"mediaScoreUpdate",
({ participantId, kind, isScreenshare, score, scoreStats }) => {
if (kind === "video") {
console.log(
`Participant ${participantId}'s ${isScreenshare ? "screenshare" : "video"} quality score is`,
score,
);
}
if (kind === "audio") {
console.log(
`Participant ${participantId}'s audio quality score is`,
score,
);
}
if (score < 5) {
console.log(`Participant ${participantId}'s media quality is poor`);
}
},
);mediaScoreUpdate イベントで、参加者のネットワーク品質を監視します。
import { useEffect } from "react";
// Use event listener for media score updates
useEffect(() => {
if (!meeting) return;
const handleMediaScoreUpdate = ({
participantId,
kind,
isScreenshare,
score,
scoreStats,
}) => {
if (kind === "video") {
console.log(
`Participant ${participantId}'s ${isScreenshare ? "screenshare" : "video"} quality score is`,
score,
);
}
if (score < 5) {
console.log(`Participant ${participantId}'s media quality is poor`);
}
};
meeting.participants.joined.on("mediaScoreUpdate", handleMediaScoreUpdate);
return () => {
meeting.participants.joined.off("mediaScoreUpdate", handleMediaScoreUpdate);
};
}, [meeting]);このイベントはこのプラットフォームでは利用できません。
mediaScoreUpdate イベントで、参加者のネットワーク品質を監視します。
import { useEffect } from "react";
// Use event listener for media score updates
useEffect(() => {
if (!meeting) return;
const handleMediaScoreUpdate = ({
participantId,
kind,
isScreenshare,
score,
scoreStats,
}) => {
if (kind === "video") {
console.log(
`Participant ${participantId}'s ${isScreenshare ? "screenshare" : "video"} quality score is`,
score,
);
}
if (score < 5) {
console.log(`Participant ${participantId}'s media quality is poor`);
}
};
meeting.participants.joined.on("mediaScoreUpdate", handleMediaScoreUpdate);
return () => {
meeting.participants.joined.off("mediaScoreUpdate", handleMediaScoreUpdate);
};
}, [meeting]);各参加者オブジェクトはイベントエミッターです。
meeting.participants.joined
.get(participantId)
.on("audioUpdate", ({ audioEnabled, audioTrack }) => {
console.log(
"The participant with id",
participantId,
"has toggled their mic to",
audioEnabled,
);
});または、参加者マップで全参加者を購読します。
meeting.participants.joined.on(
"audioUpdate",
(participant, { audioEnabled, audioTrack }) => {
console.log(
"The participant with id",
participant.id,
"has toggled their mic to",
audioEnabled,
);
},
);import { useRealtimeKitClient } from "@cloudflare/realtimekit-react";
import { useEffect } from "react";
function ParticipantAudioListener({ participantId }) {
const [meeting] = useRealtimeKitClient();
useEffect(() => {
if (!meeting) return;
const handleAudioUpdate = ({ audioEnabled, audioTrack }) => {
console.log(
"The participant with id",
participantId,
"has toggled their mic to",
audioEnabled,
);
};
const participant = meeting.participants.joined.get(participantId);
participant.on("audioUpdate", handleAudioUpdate);
return () => {
participant.off("audioUpdate", handleAudioUpdate);
};
}, [meeting, participantId]);
}または、特定のプロパティにはセレクターを使います。
const audioEnabled = useRealtimeKitSelector(
(m) => m.participants.joined.get(participantId)?.audioEnabled,
);参加者イベントの更新を受け取るには、RtkParticipantEventListener インターフェイスを実装します。
meeting.addParticipantEventListener(object : RtkParticipantEventListener {
override fun onVideoUpdate(participant: RtkRemoteParticipant, isEnabled: Boolean) {
// Called when participant's video state changes
}
override fun onAudioUpdate(participant: RtkRemoteParticipant, isEnabled: Boolean) {
// Called when participant's audio state changes
}
override fun onScreenShareUpdate(participant: RtkRemoteParticipant, isEnabled: Boolean) {
// Called when participant's screen share state changes
}
})参加者イベントの更新を受け取るには、RtkParticipantEventListener プロトコルを実装します。
extension MeetingViewModel: RtkParticipantEventListener {
func onVideoUpdate(participant: RtkRemoteParticipant, isEnabled: Bool) {
// Called when participant's video state changes
}
func onAudioUpdate(participant: RtkRemoteParticipant, isEnabled: Bool) {
// Called when participant's audio state changes
}
func onScreenShareUpdate(participant: RtkRemoteParticipant, isEnabled: Bool) {
// Called when participant's screen share state changes
}
}
meeting.addParticipantEventListener(self)import { useRealtimeKitClient } from "@cloudflare/realtimekit-react-native";
import { useEffect } from "react";
function ParticipantAudioListener({ participantId }) {
const [meeting] = useRealtimeKitClient();
useEffect(() => {
if (!meeting) return;
const handleAudioUpdate = ({ audioEnabled, audioTrack }) => {
console.log(
"The participant with id",
participantId,
"has toggled their mic to",
audioEnabled,
);
};
const participant = meeting.participants.joined.get(participantId);
participant.on("audioUpdate", handleAudioUpdate);
return () => {
participant.off("audioUpdate", handleAudioUpdate);
};
}, [meeting, participantId]);
}または、特定のプロパティにはセレクターを使います。
const audioEnabled = useRealtimeKitSelector(
(m) => m.participants.joined.get(participantId)?.audioEnabled,
);