@livekit/components-core
Version:
This package is a wrapper around the [livekit/client-sdk-js](https://github.com/livekit/client-sdk-js) package. It transforms the event based logic into simple to use observable state and component level APIs. This package is the core for all framework sp
64 lines (58 loc) • 1.85 kB
text/typescript
import type { Participant } from 'livekit-client';
import { LocalParticipant } from 'livekit-client';
import {
sortParticipantsByAudioLevel,
sortParticipantsByIsSpeaking,
sortParticipantsByJoinedAt,
sortParticipantsByLastSpokenAT,
} from './base-sort-functions';
/**
* Default sort for participants, it'll order participants by:
* 1. local participant
* 2. dominant speaker (speaker with the loudest audio level)
* 3. other speakers that are recently active
* 4. participants with video on
* 5. by joinedAt
*/
export function sortParticipants(participants: Participant[]): Participant[] {
const sortedParticipants = [...participants];
sortedParticipants.sort((a, b) => {
// loudest speaker first
if (a.isSpeaking && b.isSpeaking) {
return sortParticipantsByAudioLevel(a, b);
}
// speaker goes first
if (a.isSpeaking !== b.isSpeaking) {
return sortParticipantsByIsSpeaking(a, b);
}
// last active speaker first
if (a.lastSpokeAt !== b.lastSpokeAt) {
return sortParticipantsByLastSpokenAT(a, b);
}
// video on
const aVideo = a.videoTrackPublications.size > 0;
const bVideo = b.videoTrackPublications.size > 0;
if (aVideo !== bVideo) {
if (aVideo) {
return -1;
} else {
return 1;
}
}
// joinedAt
return sortParticipantsByJoinedAt(a, b);
});
const localParticipant = sortedParticipants.find((p) => p.isLocal) as LocalParticipant;
if (localParticipant) {
const localIdx = sortedParticipants.indexOf(localParticipant);
if (localIdx >= 0) {
sortedParticipants.splice(localIdx, 1);
if (sortedParticipants.length > 0) {
sortedParticipants.splice(0, 0, localParticipant);
} else {
sortedParticipants.push(localParticipant);
}
}
}
return sortedParticipants;
}