UNPKG

@fishjam-cloud/react-client

Version:
91 lines (90 loc) 4.15 kB
import { useCallback, useContext } from "react"; import { FishjamClientContext } from "../contexts/fishjamClient"; import { FishjamClientStateContext } from "../contexts/fishjamState"; function trackContextToTrack(track) { return { metadata: track.metadata, trackId: track.trackId, stream: track.stream, simulcastConfig: track.simulcastConfig ?? null, track: track.track, }; } function trackContextToRemoteTrack(track, fishjamClient) { return { ...trackContextToTrack(track), encoding: track.encoding, encodingReason: track.encodingReason, setReceivedQuality: (encoding) => { fishjamClient.setTargetTrackEncoding(track.trackId, encoding); }, }; } function getLocalPeerWithTracks(peer) { const tracks = [...peer.tracks.values()].map(trackContextToTrack); return { id: peer.id, metadata: peer.metadata, tracks, cameraTrack: tracks.find(({ metadata }) => metadata?.type === "camera"), microphoneTrack: tracks.find(({ metadata }) => metadata?.type === "microphone"), screenShareVideoTrack: tracks.find(({ metadata }) => metadata?.type === "screenShareVideo"), screenShareAudioTrack: tracks.find(({ metadata }) => metadata?.type === "screenShareAudio"), customVideoTracks: tracks.filter(({ metadata }) => metadata?.type === "customVideo"), customAudioTracks: tracks.filter(({ metadata }) => metadata?.type === "customAudio"), }; } function getRemotePeerWithTracks(peer, fishjamClient) { const tracks = [...peer.tracks.values()].map((track) => trackContextToRemoteTrack(track, fishjamClient)); return { id: peer.id, metadata: peer.metadata, tracks, cameraTrack: tracks.find(({ metadata }) => metadata?.type === "camera"), microphoneTrack: tracks.find(({ metadata }) => metadata?.type === "microphone"), screenShareVideoTrack: tracks.find(({ metadata }) => metadata?.type === "screenShareVideo"), screenShareAudioTrack: tracks.find(({ metadata }) => metadata?.type === "screenShareAudio"), customVideoTracks: tracks.filter(({ metadata }) => metadata?.type === "customVideo"), customAudioTracks: tracks.filter(({ metadata }) => metadata?.type === "customAudio"), }; } /** * 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); const fishjamClient = useContext(FishjamClientContext); if (!clientState || !fishjamClient) throw Error("usePeers must be used within FishjamProvider"); const localPeer = clientState.localPeer ? getLocalPeerWithTracks(clientState.localPeer) : null; const remotePeers = Object.values(clientState.peers).map((peer) => getRemotePeerWithTracks(peer, fishjamClient.current)); const setReceivedTracksQuality = useCallback((trackIds, quality) => trackIds.forEach((trackId) => fishjamClient.current.setTargetTrackEncoding(trackId, quality)), [fishjamClient]); 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, /** * This function allows to set the quality of tracks received from remote peers. * @param trackIds The array of the track ids to set the quality for. * @param quality The quality to set for the track. */ setReceivedTracksQuality, }; }