diff --git a/packages/client/src/Call.ts b/packages/client/src/Call.ts index 506365dccb..4be83cb529 100644 --- a/packages/client/src/Call.ts +++ b/packages/client/src/Call.ts @@ -926,8 +926,12 @@ export class Call { // React uses a different device management for now if (getSdkInfo()?.type !== SdkType.REACT) { - this.initCamera(); - this.initMic(); + try { + await this.initCamera(); + await this.initMic(); + } catch (error) { + this.logger('warn', 'Camera and/or mic init failed during join call'); + } } // 3. once we have the "joinResponse", and possibly reconciled the local state @@ -1713,7 +1717,7 @@ export class Call { ); }; - private initCamera() { + private async initCamera() { if ( this.state.localParticipant?.videoStream || !this.permissionsContext.hasPermission('send-video') @@ -1747,11 +1751,11 @@ export class Call { this.camera.state.status === undefined && this.state.settings?.video.camera_default_on ) { - void this.camera.enable(); + await this.camera.enable(); } } - private initMic() { + private async initMic() { if ( this.state.localParticipant?.audioStream || !this.permissionsContext.hasPermission('send-audio') @@ -1776,7 +1780,7 @@ export class Call { this.microphone.state.status === undefined && this.state.settings?.audio.mic_default_on ) { - void this.microphone.enable(); + await this.microphone.enable(); } } } diff --git a/packages/client/src/devices/InputMediaDeviceManager.ts b/packages/client/src/devices/InputMediaDeviceManager.ts index 4f1e096545..9191df0173 100644 --- a/packages/client/src/devices/InputMediaDeviceManager.ts +++ b/packages/client/src/devices/InputMediaDeviceManager.ts @@ -38,10 +38,10 @@ export abstract class InputMediaDeviceManager< * @returns */ async disable() { + this.state.prevStatus = this.state.status; if (this.state.status === 'disabled') { return; } - this.state.prevStatus = this.state.status; await this.muteStream(this.state.disableMode === 'stop-tracks'); this.state.setStatus('disabled'); } diff --git a/packages/client/src/devices/__tests__/InputMediaDeviceManager.test.ts b/packages/client/src/devices/__tests__/InputMediaDeviceManager.test.ts index f84d6f7ee7..c71d60e8ec 100644 --- a/packages/client/src/devices/__tests__/InputMediaDeviceManager.test.ts +++ b/packages/client/src/devices/__tests__/InputMediaDeviceManager.test.ts @@ -195,6 +195,23 @@ describe('InputMediaDeviceManager.test', () => { expect(manager.enable).not.toHaveBeenCalled(); }); + it(`shouldn't resume if it were disabled while in pause`, async () => { + vi.spyOn(manager, 'enable'); + + await manager.enable(); + + expect(manager.enable).toHaveBeenCalledOnce(); + + // first call is pause + await manager.disable(); + // second call is for example mute from call admin + await manager.disable(); + + await manager.resume(); + + expect(manager.enable).toHaveBeenCalledOnce(); + }); + afterEach(() => { vi.clearAllMocks(); vi.resetModules();