Skip error screen for the issue, that the homeserver does not support the room summary endpoint. (#2453)

* Add try inner try block to the room summary fetching and only throw after fetching and a "blind join" fails.
(blind join: call room.join without knowing if the room is public)

Co-authored-by: Robin <robin@robin.town>

---------

Co-authored-by: Robin <robin@robin.town>
This commit is contained in:
Timo
2024-06-25 10:44:02 +02:00
committed by GitHub
parent 8a6101cd14
commit d27f433175

View File

@@ -225,16 +225,38 @@ export const useLoadGroupCall = (
}); });
} else { } else {
// If the room does not exist we first search for it with viaServers // If the room does not exist we first search for it with viaServers
const roomSummary = await client.getRoomSummary(roomId, viaServers); let roomSummary: RoomSummary | undefined = undefined;
if (roomSummary.join_rule === JoinRule.Public) { try {
room = await client.joinRoom(roomSummary.room_id, { roomSummary = await client.getRoomSummary(roomId, viaServers);
} catch (error) {
// If the room summary endpoint is not supported we let it be undefined and treat this case like
// `JoinRule.Public`.
// This is how the logic was done before: "we expect any room id passed to EC
// to be for a public call" Which is definitely not ideal but worth a try if fetching
// the summary crashes.
logger.warn(
`Could not load room summary to decide whether we want to join or knock.
EC will fallback to join as if this would be a public room.
Reach out to your homeserver admin to ask them about supporting the \`/summary\` endpoint (im.nheko.summary):`,
error,
);
}
if (
roomSummary === undefined ||
roomSummary.join_rule === JoinRule.Public
) {
room = await client.joinRoom(roomId, {
viaServers, viaServers,
}); });
} else if (roomSummary.join_rule === JoinRule.Knock) { } else if (roomSummary.join_rule === JoinRule.Knock) {
// bind room summary in this scope so we have it stored in a binding of type `RoomSummary`
// instead of `RoomSummary | undefined`. Because we use it in a promise the linter does not accept
// the type check from the if condition above.
const _roomSummary = roomSummary;
let knock: () => void = () => {}; let knock: () => void = () => {};
const userPressedAskToJoinPromise: Promise<void> = new Promise( const userPressedAskToJoinPromise: Promise<void> = new Promise(
(resolve) => { (resolve) => {
if (roomSummary.membership !== KnownMembership.Knock) { if (_roomSummary.membership !== KnownMembership.Knock) {
knock = resolve; knock = resolve;
} else { } else {
// resolve immediately if the user already knocked // resolve immediately if the user already knocked
@@ -242,12 +264,13 @@ export const useLoadGroupCall = (
} }
}, },
); );
setState({ kind: "canKnock", roomSummary, knock }); setState({ kind: "canKnock", roomSummary: _roomSummary, knock });
await userPressedAskToJoinPromise; await userPressedAskToJoinPromise;
room = await getRoomByKnocking( room = await getRoomByKnocking(
roomSummary.room_id, roomSummary.room_id,
viaServers, viaServers,
() => setState({ kind: "waitForInvite", roomSummary }), () =>
setState({ kind: "waitForInvite", roomSummary: _roomSummary }),
); );
} else { } else {
throw new Error( throw new Error(