From 0f972dba53932c30ecc898cacffb8e54b74c6bdc Mon Sep 17 00:00:00 2001 From: talksik Date: Sat, 14 May 2022 12:28:53 -0500 Subject: [PATCH] trying to get stream stuff working --- .../desktop/src/providers/StreamProvider.tsx | 39 +++++++++++++++- .../protected/terminal/panels/MainPanel.tsx | 45 +++++++++++++++++-- 2 files changed, 79 insertions(+), 5 deletions(-) diff --git a/packages/desktop/src/providers/StreamProvider.tsx b/packages/desktop/src/providers/StreamProvider.tsx index 056a7eb..7c151c5 100644 --- a/packages/desktop/src/providers/StreamProvider.tsx +++ b/packages/desktop/src/providers/StreamProvider.tsx @@ -19,7 +19,7 @@ * listen for any calls to me, as well as any answers back to me */ -import React, { useEffect } from 'react'; +import React, { useEffect, useContext, useState, useRef } from 'react'; import Peer from 'simple-peer'; import useRealTimeRooms from './RealTimeRoomProvider'; import useAuth from './AuthProvider'; @@ -34,6 +34,7 @@ import { } from '@nirvana/core/sockets/channels'; import { ServerResponseChannels } from '../../../core/sockets/channels'; import toast from 'react-hot-toast'; +import { usePrevious } from 'react-use'; type PeerMap = { [userId: string]: Peer; @@ -54,6 +55,9 @@ export function StreamProvider({ children }: { children: React.ReactChild }) { const [peerMap, updatePeerMap] = useImmer({}); + const [userLocalStream, setUserLocalStream] = useState(); + const localStreamRef = useRef(null); + useEffect(() => { $ws.on( ServerResponseChannels.RTC_RECEIVING_ANSWER_RESPONSE, @@ -79,6 +83,7 @@ export function StreamProvider({ children }: { children: React.ReactChild }) { const peerForMeAndNewbie = new Peer({ initiator: false, + stream: userLocalStream ?? null, trickle: false, // prevents the multiple tries on different ice servers and signal from getting called a bunch of times }); @@ -131,6 +136,7 @@ export function StreamProvider({ children }: { children: React.ReactChild }) { const localPeerConnection = new Peer({ initiator: true, + stream: userLocalStream ?? null, trickle: false, // prevents the multiple tries on different ice servers and signal from getting called a bunch of times }); @@ -146,9 +152,38 @@ export function StreamProvider({ children }: { children: React.ReactChild }) { }); }, [user, roomsMap, $ws, updatePeerMap]); //TODO: make this not run on EVERY update to roomsMap? only tuned in lists? so the separate map for that? + const prevStream = usePrevious(userLocalStream); + + useEffect(() => { + navigator.mediaDevices + .getUserMedia({ video: true, audio: true }) + .then((localMediaStream: MediaStream) => { + setUserLocalStream(localMediaStream); + + if (localStreamRef.current) localStreamRef.current.srcObject = localMediaStream; + }); + }, [localStreamRef]); + + useEffect(() => { + if (prevStream) { + Object.values(peerMap).forEach((currentPeer) => { + currentPeer.removeStream(prevStream); + currentPeer.addStream(userLocalStream); + }); + } + }, [userLocalStream, peerMap, prevStream]); + console.log(peerMap); return ( - {children} + + ); } + +export default function useStreams() { + return useContext(StreamProviderContext); +} diff --git a/packages/desktop/src/tree/protected/terminal/panels/MainPanel.tsx b/packages/desktop/src/tree/protected/terminal/panels/MainPanel.tsx index 332915c..5000d37 100644 --- a/packages/desktop/src/tree/protected/terminal/panels/MainPanel.tsx +++ b/packages/desktop/src/tree/protected/terminal/panels/MainPanel.tsx @@ -1,4 +1,4 @@ -import React, { useMemo } from 'react'; +import React, { useMemo, useEffect, useRef } from 'react'; import useAuth from '../../../../providers/AuthProvider'; import useRealTimeRooms from '../../../../providers/RealTimeRoomProvider'; @@ -6,6 +6,8 @@ import { LineMemberState } from '@nirvana/core/models/line.model'; import LineIcon from '../../../../components/lineIcon'; import { FiActivity, FiHeadphones, FiSettings, FiSun } from 'react-icons/fi'; import { Avatar, Tooltip } from 'antd'; +import useStreams from '../../../../providers/StreamProvider'; +import Peer from 'simple-peer'; export default function MainPanel() { const { user } = useAuth(); @@ -39,13 +41,13 @@ function LineDetails() { const selectedLine = useMemo(() => roomsMap[selectedLineId], [selectedLineId, roomsMap]); - console.log('selected line', selectedLine); - const isUserToggleTuned = useMemo( () => selectedLine?.currentUserMember?.state === LineMemberState.TUNED, [selectedLine], ); + const { peerMap } = useStreams(); + // seeing if I am in the list of broadcasters // the source of truth from the socket connections telling me if my clicking actually made a round trip const isUserBroadcasting = useMemo( @@ -276,6 +278,9 @@ function LineDetails() { ))} + + {/* change to show only the broadcasters */} +