← Cloudflare Realtime / realtime / realtimekit / core / remote-participants
Události
Tato stránka poskytuje přehled událostí, které vysílá meeting.participants a souvisejících map účastníků, které můžete použít k udržení UI synchronizovaného se změnami, jako je připojení nebo odchod účastníků, aktualizace připnutí, změny aktivního mluvčího a změny režimu mřížkového zobrazení nebo stránky.
Události Grid
Tyto události umožňují sledovat změny mřížky.
Změna režimu zobrazení
Spouští se, když se změní režim zobrazení mezi ACTIVE_GRID a PAGINATED.
meeting.participants.on(
"viewModeChanged",
({ viewMode, currentPage, pageCount }) => {
console.log("view mode changed", viewMode);
},
);Spouští se, když se změní režim zobrazení mezi ACTIVE_GRID a PAGINATED.
const viewMode = useRealtimeKitSelector((m) => m.participants.viewMode);Nebo použijte posluchač událostí:
meeting.participants.on(
"viewModeChanged",
({ viewMode, currentPage, pageCount }) => {
console.log("view mode changed", viewMode);
},
);Tato událost není na této platformě k dispozici.
Spouští se, když se změní režim zobrazení mezi ACTIVE_GRID a PAGINATED.
const viewMode = useRealtimeKitSelector((m) => m.participants.viewMode);Nebo použijte posluchač událostí:
meeting.participants.on(
"viewModeChanged",
({ viewMode, currentPage, pageCount }) => {
console.log("view mode changed", viewMode);
},
);Změna stránky
Spouští se, když se v režimu stránkování změní stránka.
meeting.participants.on(
"pageChanged",
({ viewMode, currentPage, pageCount }) => {
console.log("page changed", currentPage);
},
);Spouští se, když se v režimu stránkování změní stránka.
const currentPage = useRealtimeKitSelector((m) => m.participants.currentPage);
const pageCount = useRealtimeKitSelector((m) => m.participants.pageCount);Tato událost není na této platformě k dispozici.
Spouští se, když se v režimu stránkování změní stránka.
const currentPage = useRealtimeKitSelector((m) => m.participants.currentPage);
const pageCount = useRealtimeKitSelector((m) => m.participants.pageCount);Aktivní řečník
Spouští se, když účastník začne mluvit.
meeting.participants.on("activeSpeaker", (participant) => {
console.log(`${participant.id} is currently speaking`);
});const activeSpeaker = useRealtimeKitSelector(
(m) => m.participants.lastActiveSpeaker,
);Nebo použijte posluchač událostí:
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,
);Nebo použijte posluchač událostí:
meeting.participants.on("activeSpeaker", (participant) => {
console.log(`${participant.id} is currently speaking`);
});Události mapy účastníků
Tyto události umožňují sledovat změny v mapách vzdálených účastníků. Použijte je k tomu, abyste byli upozorněni, když účastník vstoupí do schůzky nebo ji opustí, je připnut nebo opustí mřížku.
Účastník se připojil
Spouští se, když se kterýkoli účastník připojí ke schůzce.
meeting.participants.joined.on("participantJoined", (participant) => {
console.log(`A participant with id "${participant.id}" has joined`);
});const joinedParticipants = useRealtimeKitSelector((m) => m.participants.joined);Nebo použijte posluchač událostí:
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);Nebo použijte posluchač událostí:
meeting.participants.joined.on("participantJoined", (participant) => {
console.log(`A participant with id "${participant.id}" has joined`);
});Účastník odešel
Spouští se, když kterýkoli účastník opustí schůzku.
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);Nebo použijte posluchač událostí:
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);Nebo použijte posluchač událostí:
meeting.participants.joined.on("participantLeft", (participant) => {
console.log(`A participant with id "${participant.id}" has left the meeting`);
});Změna aktivních účastníků
Každá mapa účastníků emituje participantJoined a participantLeft události:
// 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)Účastník připnut
Spouští se, když je účastník připnut.
meeting.participants.joined.on("pinned", (participant) => {
console.log(`Participant with id "${participant.id}" was pinned`);
});const pinnedParticipants = useRealtimeKitSelector((m) => m.participants.pinned);Nebo použijte posluchač událostí:
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);Nebo použijte posluchač událostí:
meeting.participants.joined.on("pinned", (participant) => {
console.log(`Participant with id "${participant.id}" was pinned`);
});Účastník odepnut
Spouští se, když je účastník odepnut.
meeting.participants.joined.on("unpinned", (participant) => {
console.log(`Participant with id "${participant.id}" was unpinned`);
});const pinnedParticipants = useRealtimeKitSelector((m) => m.participants.pinned);Nebo použijte posluchač událostí:
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);Nebo použijte posluchač událostí:
meeting.participants.joined.on("unpinned", (participant) => {
console.log(`Participant with id "${participant.id}" was unpinned`);
});Události účastníka
Změny konkrétního účastníka můžete sledovat pomocí následujících událostí.
Aktualizace videa
Spouští se, když kterýkoli účastník zapne nebo vypne video.
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),
);Aktualizace zvuku
Spouští se, když kterýkoli účastník zapne nebo vypne zvuk.
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),
);Aktualizace sdílení obrazovky
Spouští se, když kterýkoli účastník zahájí nebo ukončí sdílení obrazovky.
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),
);Skóre kvality sítě
Sledujte kvalitu síťového připojení účastníka pomocí mediaScoreUpdate událost.
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`);
}
},
);Sledujte kvalitu síťového připojení účastníka pomocí mediaScoreUpdate událost.
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]);Tato událost není na této platformě k dispozici.
Sledujte kvalitu síťového připojení účastníka pomocí mediaScoreUpdate událost.
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]);Naslouchejte událostem účastníka
Každý objekt účastníka je emitorem událostí:
meeting.participants.joined
.get(participantId)
.on("audioUpdate", ({ audioEnabled, audioTrack }) => {
console.log(
"The participant with id",
participantId,
"has toggled their mic to",
audioEnabled,
);
});Alternativně můžete naslouchat na mapě účastníků pro všechny účastníky:
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]);
}Nebo použijte selektor pro konkrétní vlastnosti:
const audioEnabled = useRealtimeKitSelector(
(m) => m.participants.joined.get(participantId)?.audioEnabled,
);Implementujte RtkParticipantEventListener rozhraní pro příjem aktualizací událostí účastníků:
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
}
})Implementujte RtkParticipantEventListener protokol pro příjem aktualizací událostí účastníků:
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]);
}Nebo použijte selektor pro konkrétní vlastnosti:
const audioEnabled = useRealtimeKitSelector(
(m) => m.participants.joined.get(participantId)?.audioEnabled,
);