UNPKG

@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
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; }