From 6effc10d9e6da860a8b5c272ab8ed798163a68de Mon Sep 17 00:00:00 2001 From: Jerko Steiner Date: Tue, 10 Mar 2020 13:10:00 +0100 Subject: [PATCH] Do not remove tracks when sharing desktop and camera --- src/client/reducers/peers.ts | 54 ++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/src/client/reducers/peers.ts b/src/client/reducers/peers.ts index 6214e82..c922380 100644 --- a/src/client/reducers/peers.ts +++ b/src/client/reducers/peers.ts @@ -4,13 +4,16 @@ import Peer from 'simple-peer' import { PeerAction } from '../actions/PeerActions' import * as constants from '../constants' import { MediaStreamAction } from '../actions/MediaActions' -import { RemoveStreamAction } from '../actions/StreamActions' +import { RemoveStreamAction, StreamType } from '../actions/StreamActions' export type PeersState = Record const defaultState: PeersState = {} -let localStreams: Record = {} +let localStreams: Record = { + camera: undefined, + desktop: undefined, +} function handleRemoveStream( state: PeersState, @@ -29,6 +32,33 @@ function handleRemoveStream( return state } +function handleMediaStream( + state: PeersState, + action: MediaStreamAction, +): PeersState { + if (action.status !== 'resolved') { + return state + } + const streamType = action.payload.type + if ( + action.payload.userId === constants.ME && + streamType + ) { + forEach(state, peer => { + const localStream = localStreams[streamType] + localStream && localStream.getTracks().forEach(track => { + peer.removeTrack(track, localStream) + }) + const stream = action.payload.stream + stream.getTracks().forEach(track => { + peer.addTrack(track, stream) + }) + }) + localStreams[streamType] = action.payload.stream + } + return state +} + export default function peers( state = defaultState, action: PeerAction | MediaStreamAction | RemoveStreamAction, @@ -42,26 +72,16 @@ export default function peers( case constants.PEER_REMOVE: return omit(state, [action.payload.userId]) case constants.PEERS_DESTROY: - localStreams = {} + localStreams = { + camera: undefined, + desktop: undefined, + } forEach(state, peer => peer.destroy()) return defaultState case constants.STREAM_REMOVE: return handleRemoveStream(state, action) case constants.MEDIA_STREAM: - if (action.status === 'resolved') { - forEach(state, peer => { - const localStream = localStreams[action.payload.userId] - localStream && localStream.getTracks().forEach(track => { - peer.removeTrack(track, localStream) - }) - const stream = action.payload.stream - stream.getTracks().forEach(track => { - peer.addTrack(track, stream) - }) - }) - localStreams[action.payload.userId] = action.payload.stream - } - return state + return handleMediaStream(state, action) default: return state }