Skip to content

Commit 206f26a

Browse files
committed
Send notification events when starting a call
Previously this has been the responsibility of the hosting application (Element Web / Element X), but I would like to move this responsibility to Element Call itself to make it even more lightweight to integrate Element Call into a widget-capable client.
1 parent 3808801 commit 206f26a

File tree

2 files changed

+34
-2
lines changed

2 files changed

+34
-2
lines changed

src/rtcSessionHelpers.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@ import { AutoDiscovery } from "matrix-js-sdk/lib/autodiscovery";
1818
import { PosthogAnalytics } from "./analytics/PosthogAnalytics";
1919
import { Config } from "./config/Config";
2020
import { ElementWidgetActions, widget, type WidgetHelpers } from "./widget";
21-
import { MatrixRTCFocusMissingError } from "./utils/errors.ts";
22-
import { getUrlParams } from "./UrlParams.ts";
21+
import { MatrixRTCFocusMissingError } from "./utils/errors";
22+
import { getUrlParams } from "./UrlParams";
23+
import { getJoinedNonFunctionalMembers } from "./utils/matrix";
2324

2425
const FOCI_WK_KEY = "org.matrix.msc4143.rtc_foci";
2526

@@ -94,6 +95,12 @@ async function makePreferredLivekitFoci(
9495
// if (focusOtherMembers) preferredFoci.push(focusOtherMembers);
9596
}
9697

98+
function getNotifyType(room: Room): CallNotifyType | undefined {
99+
if (room.isCallRoom()) return undefined;
100+
if (getJoinedNonFunctionalMembers(room).length === 2) return "ring";
101+
return "notify";
102+
}
103+
97104
export async function enterRTCSession(
98105
rtcSession: MatrixRTCSession,
99106
encryptMedia: boolean,
@@ -116,6 +123,7 @@ export async function enterRTCSession(
116123
await makePreferredLivekitFoci(rtcSession, livekitAlias),
117124
makeActiveFocus(),
118125
{
126+
notifyType: getNotifyType(rtcSession.room),
119127
useNewMembershipManager,
120128
manageMediaKeys: encryptMedia,
121129
...(useDeviceSessionMemberEvents !== undefined && {

src/utils/matrix.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ import {
1212
IndexedDBStore,
1313
MemoryStore,
1414
Preset,
15+
type RoomMember,
16+
UNSTABLE_ELEMENT_FUNCTIONAL_USERS,
1517
Visibility,
18+
Direction,
1619
} from "matrix-js-sdk";
1720
import { type ISyncStateData, type SyncState } from "matrix-js-sdk/lib/sync";
1821
import { logger } from "matrix-js-sdk/lib/logger";
@@ -336,6 +339,27 @@ export function getRelativeRoomUrl(
336339
return `/room/#${roomPart}?${generateUrlSearchParams(roomId, encryptionSystem, viaServers).toString()}`;
337340
}
338341

342+
/**
343+
* Returns all room members that are non-functional (all actual room members).
344+
* A functional user is a user that is not a real user, but a bot, assistant, etc.
345+
*/
346+
export function getJoinedNonFunctionalMembers(room: Room): RoomMember[] {
347+
const functionalUsersStateEvent = room
348+
.getLiveTimeline()
349+
.getState(Direction.Forward)
350+
?.getStateEvents(UNSTABLE_ELEMENT_FUNCTIONAL_USERS.name, "");
351+
352+
const functionalMembers = Array.isArray(
353+
functionalUsersStateEvent?.getContent().service_members,
354+
)
355+
? functionalUsersStateEvent.getContent().service_members
356+
: [];
357+
358+
return room
359+
.getJoinedMembers()
360+
.filter((m) => !functionalMembers.includes(m.userId));
361+
}
362+
339363
/**
340364
* Perform a network operation with retries on ConnectionError.
341365
* If the error is not retryable, or the max number of retries is reached, the error is rethrown.

0 commit comments

Comments
 (0)