diff --git a/apps/web/src/hooks/useWebRTCSFU.test.ts b/apps/web/src/hooks/useWebRTCSFU.test.ts index 2ec820d..d782df9 100644 --- a/apps/web/src/hooks/useWebRTCSFU.test.ts +++ b/apps/web/src/hooks/useWebRTCSFU.test.ts @@ -64,8 +64,12 @@ class MockRoom { let mockRoomInstance: MockRoom; +// Capture the Room constructor options so we can assert adaptiveStream is off. +const { roomCtorSpy } = vi.hoisted(() => ({ roomCtorSpy: vi.fn() })); + vi.mock('livekit-client', () => ({ - Room: vi.fn().mockImplementation(() => { + Room: vi.fn().mockImplementation((opts: unknown) => { + roomCtorSpy(opts); mockRoomInstance = new MockRoom(); return mockRoomInstance; }), @@ -167,4 +171,16 @@ describe('useWebRTCSFU', () => { expect(thirdStream?.getAudioTracks()).toHaveLength(0); expect(thirdStream?.getVideoTracks()).toHaveLength(1); }); + + it('creates the room with adaptiveStream disabled so screen-share video is not paused', async () => { + await act(async () => { + renderHook(() => useWebRTCSFU({ sessionId: 'session-1', participantId: 'viewer-1' })); + await Promise.resolve(); + await Promise.resolve(); + await Promise.resolve(); + await Promise.resolve(); + }); + + expect(roomCtorSpy).toHaveBeenCalledWith(expect.objectContaining({ adaptiveStream: false })); + }); }); diff --git a/apps/web/src/hooks/useWebRTCSFU.ts b/apps/web/src/hooks/useWebRTCSFU.ts index 39e86e0..eb276dd 100644 --- a/apps/web/src/hooks/useWebRTCSFU.ts +++ b/apps/web/src/hooks/useWebRTCSFU.ts @@ -357,9 +357,15 @@ export function useWebRTCSFU({ data: { token: string; url: string; roomName: string }; }; - // Create and connect room + // Create and connect room. + // adaptiveStream pauses video tracks that livekit doesn't see attached to + // a visible element via track.attach(). We render through a manually built + // MediaStream on a