mirror of
https://github.com/vector-im/element-call.git
synced 2024-11-21 00:28:08 +08:00
Retry a join on invite if the response was M_FORBIDDEN
This commit is contained in:
parent
745533f061
commit
7e5a8b8feb
@ -17,7 +17,7 @@ import { SyncState } from "matrix-js-sdk/src/sync";
|
|||||||
import { MatrixRTCSession } from "matrix-js-sdk/src/matrixrtc/MatrixRTCSession";
|
import { MatrixRTCSession } from "matrix-js-sdk/src/matrixrtc/MatrixRTCSession";
|
||||||
import { RoomEvent, Room } from "matrix-js-sdk/src/models/room";
|
import { RoomEvent, Room } from "matrix-js-sdk/src/models/room";
|
||||||
import { KnownMembership } from "matrix-js-sdk/src/types";
|
import { KnownMembership } from "matrix-js-sdk/src/types";
|
||||||
import { JoinRule } from "matrix-js-sdk/src/matrix";
|
import { JoinRule, MatrixError } from "matrix-js-sdk/src/matrix";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
|
|
||||||
import { widget } from "../widget";
|
import { widget } from "../widget";
|
||||||
@ -54,6 +54,40 @@ export type GroupCallStatus =
|
|||||||
| GroupCallWaitForInvite
|
| GroupCallWaitForInvite
|
||||||
| GroupCallCanKnock;
|
| GroupCallCanKnock;
|
||||||
|
|
||||||
|
const MAX_RETRIES_FOR_INVITE_JOIN_FAILURE = 3;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Join a room, and retry on M_FORBIDDEN error in order to work
|
||||||
|
* around a potential race when joining rooms over federation.
|
||||||
|
*
|
||||||
|
* Will retry up to `MAX_RETRIES_FOR_INVITE_JOIN_FAILURE` times.
|
||||||
|
*
|
||||||
|
* @see https://github.com/element-hq/element-call/issues/2634
|
||||||
|
* @param client The matrix client
|
||||||
|
* @param retries Number of attempts made.
|
||||||
|
* @param params Parameters to pass to client.joinRoom
|
||||||
|
*/
|
||||||
|
async function joinRoomAfterInvite(
|
||||||
|
client: MatrixClient,
|
||||||
|
retries = 0,
|
||||||
|
...params: Parameters<MatrixClient["joinRoom"]>
|
||||||
|
): ReturnType<MatrixClient["joinRoom"]> {
|
||||||
|
try {
|
||||||
|
return await client.joinRoom(...params);
|
||||||
|
} catch (ex) {
|
||||||
|
if (
|
||||||
|
ex instanceof MatrixError &&
|
||||||
|
ex.errcode === "M_FORBIDDEN" &&
|
||||||
|
retries < MAX_RETRIES_FOR_INVITE_JOIN_FAILURE
|
||||||
|
) {
|
||||||
|
// If we were invited and got a M_FORBIDDEN, it's highly likely the server hasn't caught up yet.
|
||||||
|
await new Promise((r) => setTimeout(r, 5000));
|
||||||
|
return joinRoomAfterInvite(client, retries + 1, ...params);
|
||||||
|
}
|
||||||
|
throw ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export class CallTerminatedMessage extends Error {
|
export class CallTerminatedMessage extends Error {
|
||||||
/**
|
/**
|
||||||
* @param messageBody The message explaining the kind of termination (kick, ban, knock reject, etc.) (translated)
|
* @param messageBody The message explaining the kind of termination (kick, ban, knock reject, etc.) (translated)
|
||||||
@ -162,10 +196,13 @@ export const useLoadGroupCall = (
|
|||||||
membership === KnownMembership.Invite &&
|
membership === KnownMembership.Invite &&
|
||||||
prevMembership === KnownMembership.Knock
|
prevMembership === KnownMembership.Knock
|
||||||
) {
|
) {
|
||||||
client.joinRoom(room.roomId, { viaServers }).then((room) => {
|
joinRoomAfterInvite(client, 0, room.roomId, { viaServers }).then(
|
||||||
logger.log("Auto-joined %s", room.roomId);
|
(room) => {
|
||||||
resolve(room);
|
logger.log("Auto-joined %s", room.roomId);
|
||||||
}, reject);
|
resolve(room);
|
||||||
|
},
|
||||||
|
reject,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
if (membership === KnownMembership.Ban) reject(bannedError());
|
if (membership === KnownMembership.Ban) reject(bannedError());
|
||||||
if (membership === KnownMembership.Leave)
|
if (membership === KnownMembership.Leave)
|
||||||
|
Loading…
Reference in New Issue
Block a user