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