From dd17436eb056382772cb8b4c0a5fb540bc36467a Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 25 Jul 2024 19:59:02 +0100 Subject: [PATCH] Fix Jitsi by updating device mute updates over postMessage API Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/vector/jitsi/index.ts | 52 +++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/src/vector/jitsi/index.ts b/src/vector/jitsi/index.ts index b30ee666a8..81747df515 100644 --- a/src/vector/jitsi/index.ts +++ b/src/vector/jitsi/index.ts @@ -34,7 +34,6 @@ import type { JitsiMeetExternalAPIConstructor, ExternalAPIEventCallbacks, JitsiMeetExternalAPI as _JitsiMeetExternalAPI, - AudioMuteStatusChangedEvent, LogEvent, VideoMuteStatusChangedEvent, ExternalAPIOptions as _ExternalAPIOptions, @@ -159,7 +158,7 @@ const setupCompleted = (async (): Promise => { const handleAction = ( action: WidgetApiAction, - handler: (request: IWidgetApiRequestData) => Promise, + handler: (request: IWidgetApiRequestData) => Promise, ): void => { widgetApi!.on(`action:${action}`, async (ev: CustomEvent) => { ev.preventDefault(); @@ -167,8 +166,7 @@ const setupCompleted = (async (): Promise => { let response: IWidgetApiResponseData; try { - await handler(ev.detail.data); - response = {}; + response = (await handler(ev.detail.data)) ?? {}; } catch (e) { if (e instanceof Error) { response = { error: { message: e.message } }; @@ -194,25 +192,24 @@ const setupCompleted = (async (): Promise => { meetApi?.executeCommand("hangup"); } }); - handleAction(ElementWidgetActions.MuteAudio, async () => { - if (meetApi && !(await meetApi.isAudioMuted())) { + handleAction(ElementWidgetActions.DeviceMute, async (params) => { + if (!meetApi) return; + + if (Object.keys(params).length === 0) { + // Handle query + return { + audio_enabled: !(await meetApi.isAudioMuted()), + video_enabled: !(await meetApi.isVideoMuted()), + }; + } + + if (params.audio_enabled !== !(await meetApi.isAudioMuted())) { meetApi.executeCommand("toggleAudio"); } - }); - handleAction(ElementWidgetActions.UnmuteAudio, async () => { - if (meetApi && (await meetApi.isAudioMuted())) { - meetApi.executeCommand("toggleAudio"); - } - }); - handleAction(ElementWidgetActions.MuteVideo, async () => { - if (meetApi && !(await meetApi.isVideoMuted())) { - meetApi.executeCommand("toggleVideo"); - } - }); - handleAction(ElementWidgetActions.UnmuteVideo, async () => { - if (meetApi && (await meetApi.isVideoMuted())) { + if (params.video_enabled !== !(await meetApi.isVideoMuted())) { meetApi.executeCommand("toggleVideo"); } + return params; }); handleAction(ElementWidgetActions.TileLayout, async () => { meetApi?.executeCommand("setTileView", true); @@ -473,7 +470,7 @@ async function joinConference(audioInput?: string | null, videoInput?: string | meetApi.on("videoConferenceLeft", onVideoConferenceLeft); meetApi.on("readyToClose", closeConference as ExternalAPIEventCallbacks["readyToClose"]); meetApi.on("errorOccurred", onErrorOccurred); - meetApi.on("audioMuteStatusChanged", onAudioMuteStatusChanged); + meetApi.on("audioMuteStatusChanged", onMuteStatusChanged); meetApi.on("videoMuteStatusChanged", onVideoMuteStatusChanged); (["videoConferenceJoined", "participantJoined", "participantLeft"] as const).forEach((event) => { @@ -523,9 +520,12 @@ const onErrorOccurred = ({ error }: Parameters { - const action = muted ? ElementWidgetActions.MuteAudio : ElementWidgetActions.UnmuteAudio; - void widgetApi?.transport.send(action, {}); +const onMuteStatusChanged = async (): Promise => { + if (!meetApi) return; + void widgetApi?.transport.send(ElementWidgetActions.DeviceMute, { + audio_enabled: !(await meetApi.isAudioMuted()), + video_enabled: !(await meetApi.isVideoMuted()), + }); }; const onVideoMuteStatusChanged = ({ muted }: VideoMuteStatusChangedEvent): void => { @@ -534,11 +534,9 @@ const onVideoMuteStatusChanged = ({ muted }: VideoMuteStatusChangedEvent): void // hanging up, which we need to ignore by padding the timeout here, // otherwise the React SDK will mistakenly think the user turned off // their video by hand - setTimeout(() => { - if (meetApi) void widgetApi?.transport.send(ElementWidgetActions.MuteVideo, {}); - }, 200); + setTimeout(() => onMuteStatusChanged, 200); } else { - void widgetApi?.transport.send(ElementWidgetActions.UnmuteVideo, {}); + void onMuteStatusChanged(); } };