You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-12-08 19:08:34 +03:00
Refactor getRoomUpgradeHistory to use Room.findPredecessorRoomId (#3090)
* Refactor getRoomUpgradeHistory to use Room.findPredecessorRoomId * Simplify getRoomUpgradeHistory implementation a little
This commit is contained in:
@@ -4990,68 +4990,72 @@ export class MatrixClient extends TypedEventEmitter<EmittedEvents, ClientEventHa
|
|||||||
* history.
|
* history.
|
||||||
*/
|
*/
|
||||||
public getRoomUpgradeHistory(roomId: string, verifyLinks = false): Room[] {
|
public getRoomUpgradeHistory(roomId: string, verifyLinks = false): Room[] {
|
||||||
let currentRoom = this.getRoom(roomId);
|
const currentRoom = this.getRoom(roomId);
|
||||||
if (!currentRoom) return [];
|
if (!currentRoom) return [];
|
||||||
|
|
||||||
const upgradeHistory = [currentRoom];
|
const before = this.findPredecessorRooms(currentRoom, verifyLinks);
|
||||||
|
const after = this.findSuccessorRooms(currentRoom, verifyLinks);
|
||||||
|
|
||||||
// Work backwards first, looking at create events.
|
return [...before, currentRoom, ...after];
|
||||||
let successorRoomId = currentRoom.roomId;
|
}
|
||||||
let createEvent = currentRoom.currentState.getStateEvents(EventType.RoomCreate, "");
|
|
||||||
while (createEvent) {
|
|
||||||
const predecessor = createEvent.getContent()["predecessor"];
|
|
||||||
if (predecessor && predecessor["room_id"]) {
|
|
||||||
const refRoom = this.getRoom(predecessor["room_id"]);
|
|
||||||
if (!refRoom) break; // end of the chain
|
|
||||||
|
|
||||||
|
private findPredecessorRooms(room: Room, verifyLinks: boolean): Room[] {
|
||||||
|
const ret: Room[] = [];
|
||||||
|
|
||||||
|
// Work backwards from newer to older rooms
|
||||||
|
let predecessorRoomId = room.findPredecessorRoomId();
|
||||||
|
while (predecessorRoomId !== null) {
|
||||||
|
const predecessorRoom = this.getRoom(predecessorRoomId);
|
||||||
|
if (predecessorRoom === null) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (verifyLinks) {
|
if (verifyLinks) {
|
||||||
const tombstone = refRoom.currentState.getStateEvents(EventType.RoomTombstone, "");
|
const tombstone = predecessorRoom.currentState.getStateEvents(EventType.RoomTombstone, "");
|
||||||
|
if (!tombstone || tombstone.getContent()["replacement_room"] !== room.roomId) {
|
||||||
if (!tombstone || tombstone.getContent()["replacement_room"] !== successorRoomId) {
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Insert at the front because we're working backwards from the currentRoom
|
// Insert at the front because we're working backwards from the currentRoom
|
||||||
upgradeHistory.splice(0, 0, refRoom);
|
ret.splice(0, 0, predecessorRoom);
|
||||||
successorRoomId = refRoom.roomId;
|
|
||||||
createEvent = refRoom.currentState.getStateEvents(EventType.RoomCreate, "");
|
room = predecessorRoom;
|
||||||
} else {
|
predecessorRoomId = room.findPredecessorRoomId();
|
||||||
// No further create events to look at
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
private findSuccessorRooms(room: Room, verifyLinks: boolean): Room[] {
|
||||||
|
const ret: Room[] = [];
|
||||||
|
|
||||||
|
// Work forwards, looking at tombstone events
|
||||||
|
let tombstoneEvent = room.currentState.getStateEvents(EventType.RoomTombstone, "");
|
||||||
|
while (tombstoneEvent) {
|
||||||
|
const successorRoom = this.getRoom(tombstoneEvent.getContent()["replacement_room"]);
|
||||||
|
if (!successorRoom) break; // end of the chain
|
||||||
|
if (successorRoom.roomId === room.roomId) break; // Tombstone is referencing it's own room
|
||||||
|
|
||||||
|
if (verifyLinks) {
|
||||||
|
const predecessorRoomId = successorRoom.findPredecessorRoomId();
|
||||||
|
if (!predecessorRoomId || predecessorRoomId !== room.roomId) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Work forwards next, looking at tombstone events
|
|
||||||
let tombstoneEvent = currentRoom.currentState.getStateEvents(EventType.RoomTombstone, "");
|
|
||||||
while (tombstoneEvent) {
|
|
||||||
const refRoom = this.getRoom(tombstoneEvent.getContent()["replacement_room"]);
|
|
||||||
if (!refRoom) break; // end of the chain
|
|
||||||
if (refRoom.roomId === currentRoom.roomId) break; // Tombstone is referencing it's own room
|
|
||||||
|
|
||||||
if (verifyLinks) {
|
|
||||||
createEvent = refRoom.currentState.getStateEvents(EventType.RoomCreate, "");
|
|
||||||
if (!createEvent || !createEvent.getContent()["predecessor"]) break;
|
|
||||||
|
|
||||||
const predecessor = createEvent.getContent()["predecessor"];
|
|
||||||
if (predecessor["room_id"] !== currentRoom.roomId) break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Push to the end because we're looking forwards
|
// Push to the end because we're looking forwards
|
||||||
upgradeHistory.push(refRoom);
|
ret.push(successorRoom);
|
||||||
const roomIds = new Set(upgradeHistory.map((ref) => ref.roomId));
|
const roomIds = new Set(ret.map((ref) => ref.roomId));
|
||||||
if (roomIds.size < upgradeHistory.length) {
|
if (roomIds.size < ret.length) {
|
||||||
// The last room added to the list introduced a previous roomId
|
// The last room added to the list introduced a previous roomId
|
||||||
// To avoid recursion, return the last rooms - 1
|
// To avoid recursion, return the last rooms - 1
|
||||||
return upgradeHistory.slice(0, upgradeHistory.length - 1);
|
return ret.slice(0, ret.length - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the current room to the reference room so we know where we're at
|
// Set the current room to the reference room so we know where we're at
|
||||||
currentRoom = refRoom;
|
room = successorRoom;
|
||||||
tombstoneEvent = currentRoom.currentState.getStateEvents(EventType.RoomTombstone, "");
|
tombstoneEvent = room.currentState.getStateEvents(EventType.RoomTombstone, "");
|
||||||
}
|
}
|
||||||
|
return ret;
|
||||||
return upgradeHistory;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user