Merge pull request #2687 from robintown/media-devices-config

Add config options for starting with audio and video enabled
This commit is contained in:
Robin 2024-10-28 09:08:04 -04:00 committed by GitHub
commit 7edc8af9a0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 34 additions and 5 deletions

View File

@ -5,6 +5,8 @@ SPDX-License-Identifier: AGPL-3.0-only
Please see LICENSE in the repository root for full details. Please see LICENSE in the repository root for full details.
*/ */
import { merge } from "lodash";
import { getUrlParams } from "../UrlParams"; import { getUrlParams } from "../UrlParams";
import { import {
DEFAULT_CONFIG, DEFAULT_CONFIG,
@ -15,7 +17,7 @@ import {
export class Config { export class Config {
private static internalInstance: Config | undefined; private static internalInstance: Config | undefined;
public static get(): ConfigOptions { public static get(): ResolvedConfigOptions {
if (!this.internalInstance?.config) if (!this.internalInstance?.config)
throw new Error("Config instance read before config got initialized"); throw new Error("Config instance read before config got initialized");
return this.internalInstance.config; return this.internalInstance.config;
@ -29,7 +31,7 @@ export class Config {
Config.internalInstance.initPromise = downloadConfig( Config.internalInstance.initPromise = downloadConfig(
"../config.json", "../config.json",
).then((config) => { ).then((config) => {
internalInstance.config = { ...DEFAULT_CONFIG, ...config }; internalInstance.config = merge({}, DEFAULT_CONFIG, config);
}); });
} }
return Config.internalInstance.initPromise; return Config.internalInstance.initPromise;

View File

@ -77,6 +77,17 @@ export interface ConfigOptions {
* A link to the end-user license agreement (EULA) * A link to the end-user license agreement (EULA)
*/ */
eula: string; eula: string;
media_devices?: {
/**
* Defines whether participants should start with audio enabled by default.
*/
enable_audio?: boolean;
/**
* Defines whether participants should start with video enabled by default.
*/
enable_video?: boolean;
};
} }
// Overrides members from ConfigOptions that are always provided by the // Overrides members from ConfigOptions that are always provided by the
@ -88,6 +99,10 @@ export interface ResolvedConfigOptions extends ConfigOptions {
server_name: string; server_name: string;
}; };
}; };
media_devices: {
enable_audio: boolean;
enable_video: boolean;
};
} }
export const DEFAULT_CONFIG: ResolvedConfigOptions = { export const DEFAULT_CONFIG: ResolvedConfigOptions = {
@ -98,4 +113,8 @@ export const DEFAULT_CONFIG: ResolvedConfigOptions = {
}, },
}, },
eula: "https://static.element.io/legal/online-EULA.pdf", eula: "https://static.element.io/legal/online-EULA.pdf",
media_devices: {
enable_audio: true,
enable_video: true,
},
}; };

View File

@ -18,6 +18,7 @@ import { logger } from "matrix-js-sdk/src/logger";
import { MediaDevice, useMediaDevices } from "../livekit/MediaDevicesContext"; import { MediaDevice, useMediaDevices } from "../livekit/MediaDevicesContext";
import { useReactiveState } from "../useReactiveState"; import { useReactiveState } from "../useReactiveState";
import { ElementWidgetActions, widget } from "../widget"; import { ElementWidgetActions, widget } from "../widget";
import { Config } from "../config/Config";
/** /**
* If there already are this many participants in the call, we automatically mute * If there already are this many participants in the call, we automatically mute
@ -71,8 +72,14 @@ function useMuteState(
export function useMuteStates(): MuteStates { export function useMuteStates(): MuteStates {
const devices = useMediaDevices(); const devices = useMediaDevices();
const audio = useMuteState(devices.audioInput, () => true); const audio = useMuteState(
const video = useMuteState(devices.videoInput, () => true); devices.audioInput,
() => Config.get().media_devices.enable_audio,
);
const video = useMuteState(
devices.videoInput,
() => Config.get().media_devices.enable_video,
);
useEffect(() => { useEffect(() => {
widget?.api.transport widget?.api.transport

View File

@ -10,6 +10,7 @@ import { expect, test, vi } from "vitest";
import { enterRTCSession } from "../src/rtcSessionHelpers"; import { enterRTCSession } from "../src/rtcSessionHelpers";
import { Config } from "../src/config/Config"; import { Config } from "../src/config/Config";
import { DEFAULT_CONFIG } from "./config/ConfigOptions";
test("It joins the correct Session", async () => { test("It joins the correct Session", async () => {
const focusFromOlderMembership = { const focusFromOlderMembership = {
@ -34,8 +35,8 @@ test("It joins the correct Session", async () => {
}; };
vi.spyOn(Config, "get").mockReturnValue({ vi.spyOn(Config, "get").mockReturnValue({
...DEFAULT_CONFIG,
livekit: { livekit_service_url: "http://my-default-service-url.com" }, livekit: { livekit_service_url: "http://my-default-service-url.com" },
eula: "",
}); });
const mockedSession = vi.mocked({ const mockedSession = vi.mocked({
room: { room: {