really understanding simple peer just being a layer on top of webrtc from google

This commit is contained in:
talksik
2022-05-19 12:09:15 -05:00
parent 91093bff41
commit 29eeb244ff
2 changed files with 45 additions and 16 deletions
@@ -46,7 +46,12 @@ const iceServers = [
]; ];
type LinePeerMap = { type LinePeerMap = {
[lineId: string]: { userId: string; peer: Peer; mediaStream?: MediaStream }[]; [lineId: string]: {
userId: string;
peer: Peer;
myMediaStream?: MediaStream;
peerMediaStream?: MediaStream;
}[];
}; };
interface IStreamProvider { interface IStreamProvider {
peerMap: LinePeerMap; peerMap: LinePeerMap;
@@ -95,6 +100,10 @@ export function StreamProvider({ children }: { children: React.ReactChild }) {
); );
}); });
peerForMeAndNewbie.on('stream', (remoteStream: MediaStream) => {
handleGotPeerRemoteStream(res.lineId, res.userWhoCalled, remoteStream);
});
// !adding stream here causes race condition of the signal event just running over and over again // !adding stream here causes race condition of the signal event just running over and over again
// see if I have a stream for this channel or line // see if I have a stream for this channel or line
@@ -152,7 +161,7 @@ export function StreamProvider({ children }: { children: React.ReactChild }) {
console.log(`peer map: `, peerMap); console.log(`peer map: `, peerMap);
const handleAddPeer = useCallback( const handleAddPeer = useCallback(
(lineId: string, userId: string, peerObj: Peer, mediaStream?: MediaStream) => { (lineId: string, userId: string, peerObj: Peer, myMediaStream?: MediaStream) => {
updatePeerMap((draft) => { updatePeerMap((draft) => {
// for trickling, if we already have a peer for this line and user, then just replace // for trickling, if we already have a peer for this line and user, then just replace
const existingUserLinePeerRelation = draft[lineId]?.find( const existingUserLinePeerRelation = draft[lineId]?.find(
@@ -163,9 +172,24 @@ export function StreamProvider({ children }: { children: React.ReactChild }) {
} }
if (draft[lineId]) { if (draft[lineId]) {
draft[lineId].push({ userId, peer: peerObj, mediaStream }); draft[lineId].push({ userId, peer: peerObj, myMediaStream });
} else { } else {
draft[lineId] = [{ userId, peer: peerObj, mediaStream }]; draft[lineId] = [{ userId, peer: peerObj, myMediaStream }];
}
});
},
[updatePeerMap],
);
const handleGotPeerRemoteStream = useCallback(
(lineId: string, userId: string, remoteStream: MediaStream) => {
updatePeerMap((draft) => {
// for trickling, if we already have a peer for this line and user, then just replace
const existingUserLinePeerRelation = draft[lineId]?.find(
(currPeerRelation) => currPeerRelation.userId === userId,
);
if (existingUserLinePeerRelation) {
existingUserLinePeerRelation.peerMediaStream = remoteStream;
} }
}); });
}, },
@@ -185,6 +209,7 @@ export function StreamProvider({ children }: { children: React.ReactChild }) {
membersToCall={line.tunedInMemberIds.filter( membersToCall={line.tunedInMemberIds.filter(
(currMemberId) => currMemberId !== user._id.toString(), (currMemberId) => currMemberId !== user._id.toString(),
)} )}
handleGotPeerRemoteStream={handleGotPeerRemoteStream}
/> />
); );
})} })}
@@ -205,10 +230,17 @@ function LineConnector({
lineId, lineId,
membersToCall, membersToCall,
handleAddPeer, handleAddPeer,
handleGotPeerRemoteStream,
}: { }: {
lineId: string; lineId: string;
membersToCall: string[]; membersToCall: string[];
handleAddPeer: (lineId: string, userId: string, peerObj: Peer, mediaStream?: MediaStream) => void; handleAddPeer: (
lineId: string,
userId: string,
peerObj: Peer,
myMediaStream?: MediaStream,
) => void;
handleGotPeerRemoteStream: (lineId: string, userId: string, remoteStream: MediaStream) => void;
}) { }) {
const { $ws } = useSockets(); const { $ws } = useSockets();
@@ -266,6 +298,10 @@ function LineConnector({
// so that we can accept the answer later on // so that we can accept the answer later on
handleAddPeer(lineId, memberId, localPeerConnection, localMediaStream); handleAddPeer(lineId, memberId, localPeerConnection, localMediaStream);
}); });
localPeerConnection.on('stream', (remoteStream: MediaStream) => {
handleGotPeerRemoteStream(lineId, memberId, remoteStream);
});
}); });
}); });
}); });
@@ -148,7 +148,7 @@ export default function LineDetails() {
if (lineId !== selectedLine.lineDetails._id.toString()) return <></>; if (lineId !== selectedLine.lineDetails._id.toString()) return <></>;
return peerMap[lineId].map((linePeer) => ( return peerMap[lineId].map((linePeer) => (
<StreamPlayer key={`streamPlayer-${index}`} peer={linePeer.peer} /> <StreamPlayer key={`streamPlayer-${index}`} peerStream={linePeer.peerMediaStream} />
)); ));
})} })}
</div> </div>
@@ -194,19 +194,12 @@ export default function LineDetails() {
); );
} }
function StreamPlayer({ peer }: { peer: Peer }) { function StreamPlayer({ peerStream }: { peerStream: MediaStream }) {
const streamRef = useRef<HTMLVideoElement>(null); const streamRef = useRef<HTMLVideoElement>(null);
useEffect(() => { useEffect(() => {
peer.on('stream', (remotePeerStream: MediaStream) => { if (streamRef?.current) streamRef.current.srcObject = peerStream;
console.log('stream coming in from remote peer'); }, [peerStream]);
console.log(remotePeerStream);
if (streamRef?.current) streamRef.current.srcObject = remotePeerStream;
});
() => peer.destroy();
}, [peer]);
return ( return (
<> <>