@fishjam-cloud/react-client
Version:
React client library for Fishjam
65 lines (64 loc) • 2.6 kB
JavaScript
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,
};
}