Skip to content

Commit

Permalink
Fix Jitsi by updating device mute updates over postMessage API
Browse files Browse the repository at this point in the history
Signed-off-by: Michael Telatynski <[email protected]>
  • Loading branch information
t3chguy committed Jul 25, 2024
1 parent 334d268 commit dd17436
Showing 1 changed file with 24 additions and 26 deletions.
50 changes: 24 additions & 26 deletions src/vector/jitsi/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ import type {
JitsiMeetExternalAPIConstructor,
ExternalAPIEventCallbacks,
JitsiMeetExternalAPI as _JitsiMeetExternalAPI,
AudioMuteStatusChangedEvent,
LogEvent,
VideoMuteStatusChangedEvent,
ExternalAPIOptions as _ExternalAPIOptions,
Expand Down Expand Up @@ -159,16 +158,15 @@ const setupCompleted = (async (): Promise<string | void> => {

const handleAction = (
action: WidgetApiAction,
handler: (request: IWidgetApiRequestData) => Promise<void>,
handler: (request: IWidgetApiRequestData) => Promise<IWidgetApiResponseData | void>,
): void => {
widgetApi!.on(`action:${action}`, async (ev: CustomEvent<IWidgetApiRequest>) => {
ev.preventDefault();
await setupCompleted;

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 } };
Expand All @@ -194,25 +192,24 @@ const setupCompleted = (async (): Promise<string | void> => {
meetApi?.executeCommand("hangup");
}
});
handleAction(ElementWidgetActions.MuteAudio, async () => {
if (meetApi && !(await meetApi.isAudioMuted())) {
meetApi.executeCommand("toggleAudio");
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()),
};
}
});
handleAction(ElementWidgetActions.UnmuteAudio, async () => {
if (meetApi && (await meetApi.isAudioMuted())) {

if (params.audio_enabled !== !(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);
Expand Down Expand Up @@ -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) => {
Expand Down Expand Up @@ -523,9 +520,12 @@ const onErrorOccurred = ({ error }: Parameters<ExternalAPIEventCallbacks["errorO
}
};

const onAudioMuteStatusChanged = ({ muted }: AudioMuteStatusChangedEvent): void => {
const action = muted ? ElementWidgetActions.MuteAudio : ElementWidgetActions.UnmuteAudio;
void widgetApi?.transport.send(action, {});
const onMuteStatusChanged = async (): Promise<void> => {
if (!meetApi) return;
void widgetApi?.transport.send(ElementWidgetActions.DeviceMute, {
audio_enabled: !(await meetApi.isAudioMuted()),
video_enabled: !(await meetApi.isVideoMuted()),
});
};

const onVideoMuteStatusChanged = ({ muted }: VideoMuteStatusChangedEvent): void => {
Expand All @@ -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();
}
};

Expand Down

0 comments on commit dd17436

Please sign in to comment.