You've already forked matrix-react-sdk
mirror of
https://github.com/matrix-org/matrix-react-sdk.git
synced 2025-08-09 08:42:50 +03:00
Proactively fix stuck devices in video rooms (#8587)
* Proactively fix stuck devices in video rooms * Fix tests * Explain why we're disabling the lint rule * Apply code review suggestions * Back VideoChannelStore's flags by SettingsStore instead of localStorage
This commit is contained in:
@@ -17,7 +17,8 @@ limitations under the License.
|
||||
import React from "react";
|
||||
import { mount } from "enzyme";
|
||||
import { act } from "react-dom/test-utils";
|
||||
import { MatrixClient } from "matrix-js-sdk/src/client";
|
||||
import { mocked } from "jest-mock";
|
||||
import { MatrixClient, IMyDevice } from "matrix-js-sdk/src/client";
|
||||
import { Room } from "matrix-js-sdk/src/models/room";
|
||||
import { MatrixWidgetType } from "matrix-widget-api";
|
||||
|
||||
@@ -27,9 +28,11 @@ import {
|
||||
StubVideoChannelStore,
|
||||
mkRoom,
|
||||
wrapInMatrixClientContext,
|
||||
mockStateEventImplementation,
|
||||
mkVideoChannelMember,
|
||||
} from "../../test-utils";
|
||||
import { MatrixClientPeg } from "../../../src/MatrixClientPeg";
|
||||
import { VIDEO_CHANNEL } from "../../../src/utils/VideoChannelUtils";
|
||||
import { VIDEO_CHANNEL, VIDEO_CHANNEL_MEMBER } from "../../../src/utils/VideoChannelUtils";
|
||||
import WidgetStore from "../../../src/stores/WidgetStore";
|
||||
import _VideoRoomView from "../../../src/components/structures/VideoRoomView";
|
||||
import VideoLobby from "../../../src/components/views/voip/VideoLobby";
|
||||
@@ -64,6 +67,37 @@ describe("VideoRoomView", () => {
|
||||
room = mkRoom(cli, "!1:example.org");
|
||||
});
|
||||
|
||||
it("removes stuck devices on mount", async () => {
|
||||
// Simulate an unclean disconnect
|
||||
store.roomId = "!1:example.org";
|
||||
|
||||
const devices: IMyDevice[] = [
|
||||
{
|
||||
device_id: cli.getDeviceId(),
|
||||
last_seen_ts: new Date().valueOf(),
|
||||
},
|
||||
{
|
||||
device_id: "went offline 2 hours ago",
|
||||
last_seen_ts: new Date().valueOf() - 1000 * 60 * 60 * 2,
|
||||
},
|
||||
];
|
||||
mocked(cli).getDevices.mockResolvedValue({ devices });
|
||||
|
||||
// Make both devices be stuck
|
||||
mocked(room.currentState).getStateEvents.mockImplementation(mockStateEventImplementation([
|
||||
mkVideoChannelMember(cli.getUserId(), devices.map(d => d.device_id)),
|
||||
]));
|
||||
|
||||
mount(<VideoRoomView room={room} resizing={false} />);
|
||||
// Wait for state to settle
|
||||
await act(() => Promise.resolve());
|
||||
|
||||
// All devices should have been removed
|
||||
expect(cli.sendStateEvent).toHaveBeenLastCalledWith(
|
||||
"!1:example.org", VIDEO_CHANNEL_MEMBER, { devices: [] }, cli.getUserId(),
|
||||
);
|
||||
});
|
||||
|
||||
it("shows lobby and keeps widget loaded when disconnected", async () => {
|
||||
const view = mount(<VideoRoomView room={room} resizing={false} />);
|
||||
// Wait for state to settle
|
||||
|
Reference in New Issue
Block a user