Skip to content

Commit 1884619

Browse files
committed
Provide eventId as well as roomId from Room.findPredecessor
1 parent 4f9fad6 commit 1884619

File tree

3 files changed

+27
-18
lines changed

3 files changed

+27
-18
lines changed

spec/unit/room.spec.ts

+9-6
Original file line numberDiff line numberDiff line change
@@ -3356,19 +3356,19 @@ describe("Room", function () {
33563356

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

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

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

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

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

33953398
it("Ignores the m.predecessor event and returns null if we don't ask to use it", () => {
@@ -3400,7 +3403,7 @@ describe("Room", function () {
34003403
]);
34013404
// Don't provide an argument for msc3946ProcessDynamicPredecessor -
34023405
// we should ignore the predecessor event.
3403-
expect(room.findPredecessorRoomId()).toBeNull();
3406+
expect(room.findPredecessor()).toBeNull();
34043407
});
34053408
});
34063409
});

src/client.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -3791,7 +3791,7 @@ export class MatrixClient extends TypedEventEmitter<EmittedEvents, ClientEventHa
37913791

37923792
const replacedRooms = new Set();
37933793
for (const r of allRooms) {
3794-
const predecessor = r.findPredecessorRoomId(msc3946ProcessDynamicPredecessor);
3794+
const predecessor = r.findPredecessor(msc3946ProcessDynamicPredecessor)?.roomId;
37953795
if (predecessor) {
37963796
replacedRooms.add(predecessor);
37973797
}
@@ -5014,7 +5014,7 @@ export class MatrixClient extends TypedEventEmitter<EmittedEvents, ClientEventHa
50145014
const ret: Room[] = [];
50155015

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

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

50495049
if (verifyLinks) {
5050-
const predecessorRoomId = successorRoom.findPredecessorRoomId(msc3946ProcessDynamicPredecessor);
5050+
const predecessorRoomId = successorRoom.findPredecessor(msc3946ProcessDynamicPredecessor)?.roomId;
50515051
if (!predecessorRoomId || predecessorRoomId !== room.roomId) {
50525052
break;
50535053
}

src/models/room.ts

+14-8
Original file line numberDiff line numberDiff line change
@@ -3032,12 +3032,17 @@ export class Room extends ReadReceipt<RoomEmittedEvents, RoomEventHandlerMap> {
30323032

30333033
/**
30343034
* @param msc3946ProcessDynamicPredecessor - if true, look for an
3035-
* m.room.predecessor state event and
3036-
* use it if found (MSC3946).
3037-
* @returns the ID of the room that was this room's predecessor, or null if
3038-
* this room has no predecessor.
3039-
*/
3040-
public findPredecessorRoomId(msc3946ProcessDynamicPredecessor = false): string | null {
3035+
* m.room.predecessor state event and use it if found (MSC3946).
3036+
* @returns null if this room has no predecessor. Otherwise, returns
3037+
* the roomId and last eventId of the predecessor room.
3038+
* If msc3946ProcessDynamicPredecessor is true, use m.predecessor events
3039+
* as well as m.room.create events to find predecessors.
3040+
* Note: if an m.predecessor event is used, eventId is null since those
3041+
* events do not include an event_id property.
3042+
*/
3043+
public findPredecessor(
3044+
msc3946ProcessDynamicPredecessor = false,
3045+
): { roomId: string; eventId: string | null } | null {
30413046
const currentState = this.getLiveTimeline().getState(EventTimeline.FORWARDS);
30423047
if (!currentState) {
30433048
return null;
@@ -3047,7 +3052,7 @@ export class Room extends ReadReceipt<RoomEmittedEvents, RoomEventHandlerMap> {
30473052
if (predecessorEvent) {
30483053
const roomId = predecessorEvent.getContent()["predecessor_room_id"];
30493054
if (roomId) {
3050-
return roomId;
3055+
return { roomId, eventId: null };
30513056
}
30523057
}
30533058
}
@@ -3058,7 +3063,8 @@ export class Room extends ReadReceipt<RoomEmittedEvents, RoomEventHandlerMap> {
30583063
if (predecessor) {
30593064
const roomId = predecessor["room_id"];
30603065
if (roomId) {
3061-
return roomId;
3066+
const eventId = predecessor["event_id"] || null;
3067+
return { roomId, eventId };
30623068
}
30633069
}
30643070
}

0 commit comments

Comments
 (0)