janky
Version:
Janus Interface
69 lines (55 loc) • 2.49 kB
text/typescript
import { useEffect, useState } from "react"
import eventEmitter from "./eventEmitter";
import { PUBLISHING_EVENTS } from "../events";
interface RemoteStreamType {
rid: number;
pubID: string;
stream: MediaStream
};
type UseRemoteStreamsType = () => { remoteStreams: RemoteStreamType[] };
const useRemoteStreams: UseRemoteStreamsType = () => {
const [remoteStreams, setRemoteStreams] = useState<RemoteStreamType[]>([]);
useEffect(() => {
const handleNewTracks = (track: MediaStreamTrack, on: boolean, pubID: string, rid: number) => {
setRemoteStreams((prevStreams) => {
const existingStream = prevStreams.find((stream) => stream.pubID === pubID);
if (existingStream) {
// Add/remove the track to the existing stream
on ? existingStream.stream.addTrack(track) : existingStream.stream.removeTrack(track);
// Check if the stream has any remaining tracks
if (existingStream.stream.getTracks().length === 0) {
// Remove the whole remoteStream entry
return prevStreams.filter((stream) => stream.pubID !== pubID);
}
return [...prevStreams]; // Update the state with the same array reference
}
if(!on)
return prevStreams;
// Create a new media stream and add the track
const newStream = new MediaStream();
newStream.addTrack(track);
const newStreams = [
...prevStreams,
{
stream: newStream,
rid,
pubID
}
];
return newStreams;
});
};
if(!eventEmitter.listeners(PUBLISHING_EVENTS.RECIVED_TRACK).length) {
eventEmitter.on(PUBLISHING_EVENTS.RECIVED_TRACK, handleNewTracks);
}
const removeStream = (rid: number) => {
const newStreams = remoteStreams.filter(rs => rs.rid !== rid);
setRemoteStreams(newStreams);
}
if(!eventEmitter.listeners(PUBLISHING_EVENTS.UNPUBLISH).length) {
eventEmitter.on(PUBLISHING_EVENTS.UNPUBLISH, removeStream);
}
}, []);
return { remoteStreams };
};
export default useRemoteStreams;