Skip to content
This repository has been archived by the owner on Sep 11, 2024. It is now read-only.

Commit

Permalink
Cancel pending events in virtual room when call placed
Browse files Browse the repository at this point in the history
As the comment hopefully explains.

Also add public qualifiers to the methods in Resend which lacked
any visibility specifiers.

Fixes element-hq/element-web#17594
  • Loading branch information
dbkr committed Jan 19, 2022
1 parent c068133 commit e957872
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 4 deletions.
13 changes: 13 additions & 0 deletions src/CallHandler.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ import { WidgetLayoutStore, Container } from './stores/widgets/WidgetLayoutStore
import { getIncomingCallToastKey } from './toasts/IncomingCallToast';
import ToastStore from './stores/ToastStore';
import IncomingCallToast from "./toasts/IncomingCallToast";
import Resend from './Resend';

export const PROTOCOL_PSTN = 'm.protocol.pstn';
export const PROTOCOL_PSTN_PREFIXED = 'im.vector.protocol.pstn';
Expand Down Expand Up @@ -737,6 +738,18 @@ export default class CallHandler extends EventEmitter {
const mappedRoomId = (await VoipUserMapper.sharedInstance().getOrCreateVirtualRoomForRoom(roomId)) || roomId;
logger.debug("Mapped real room " + roomId + " to room ID " + mappedRoomId);

// If we're using a virtual room nd there are any events pending, try to resend them,
// otherwise the call will fail and because its a virtual room, the user won't be able
// to see it to either retry or clear the pending events. There will only be call events
// in this queue, and since we're about to place a new call, they can only be events from
// previous calls that are probably stale by now, so just cancel them.
if (mappedRoomId !== roomId) {
const mappedRoom = MatrixClientPeg.get().getRoom(mappedRoomId);
if (mappedRoom.getPendingEvents().length > 0) {
Resend.cancelUnsentEvents(mappedRoom);
}
}

const timeUntilTurnCresExpire = MatrixClientPeg.get().getTurnServersExpiry() - Date.now();
logger.log("Current turn creds expire in " + timeUntilTurnCresExpire + " ms");
const call = MatrixClientPeg.get().createCall(mappedRoomId);
Expand Down
8 changes: 4 additions & 4 deletions src/Resend.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,23 +22,23 @@ import { MatrixClientPeg } from './MatrixClientPeg';
import dis from './dispatcher/dispatcher';

export default class Resend {
static resendUnsentEvents(room: Room): Promise<void[]> {
public static resendUnsentEvents(room: Room): Promise<void[]> {
return Promise.all(room.getPendingEvents().filter(function(ev: MatrixEvent) {
return ev.status === EventStatus.NOT_SENT;
}).map(function(event: MatrixEvent) {
return Resend.resend(event);
}));
}

static cancelUnsentEvents(room: Room): void {
public static cancelUnsentEvents(room: Room): void {
room.getPendingEvents().filter(function(ev: MatrixEvent) {
return ev.status === EventStatus.NOT_SENT;
}).forEach(function(event: MatrixEvent) {
Resend.removeFromQueue(event);
});
}

static resend(event: MatrixEvent): Promise<void> {
public static resend(event: MatrixEvent): Promise<void> {
const room = MatrixClientPeg.get().getRoom(event.getRoomId());
return MatrixClientPeg.get().resendEvent(event, room).then(function(res) {
dis.dispatch({
Expand All @@ -52,7 +52,7 @@ export default class Resend {
});
}

static removeFromQueue(event: MatrixEvent): void {
public static removeFromQueue(event: MatrixEvent): void {
MatrixClientPeg.get().cancelPendingEvent(event);
}
}

0 comments on commit e957872

Please sign in to comment.