diff --git a/src/SdkConfig.ts b/src/SdkConfig.ts index 6698f3ffb2..1c26fd4e8b 100644 --- a/src/SdkConfig.ts +++ b/src/SdkConfig.ts @@ -47,7 +47,7 @@ export const DEFAULTS: IConfigOptions = { url: "https://element.io/get-started", }, voice_broadcast: { - chunk_length: 60, // one minute + chunk_length: 120, // two minutes }, }; diff --git a/src/voice-broadcast/audio/VoiceBroadcastRecorder.ts b/src/voice-broadcast/audio/VoiceBroadcastRecorder.ts index f84da152ba..ff1d22a41c 100644 --- a/src/voice-broadcast/audio/VoiceBroadcastRecorder.ts +++ b/src/voice-broadcast/audio/VoiceBroadcastRecorder.ts @@ -17,8 +17,8 @@ limitations under the License. import { Optional } from "matrix-events-sdk"; import { TypedEventEmitter } from "matrix-js-sdk/src/models/typed-event-emitter"; +import { getChunkLength } from ".."; import { VoiceRecording } from "../../audio/VoiceRecording"; -import SdkConfig, { DEFAULTS } from "../../SdkConfig"; import { concat } from "../../utils/arrays"; import { IDestroyable } from "../../utils/IDestroyable"; import { Singleflight } from "../../utils/Singleflight"; @@ -139,6 +139,5 @@ export class VoiceBroadcastRecorder } export const createVoiceBroadcastRecorder = (): VoiceBroadcastRecorder => { - const targetChunkLength = SdkConfig.get("voice_broadcast")?.chunk_length || DEFAULTS.voice_broadcast!.chunk_length; - return new VoiceBroadcastRecorder(new VoiceRecording(), targetChunkLength); + return new VoiceBroadcastRecorder(new VoiceRecording(), getChunkLength()); }; diff --git a/src/voice-broadcast/index.ts b/src/voice-broadcast/index.ts index 10329e224d..164a59c5fb 100644 --- a/src/voice-broadcast/index.ts +++ b/src/voice-broadcast/index.ts @@ -34,6 +34,7 @@ export * from "./components/molecules/VoiceBroadcastRecordingPip"; export * from "./hooks/useVoiceBroadcastRecording"; export * from "./stores/VoiceBroadcastPlaybacksStore"; export * from "./stores/VoiceBroadcastRecordingsStore"; +export * from "./utils/getChunkLength"; export * from "./utils/hasRoomLiveVoiceBroadcast"; export * from "./utils/shouldDisplayAsVoiceBroadcastRecordingTile"; export * from "./utils/shouldDisplayAsVoiceBroadcastTile"; diff --git a/src/voice-broadcast/utils/getChunkLength.ts b/src/voice-broadcast/utils/getChunkLength.ts new file mode 100644 index 0000000000..9eebfe4979 --- /dev/null +++ b/src/voice-broadcast/utils/getChunkLength.ts @@ -0,0 +1,29 @@ +/* +Copyright 2022 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import SdkConfig, { DEFAULTS } from "../../SdkConfig"; + +/** + * Returns the target chunk length for voice broadcasts: + * - Tries to get the value from the voice_broadcast.chunk_length config + * - If that fails from DEFAULTS + * - If that fails fall back to 120 (two minutes) + */ +export const getChunkLength = (): number => { + return SdkConfig.get("voice_broadcast")?.chunk_length + || DEFAULTS.voice_broadcast?.chunk_length + || 120; +}; diff --git a/src/voice-broadcast/utils/startNewVoiceBroadcastRecording.tsx b/src/voice-broadcast/utils/startNewVoiceBroadcastRecording.tsx index 1084d6d2f3..ec57ea5312 100644 --- a/src/voice-broadcast/utils/startNewVoiceBroadcastRecording.tsx +++ b/src/voice-broadcast/utils/startNewVoiceBroadcastRecording.tsx @@ -28,6 +28,7 @@ import { VoiceBroadcastRecordingsStore, VoiceBroadcastRecording, hasRoomLiveVoiceBroadcast, + getChunkLength, } from ".."; const startBroadcast = async ( @@ -67,7 +68,7 @@ const startBroadcast = async ( { device_id: client.getDeviceId(), state: VoiceBroadcastInfoState.Started, - chunk_length: 300, + chunk_length: getChunkLength(), } as VoiceBroadcastInfoEventContent, client.getUserId(), ); diff --git a/test/voice-broadcast/models/VoiceBroadcastRecording-test.ts b/test/voice-broadcast/models/VoiceBroadcastRecording-test.ts index 3e1965097b..b3076d72c0 100644 --- a/test/voice-broadcast/models/VoiceBroadcastRecording-test.ts +++ b/test/voice-broadcast/models/VoiceBroadcastRecording-test.ts @@ -442,7 +442,7 @@ describe("VoiceBroadcastRecording", () => { infoEvent = mkVoiceBroadcastInfoEvent({ device_id: client.getDeviceId(), state: VoiceBroadcastInfoState.Started, - chunk_length: 300, + chunk_length: 120, }); const relationsContainer = { diff --git a/test/voice-broadcast/utils/getChunkLength-test.ts b/test/voice-broadcast/utils/getChunkLength-test.ts new file mode 100644 index 0000000000..c2d761c18b --- /dev/null +++ b/test/voice-broadcast/utils/getChunkLength-test.ts @@ -0,0 +1,60 @@ +/* +Copyright 2022 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { mocked } from "jest-mock"; + +import SdkConfig, { DEFAULTS } from "../../../src/SdkConfig"; +import { getChunkLength } from "../../../src/voice-broadcast/utils/getChunkLength"; + +jest.mock("../../../src/SdkConfig"); + +describe("getChunkLength", () => { + afterEach(() => { + jest.resetAllMocks(); + }); + + describe("when there is a value provided by Sdk config", () => { + beforeEach(() => { + mocked(SdkConfig.get).mockReturnValue({ chunk_length: 42 }); + }); + + it("should return this value", () => { + expect(getChunkLength()).toBe(42); + }); + }); + + describe("when Sdk config does not provide a value", () => { + beforeEach(() => { + DEFAULTS.voice_broadcast = { + chunk_length: 23, + }; + }); + + it("should return this value", () => { + expect(getChunkLength()).toBe(23); + }); + }); + + describe("if there are no defaults", () => { + beforeEach(() => { + DEFAULTS.voice_broadcast = undefined; + }); + + it("should return the fallback value", () => { + expect(getChunkLength()).toBe(120); + }); + }); +}); diff --git a/test/voice-broadcast/utils/startNewVoiceBroadcastRecording-test.ts b/test/voice-broadcast/utils/startNewVoiceBroadcastRecording-test.ts index 0fc0d14cb2..a0fac9ebd6 100644 --- a/test/voice-broadcast/utils/startNewVoiceBroadcastRecording-test.ts +++ b/test/voice-broadcast/utils/startNewVoiceBroadcastRecording-test.ts @@ -122,7 +122,7 @@ describe("startNewVoiceBroadcastRecording", () => { roomId, VoiceBroadcastInfoEventType, { - chunk_length: 300, + chunk_length: 120, device_id: client.getDeviceId(), state: VoiceBroadcastInfoState.Started, },