UNPKG

@fishjam-cloud/react-client

Version:
65 lines (64 loc) 2.6 kB
import { useContext } from "react"; import { FishjamClientStateContext } from "../contexts/fishjamState"; function trackContextToTrack(track) { return { metadata: track.metadata, trackId: track.trackId, stream: track.stream, simulcastConfig: track.simulcastConfig ?? null, encoding: track.encoding ?? null, track: track.track, }; } function getPeerWithDistinguishedTracks(peer) { const tracks = [...peer.tracks.values()].map(trackContextToTrack); const cameraTrack = tracks.find(({ metadata }) => metadata?.type === "camera"); const microphoneTrack = tracks.find(({ metadata }) => metadata?.type === "microphone"); const screenShareVideoTrack = tracks.find(({ metadata }) => metadata?.type === "screenShareVideo"); const screenShareAudioTrack = tracks.find(({ metadata }) => metadata?.type === "screenShareAudio"); const customVideoTracks = tracks.filter(({ metadata }) => metadata?.type === "customVideo"); const customAudioTracks = tracks.filter(({ metadata }) => metadata?.type === "customAudio"); return { id: peer.id, metadata: peer.metadata, tracks, cameraTrack, microphoneTrack, screenShareVideoTrack, screenShareAudioTrack, customVideoTracks, customAudioTracks, }; } /** * Hook allows to access id, tracks and metadata of the local and remote peers. * * @category Connection * @group Hooks * @typeParam PeerMetadata Type of metadata set by peer while connecting to a room. * @typeParam ServerMetadata Type of metadata set by the server while creating a peer. */ export function usePeers() { const clientState = useContext(FishjamClientStateContext); if (!clientState) throw Error("usePeers must be used within FishjamProvider"); const localPeer = clientState.localPeer ? getPeerWithDistinguishedTracks(clientState.localPeer) : null; const remotePeers = Object.values(clientState.peers).map((peer) => getPeerWithDistinguishedTracks(peer)); return { /** * The local peer with distinguished tracks (camera, microphone, screen share). * Will be null if the local peer is not found. */ localPeer, /** * Array of remote peers with distinguished tracks (camera, microphone, screen share). */ remotePeers, /** * @deprecated Use remotePeers instead * Legacy array containing remote peers. * This property will be removed in future versions. */ peers: remotePeers, }; }