Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 9 additions & 6 deletions spec/unit/room.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3356,19 +3356,19 @@ describe("Room", function () {

it("Returns null if there is no create event", () => {
const room = new Room("roomid", client!, "@u:example.com");
expect(room.findPredecessorRoomId()).toBeNull();
expect(room.findPredecessor()).toBeNull();
});

it("Returns null if the create event has no predecessor", () => {
const room = new Room("roomid", client!, "@u:example.com");
room.addLiveEvents([roomCreateEvent("roomid", null)]);
expect(room.findPredecessorRoomId()).toBeNull();
expect(room.findPredecessor()).toBeNull();
});

it("Returns the predecessor ID if one is provided via create event", () => {
const room = new Room("roomid", client!, "@u:example.com");
room.addLiveEvents([roomCreateEvent("roomid", "replacedroomid")]);
expect(room.findPredecessorRoomId()).toBe("replacedroomid");
expect(room.findPredecessor()).toEqual({ roomId: "replacedroomid", eventId: "id_of_last_known_event" });
});

it("Prefers the m.predecessor event if one exists", () => {
Expand All @@ -3378,7 +3378,10 @@ describe("Room", function () {
predecessorEvent("roomid", "otherreplacedroomid"),
]);
const useMsc3946 = true;
expect(room.findPredecessorRoomId(useMsc3946)).toBe("otherreplacedroomid");
expect(room.findPredecessor(useMsc3946)).toEqual({
roomId: "otherreplacedroomid",
eventId: null, // m.predecessor does not include an event_id
});
});

it("Ignores the m.predecessor event if we don't ask to use it", () => {
Expand All @@ -3389,7 +3392,7 @@ describe("Room", function () {
]);
// Don't provide an argument for msc3946ProcessDynamicPredecessor -
// we should ignore the predecessor event.
expect(room.findPredecessorRoomId()).toBe("replacedroomid");
expect(room.findPredecessor()).toEqual({ roomId: "replacedroomid", eventId: "id_of_last_known_event" });
});

it("Ignores the m.predecessor event and returns null if we don't ask to use it", () => {
Expand All @@ -3400,7 +3403,7 @@ describe("Room", function () {
]);
// Don't provide an argument for msc3946ProcessDynamicPredecessor -
// we should ignore the predecessor event.
expect(room.findPredecessorRoomId()).toBeNull();
expect(room.findPredecessor()).toBeNull();
});
});
});
8 changes: 4 additions & 4 deletions src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3791,7 +3791,7 @@ export class MatrixClient extends TypedEventEmitter<EmittedEvents, ClientEventHa

const replacedRooms = new Set();
for (const r of allRooms) {
const predecessor = r.findPredecessorRoomId(msc3946ProcessDynamicPredecessor);
const predecessor = r.findPredecessor(msc3946ProcessDynamicPredecessor)?.roomId;
if (predecessor) {
replacedRooms.add(predecessor);
}
Expand Down Expand Up @@ -5014,7 +5014,7 @@ export class MatrixClient extends TypedEventEmitter<EmittedEvents, ClientEventHa
const ret: Room[] = [];

// Work backwards from newer to older rooms
let predecessorRoomId = room.findPredecessorRoomId(msc3946ProcessDynamicPredecessor);
let predecessorRoomId = room.findPredecessor(msc3946ProcessDynamicPredecessor)?.roomId;
while (predecessorRoomId !== null) {
const predecessorRoom = this.getRoom(predecessorRoomId);
if (predecessorRoom === null) {
Expand All @@ -5031,7 +5031,7 @@ export class MatrixClient extends TypedEventEmitter<EmittedEvents, ClientEventHa
ret.splice(0, 0, predecessorRoom);

room = predecessorRoom;
predecessorRoomId = room.findPredecessorRoomId(msc3946ProcessDynamicPredecessor);
predecessorRoomId = room.findPredecessor(msc3946ProcessDynamicPredecessor)?.roomId;
}
return ret;
}
Expand All @@ -5047,7 +5047,7 @@ export class MatrixClient extends TypedEventEmitter<EmittedEvents, ClientEventHa
if (successorRoom.roomId === room.roomId) break; // Tombstone is referencing its own room

if (verifyLinks) {
const predecessorRoomId = successorRoom.findPredecessorRoomId(msc3946ProcessDynamicPredecessor);
const predecessorRoomId = successorRoom.findPredecessor(msc3946ProcessDynamicPredecessor)?.roomId;
if (!predecessorRoomId || predecessorRoomId !== room.roomId) {
break;
}
Expand Down
22 changes: 14 additions & 8 deletions src/models/room.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3032,12 +3032,17 @@ export class Room extends ReadReceipt<RoomEmittedEvents, RoomEventHandlerMap> {

/**
* @param msc3946ProcessDynamicPredecessor - if true, look for an
* m.room.predecessor state event and
* use it if found (MSC3946).
* @returns the ID of the room that was this room's predecessor, or null if
* this room has no predecessor.
*/
public findPredecessorRoomId(msc3946ProcessDynamicPredecessor = false): string | null {
* 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 {
const currentState = this.getLiveTimeline().getState(EventTimeline.FORWARDS);
if (!currentState) {
return null;
Expand All @@ -3047,7 +3052,7 @@ export class Room extends ReadReceipt<RoomEmittedEvents, RoomEventHandlerMap> {
if (predecessorEvent) {
const roomId = predecessorEvent.getContent()["predecessor_room_id"];
if (roomId) {
return roomId;
return { roomId, eventId: null };
}
}
}
Expand All @@ -3058,7 +3063,8 @@ export class Room extends ReadReceipt<RoomEmittedEvents, RoomEventHandlerMap> {
if (predecessor) {
const roomId = predecessor["room_id"];
if (roomId) {
return roomId;
const eventId = predecessor["event_id"] || null;
return { roomId, eventId };
}
}
}
Expand Down