mirror of
https://github.com/vector-im/element-call.git
synced 2026-02-17 04:47:02 +00:00
Merge pull request #3720 from element-hq/toger5/sdk-improvements-only
[MatrixRTC SDK] improvements - compatible with custom rtc application
This commit is contained in:
@@ -217,15 +217,23 @@ export interface CallViewModel {
|
||||
"unknown" | "ringing" | "timeout" | "decline" | "success" | null
|
||||
>;
|
||||
/** Observable that emits when the user should leave the call (hangup pressed, widget action, error).
|
||||
* THIS DOES NOT LEAVE THE CALL YET. The only way to leave the call (send the hangup event) is by ending the scope.
|
||||
* THIS DOES NOT LEAVE THE CALL YET. The only way to leave the call (send the hangup event) is
|
||||
* - by ending the scope
|
||||
* - or calling requestDisconnect
|
||||
*
|
||||
* TODO: it seems more reasonable to add a leave() method (that calls requestDisconnect) that will then update leave$ and remove the hangup pattern
|
||||
*/
|
||||
leave$: Observable<"user" | AutoLeaveReason>;
|
||||
/** Call to initiate hangup. Use in conbination with reconnectino state track the async hangup process. */
|
||||
/** Call to initiate hangup. Use in conbination with reconnection state track the async hangup process. */
|
||||
hangup: () => void;
|
||||
|
||||
// joining
|
||||
join: () => void;
|
||||
|
||||
/**
|
||||
* calls requestDisconnect. The async leave state can than be observed via connected$
|
||||
*/
|
||||
leave: () => void;
|
||||
// screen sharing
|
||||
/**
|
||||
* Callback to toggle screen sharing. If null, screen sharing is not possible.
|
||||
@@ -1497,6 +1505,7 @@ export function createCallViewModel$(
|
||||
leave$: leave$,
|
||||
hangup: (): void => userHangup$.next(),
|
||||
join: localMembership.requestJoinAndPublish,
|
||||
leave: localMembership.requestDisconnect,
|
||||
toggleScreenSharing: toggleScreenSharing,
|
||||
sharingScreen$: sharingScreen$,
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
|
||||
Please see LICENSE in the repository root for full details.
|
||||
*/
|
||||
|
||||
import { beforeAll, describe, expect, vi, it } from "vitest";
|
||||
import { describe, expect, vi, it, beforeEach } from "vitest";
|
||||
import { createRoomWidgetClient, EventType } from "matrix-js-sdk";
|
||||
|
||||
import { getUrlParams } from "./UrlParams";
|
||||
@@ -35,11 +35,14 @@ vi.mock("./UrlParams", () => ({
|
||||
})),
|
||||
}));
|
||||
|
||||
initializeWidget();
|
||||
describe("widget", () => {
|
||||
beforeAll(() => {});
|
||||
beforeEach(() => {
|
||||
createRoomWidgetClientSpy.mockClear();
|
||||
});
|
||||
|
||||
describe("widget", () => {
|
||||
it("should create an embedded client with the correct params", () => {
|
||||
initializeWidget("ANYRTCAPP");
|
||||
|
||||
expect(getUrlParams()).toStrictEqual({
|
||||
widgetId: "id",
|
||||
parentUrl: "http://parentUrl",
|
||||
@@ -66,13 +69,16 @@ describe("widget", () => {
|
||||
];
|
||||
|
||||
const sendState = [
|
||||
"myYser", // Legacy call membership events
|
||||
`_myYser_AAAAA_m.call`, // Session membership events
|
||||
`myYser_AAAAA_m.call`, // The above with no leading underscore, for room versions whose auth rules allow it
|
||||
].map((stateKey) => ({
|
||||
eventType: EventType.GroupCallMemberPrefix,
|
||||
stateKey,
|
||||
}));
|
||||
{ eventType: "org.matrix.msc3401.call.member", stateKey: "myYser" }, // Legacy call membership events
|
||||
{
|
||||
eventType: "org.matrix.msc3401.call.member",
|
||||
stateKey: `_myYser_AAAAA_ANYRTCAPP`,
|
||||
}, // Session membership events
|
||||
{
|
||||
eventType: "org.matrix.msc3401.call.member",
|
||||
stateKey: `myYser_AAAAA_ANYRTCAPP`,
|
||||
}, // The above with no leading underscore, for room versions whose auth rules allow it
|
||||
];
|
||||
const receiveState = [
|
||||
{ eventType: EventType.RoomCreate },
|
||||
{ eventType: EventType.RoomName },
|
||||
@@ -124,4 +130,32 @@ describe("widget", () => {
|
||||
});
|
||||
expect(createRoomWidgetClientSpy.mock.calls[0][4]).toStrictEqual(false);
|
||||
});
|
||||
|
||||
it("should request send message permission if requested", () => {
|
||||
initializeWidget("ANYRTCAPP", true);
|
||||
expect(createRoomWidgetClientSpy).toHaveBeenLastCalledWith(
|
||||
expect.anything(),
|
||||
// capabilities
|
||||
expect.objectContaining({
|
||||
sendEvent: expect.arrayContaining(["m.room.message"]),
|
||||
}),
|
||||
expect.anything(),
|
||||
expect.anything(),
|
||||
expect.anything(),
|
||||
);
|
||||
});
|
||||
|
||||
it("should not request send message permission when not requested", () => {
|
||||
initializeWidget("", false);
|
||||
expect(createRoomWidgetClientSpy).toHaveBeenLastCalledWith(
|
||||
expect.anything(),
|
||||
// capabilities
|
||||
expect.objectContaining({
|
||||
sendEvent: expect.not.arrayContaining(["m.room.message"]),
|
||||
}),
|
||||
expect.anything(),
|
||||
expect.anything(),
|
||||
expect.anything(),
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -68,7 +68,10 @@ export let widget: WidgetHelpers | null;
|
||||
*/
|
||||
// this needs to be a seperate call and cannot be done on import to allow us to spy on methods in here before
|
||||
// execution.
|
||||
export const initializeWidget = (): void => {
|
||||
export const initializeWidget = (
|
||||
rtcApplication: string = "m.call",
|
||||
sendRoomEvents = false,
|
||||
): void => {
|
||||
try {
|
||||
const {
|
||||
widgetId,
|
||||
@@ -116,6 +119,9 @@ export const initializeWidget = (): void => {
|
||||
EventType.CallNotify, // Sent as a deprecated fallback
|
||||
EventType.RTCNotification,
|
||||
];
|
||||
if (sendRoomEvents) {
|
||||
sendEvent.push(EventType.RoomMessage);
|
||||
}
|
||||
const sendRecvEvent = [
|
||||
"org.matrix.rageshake_request",
|
||||
EventType.CallEncryptionKeysPrefix,
|
||||
@@ -128,8 +134,8 @@ export const initializeWidget = (): void => {
|
||||
|
||||
const sendState = [
|
||||
userId, // Legacy call membership events
|
||||
`_${userId}_${deviceId}_m.call`, // Session membership events
|
||||
`${userId}_${deviceId}_m.call`, // The above with no leading underscore, for room versions whose auth rules allow it
|
||||
`_${userId}_${deviceId}_${rtcApplication}`, // Session membership events
|
||||
`${userId}_${deviceId}_${rtcApplication}`, // The above with no leading underscore, for room versions whose auth rules allow it
|
||||
].map((stateKey) => ({
|
||||
eventType: EventType.GroupCallMemberPrefix,
|
||||
stateKey,
|
||||
|
||||
Reference in New Issue
Block a user