From fbd2c97f87c845f4d8898ffce77a20a83eaa40e1 Mon Sep 17 00:00:00 2001 From: Andy Balaam Date: Wed, 1 Feb 2023 10:44:32 +0000 Subject: [PATCH] Move the logic of roomPredecessor into the RoomState class (#3114) * Move the logic of roomPredecessor into the RoomState class * Fix review comments --- src/models/room-state.ts | 45 ++++++++++++++++++++++++++++++++++++++++ src/models/room.ts | 25 +++------------------- 2 files changed, 48 insertions(+), 22 deletions(-) diff --git a/src/models/room-state.ts b/src/models/room-state.ts index a17d92b56..77693e974 100644 --- a/src/models/room-state.ts +++ b/src/models/room-state.ts @@ -964,6 +964,51 @@ export class RoomState extends TypedEventEmitter return guestAccessContent["guest_access"] || GuestAccess.Forbidden; } + /** + * Find the predecessor room based on this room state. + * + * @param msc3946ProcessDynamicPredecessor - if true, look for an + * m.room.predecessor state event and use it if found (MSC3946). + * @returns null if this room has no predecessor. Otherwise, returns + * the roomId and last eventId of the predecessor room. + * If msc3946ProcessDynamicPredecessor is true, use m.predecessor events + * as well as m.room.create events to find predecessors. + * Note: if an m.predecessor event is used, eventId is null since those + * events do not include an event_id property. + */ + public findPredecessor( + msc3946ProcessDynamicPredecessor = false, + ): { roomId: string; eventId: string | null } | null { + // Note: the tests for this function are against Room.findPredecessor, + // which just calls through to here. + + if (msc3946ProcessDynamicPredecessor) { + const predecessorEvent = this.getStateEvents(EventType.RoomPredecessor, ""); + if (predecessorEvent) { + const roomId = predecessorEvent.getContent()["predecessor_room_id"]; + if (typeof roomId === "string") { + return { roomId, eventId: null }; + } + } + } + + const createEvent = this.getStateEvents(EventType.RoomCreate, ""); + if (createEvent) { + const predecessor = createEvent.getContent()["predecessor"]; + if (predecessor) { + const roomId = predecessor["room_id"]; + if (typeof roomId === "string") { + let eventId = predecessor["event_id"]; + if (typeof eventId !== "string" || eventId === "") { + eventId = null; + } + return { roomId, eventId }; + } + } + } + return null; + } + private updateThirdPartyTokenCache(memberEvent: MatrixEvent): void { if (!memberEvent.getContent().third_party_invite) { return; diff --git a/src/models/room.ts b/src/models/room.ts index 496dd6e8d..a82efcc6f 100644 --- a/src/models/room.ts +++ b/src/models/room.ts @@ -3025,6 +3025,8 @@ export class Room extends ReadReceipt { } /** + * Find the predecessor of this room. + * * @param msc3946ProcessDynamicPredecessor - if true, look for an * m.room.predecessor state event and use it if found (MSC3946). * @returns null if this room has no predecessor. Otherwise, returns @@ -3041,28 +3043,7 @@ export class Room extends ReadReceipt { if (!currentState) { return null; } - if (msc3946ProcessDynamicPredecessor) { - const predecessorEvent = currentState.getStateEvents(EventType.RoomPredecessor, ""); - if (predecessorEvent) { - const roomId = predecessorEvent.getContent()["predecessor_room_id"]; - if (roomId) { - return { roomId, eventId: null }; - } - } - } - - const createEvent = currentState.getStateEvents(EventType.RoomCreate, ""); - if (createEvent) { - const predecessor = createEvent.getContent()["predecessor"]; - if (predecessor) { - const roomId = predecessor["room_id"]; - if (roomId) { - const eventId = predecessor["event_id"] || null; - return { roomId, eventId }; - } - } - } - return null; + return currentState.findPredecessor(msc3946ProcessDynamicPredecessor); } private roomNameGenerator(state: RoomNameState): string {