@@ -1004,7 +1004,7 @@ describe('setInitialMuteStates', () => {
10041004 beforeEach ( ( ) => {
10051005 session = new MockSession ( ) as any ;
10061006 audioSender = { track : { kind : 'audio' , enabled : true } } ;
1007- videoSender = { track : { kind : 'video' , enabled : true , id : 'camera-track-1' } } ;
1007+ videoSender = { track : { kind : 'video' , enabled : true } } ;
10081008 } ) ;
10091009
10101010 it ( 'should mute video' , async ( ) => {
@@ -1217,7 +1217,7 @@ describe('setVideoMute', () => {
12171217
12181218 await handler . setVideoMute ( session , { conversationId : session . conversationId , mute : false } ) ;
12191219
1220- expect ( mockSdk . logger . debug ) . toHaveBeenCalledWith ( expect . stringContaining ( 'Cannot unmute, a camera video track already exists' ) , expect . any ( Object ) , undefined ) ;
1220+ expect ( mockSdk . logger . debug ) . toHaveBeenCalledWith ( expect . stringContaining ( 'Cannot unmute, a video track already exists' ) , expect . any ( Object ) , undefined ) ;
12211221 } ) ;
12221222
12231223 it ( 'mute: should mute video track when there is no screen track and remove track from outboundStream' , async ( ) => {
@@ -1304,7 +1304,7 @@ describe('setVideoMute', () => {
13041304 const stream = new MockStream ( true ) ;
13051305 const spy = jest . spyOn ( mockSdk . media , 'startMedia' ) . mockResolvedValue ( stream as any ) ;
13061306 jest . spyOn ( mockSessionManager , 'getAllActiveSessions' ) . mockReturnValue ( [ { id : session . id } as IExtendedMediaSession ] ) ;
1307- jest . spyOn ( handler , 'addReplaceTrackToSession ' ) . mockResolvedValue ( ) ;
1307+ jest . spyOn ( handler , 'addMediaToSession ' ) . mockResolvedValue ( ) ;
13081308
13091309 session . _outboundStream = {
13101310 addTrack : jest . fn ( ) ,
@@ -1325,7 +1325,7 @@ describe('setVideoMute', () => {
13251325 const stream = new MockStream ( true ) ;
13261326 const spy = jest . spyOn ( mockSdk . media , 'startMedia' ) . mockResolvedValue ( stream as any ) ;
13271327 jest . spyOn ( mockSessionManager , 'getAllActiveSessions' ) . mockReturnValue ( [ { id : session . id } as IExtendedMediaSession ] ) ;
1328- jest . spyOn ( handler , 'addReplaceTrackToSession ' ) . mockResolvedValue ( ) ;
1328+ jest . spyOn ( handler , 'addMediaToSession ' ) . mockResolvedValue ( ) ;
13291329
13301330 session . _outboundStream = {
13311331 addTrack : jest . fn ( ) ,
@@ -1345,7 +1345,7 @@ describe('setVideoMute', () => {
13451345 const unmuteDeviceId = 'device-id' ;
13461346 const stream = new MockStream ( true ) ;
13471347 const spy = jest . spyOn ( mockSdk . media , 'startMedia' ) . mockResolvedValue ( stream as any ) ;
1348- jest . spyOn ( handler , 'addReplaceTrackToSession ' ) . mockResolvedValue ( ) ;
1348+ jest . spyOn ( handler , 'addMediaToSession ' ) . mockResolvedValue ( ) ;
13491349
13501350 session . _outboundStream = {
13511351 addTrack : jest . fn ( ) ,
@@ -1359,51 +1359,6 @@ describe('setVideoMute', () => {
13591359 expect ( session . unmute ) . not . toHaveBeenCalled ( ) ;
13601360 expect ( stream . getVideoTracks ( ) [ 0 ] . stop ) . toHaveBeenCalled ( ) ;
13611361 } ) ;
1362-
1363- it ( 'mute: should find camera track when screen share exists' , async ( ) => {
1364- const screenTrack = new MockTrack ( 'video' ) ;
1365- screenTrack . id = 'screen-track-id' ;
1366- const cameraTrack = new MockTrack ( 'video' ) ;
1367- cameraTrack . id = 'camera-track-id' ;
1368-
1369- session . _screenShareStream = {
1370- getVideoTracks : jest . fn ( ) . mockReturnValue ( [ screenTrack ] )
1371- } as any ;
1372-
1373- session . _outboundStream = {
1374- removeTrack : jest . fn ( ) ,
1375- getVideoTracks : jest . fn ( ) . mockReturnValue ( [ cameraTrack ] )
1376- } as any ;
1377-
1378- jest . spyOn ( handler , 'getSendersByTrackType' ) . mockReturnValue ( [
1379- { track : cameraTrack }
1380- ] as any ) ;
1381-
1382- await handler . setVideoMute ( session , { conversationId : session . conversationId , mute : true } ) ;
1383-
1384- expect ( cameraTrack . stop ) . toHaveBeenCalled ( ) ;
1385- expect ( session . mute ) . toHaveBeenCalledWith ( userId , 'video' ) ;
1386- } ) ;
1387-
1388- it ( 'unmute: should check for existing camera track when screen share exists' , async ( ) => {
1389- const screenTrack = new MockTrack ( 'video' ) ;
1390- screenTrack . id = 'screen-track-id' ;
1391- const cameraTrack = new MockTrack ( 'video' ) ;
1392- cameraTrack . id = 'camera-track-id' ;
1393-
1394- session . _screenShareStream = {
1395- getVideoTracks : jest . fn ( ) . mockReturnValue ( [ screenTrack ] )
1396- } as any ;
1397-
1398- session . _outboundStream = {
1399- addTrack : jest . fn ( ) ,
1400- getVideoTracks : jest . fn ( ) . mockReturnValue ( [ cameraTrack ] )
1401- } as any ;
1402-
1403- await handler . setVideoMute ( session , { conversationId : session . conversationId , mute : false } ) ;
1404-
1405- expect ( mockSdk . logger . debug ) . toHaveBeenCalledWith ( expect . stringContaining ( 'Cannot unmute, a camera video track already exists' ) , expect . any ( Object ) , undefined ) ;
1406- } ) ;
14071362} ) ;
14081363
14091364describe ( 'setAudioMute' , ( ) => {
@@ -1526,29 +1481,33 @@ describe('getSendersByTrackType', () => {
15261481
15271482describe ( 'startScreenShare' , ( ) => {
15281483 let displayMediaSpy : jest . SpyInstance < Promise < MediaStream > > ;
1529- let addMediaToSessionSpy : jest . SpyInstance < Promise < void > > ;
1484+ let videoMuteSpy : jest . SpyInstance < Promise < void > > ;
1485+ let addReplaceTrackToSession : jest . SpyInstance < Promise < any > > ;
15301486 let session : VideoMediaSession ;
15311487
15321488 beforeEach ( ( ) => {
15331489 displayMediaSpy = jest . spyOn ( mockSdk . media , 'startDisplayMedia' ) . mockResolvedValue ( new MockStream ( { video : true } ) as any ) ;
1534- addMediaToSessionSpy = jest . spyOn ( handler , 'addMediaToSession' ) . mockResolvedValue ( ) ;
1490+ videoMuteSpy = jest . spyOn ( handler , 'setVideoMute' ) . mockResolvedValue ( ) ;
1491+ addReplaceTrackToSession = jest . spyOn ( handler , 'addReplaceTrackToSession' ) . mockResolvedValue ( ) ;
15351492 session = new MockSession ( ) as any ;
15361493 } ) ;
15371494
1538- it ( 'should start media and add screen share track without replacing existing video ' , async ( ) => {
1495+ it ( 'should start media and mute video if it is not already muted ' , async ( ) => {
15391496 await handler . startScreenShare ( session ) ;
15401497
15411498 expect ( displayMediaSpy ) . toHaveBeenCalled ( ) ;
1542- expect ( addMediaToSessionSpy ) . toHaveBeenCalled ( ) ;
1499+ expect ( videoMuteSpy ) . toHaveBeenCalled ( ) ;
1500+ expect ( addReplaceTrackToSession ) . toHaveBeenCalled ( ) ;
15431501 expect ( mockSessionManager . webrtcSessions . notifyScreenShareStart ) . toHaveBeenCalled ( ) ;
15441502 } ) ;
15451503
1546- it ( 'should add screen share track regardless of video mute state ' , async ( ) => {
1504+ it ( 'should not mute video if already muted ' , async ( ) => {
15471505 session . videoMuted = true ;
15481506 await handler . startScreenShare ( session ) ;
15491507
15501508 expect ( displayMediaSpy ) . toHaveBeenCalled ( ) ;
1551- expect ( addMediaToSessionSpy ) . toHaveBeenCalled ( ) ;
1509+ expect ( videoMuteSpy ) . not . toHaveBeenCalled ( ) ;
1510+ expect ( addReplaceTrackToSession ) . toHaveBeenCalled ( ) ;
15521511 expect ( mockSessionManager . webrtcSessions . notifyScreenShareStart ) . toHaveBeenCalled ( ) ;
15531512 } ) ;
15541513
@@ -1573,47 +1532,64 @@ describe('startScreenShare', () => {
15731532} ) ;
15741533
15751534describe ( 'stopScreenShare' , ( ) => {
1535+ let videoMuteSpy ;
15761536 let removeMediaSpy ;
15771537 let session ;
15781538
15791539 beforeEach ( ( ) => {
1540+ videoMuteSpy = jest . spyOn ( handler , 'setVideoMute' ) . mockResolvedValue ( ) ;
15801541 removeMediaSpy = jest . spyOn ( handler , 'removeMediaFromSession' ) . mockResolvedValue ( ) ;
15811542 session = new MockSession ( ) ;
15821543 } ) ;
15831544
1584- it ( 'should do nothing if there is no active screen share ' , async ( ) => {
1545+ it ( 'should do nothing if there is no screenshare stream ' , async ( ) => {
15851546 session . _screenShareStream = null ;
15861547
15871548 await handler . stopScreenShare ( session ) ;
15881549
1550+ expect ( videoMuteSpy ) . not . toHaveBeenCalled ( ) ;
15891551 expect ( removeMediaSpy ) . not . toHaveBeenCalled ( ) ;
15901552 expect ( mockSessionManager . webrtcSessions . notifyScreenShareStop ) . not . toHaveBeenCalled ( ) ;
15911553 } ) ;
15921554
1593- it ( 'should remove screen share track and stop it' , async ( ) => {
1555+ it ( 'should stop screen share tracks and unmute video if resurrectVideoOnScreenShareEnd' , async ( ) => {
1556+ session . _resurrectVideoOnScreenShareEnd = true ;
15941557 session . _screenShareStream = new MockStream ( { video : true } ) ;
1595- const screenTrack = session . _screenShareStream . _tracks [ 0 ] ;
1596-
1597- jest . spyOn ( session . pc , 'getSenders' ) . mockReturnValue ( [ { track : screenTrack } ] ) ;
15981558
15991559 await handler . stopScreenShare ( session ) ;
16001560
1601- expect ( removeMediaSpy ) . toHaveBeenCalled ( ) ;
1602- expect ( screenTrack . stop ) . toHaveBeenCalled ( ) ;
1561+ expect ( videoMuteSpy ) . toHaveBeenCalled ( ) ;
1562+ expect ( session . _screenShareStream . _tracks [ 0 ] . stop ) . toHaveBeenCalled ( ) ;
16031563 expect ( mockSessionManager . webrtcSessions . notifyScreenShareStop ) . toHaveBeenCalled ( ) ;
16041564 } ) ;
16051565
1606- it ( 'should stop screen share track even if no sender found' , async ( ) => {
1566+ it ( 'should not unmute video if not resurrect' , async ( ) => {
1567+ session . resurrectVideoOnScreenShareEnd = false ;
16071568 session . _screenShareStream = new MockStream ( { video : true } ) ;
1608- const screenTrack = session . _screenShareStream . _tracks [ 0 ] ;
16091569
1610- jest . spyOn ( session . pc , 'getSenders' ) . mockReturnValue ( [ ] ) ;
1570+ const replaceSpy = jest . fn ( ) ;
1571+ jest . spyOn ( session . pc , 'getSenders' ) . mockReturnValue ( [ { track : session . _screenShareStream . _tracks [ 0 ] , replaceTrack : replaceSpy } ] ) ;
16111572
16121573 await handler . stopScreenShare ( session ) ;
16131574
1614- expect ( removeMediaSpy ) . not . toHaveBeenCalled ( ) ;
1615- expect ( screenTrack . stop ) . toHaveBeenCalled ( ) ;
1575+ expect ( videoMuteSpy ) . not . toHaveBeenCalled ( ) ;
1576+ expect ( session . _screenShareStream . _tracks [ 0 ] . stop ) . toHaveBeenCalled ( ) ;
1577+ expect ( replaceSpy ) . toHaveBeenCalled ( ) ;
1578+ expect ( mockSessionManager . webrtcSessions . notifyScreenShareStop ) . toHaveBeenCalled ( ) ;
1579+ } ) ;
1580+
1581+ it ( 'should toggle off of screen share AND keep video unmuted if something goes wrong when fetching device media' , async ( ) => {
1582+ videoMuteSpy = jest . spyOn ( handler , 'setVideoMute' ) . mockRejectedValueOnce ( { message : 'Could not start video source' } ) . mockResolvedValueOnce ( ) ;
1583+ session . _resurrectVideoOnScreenShareEnd = true ;
1584+ session . _screenShareStream = new MockStream ( { video : true } ) ;
1585+
1586+ await handler . stopScreenShare ( session ) ;
1587+
1588+ expect ( videoMuteSpy ) . toHaveBeenNthCalledWith ( 1 , session , { conversationId : session . conversationId , mute : false } , true ) ;
1589+ expect ( videoMuteSpy ) . toHaveBeenNthCalledWith ( 2 , session , { conversationId : session . conversationId , mute : true } , false ) ;
1590+ expect ( session . _screenShareStream . _tracks [ 0 ] . stop ) . toHaveBeenCalled ( ) ;
16161591 expect ( mockSessionManager . webrtcSessions . notifyScreenShareStop ) . toHaveBeenCalled ( ) ;
1592+ jest . resetAllMocks ( ) ;
16171593 } ) ;
16181594} ) ;
16191595
0 commit comments