From 89df43a975d534dad6ad87500553b13e24e2886d Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 16 Feb 2023 09:38:36 +0000 Subject: [PATCH] Fix predecessor types, nowhere does the spec say it can be `null` (#3159) * Fix predecessor types, nowhere does the spec say it can be `null` * Iterate * Update comment * update test --- spec/unit/room.spec.ts | 2 +- src/models/room-state.ts | 27 +++++++++++++++++---------- src/models/room.ts | 8 +++----- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/spec/unit/room.spec.ts b/spec/unit/room.spec.ts index ada786a2a..37dc11b66 100644 --- a/spec/unit/room.spec.ts +++ b/spec/unit/room.spec.ts @@ -3392,7 +3392,7 @@ describe("Room", function () { const useMsc3946 = true; expect(room.findPredecessor(useMsc3946)).toEqual({ roomId: "otherreplacedroomid", - eventId: null, // m.predecessor did not include an event_id + eventId: undefined, // m.predecessor did not include an event_id }); }); diff --git a/src/models/room-state.ts b/src/models/room-state.ts index e704d27a8..75b2c87c6 100644 --- a/src/models/room-state.ts +++ b/src/models/room-state.ts @@ -973,22 +973,24 @@ export class RoomState extends TypedEventEmitter * 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. + * Note: if an m.predecessor event is used, eventId may be undefined + * since last_known_event_id is optional. */ - public findPredecessor( - msc3946ProcessDynamicPredecessor = false, - ): { roomId: string; eventId: string | null } | null { + public findPredecessor(msc3946ProcessDynamicPredecessor = false): { roomId: string; eventId?: string } | 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"]; - let eventId = predecessorEvent.getContent()["last_known_event_id"]; + const content = predecessorEvent.getContent<{ + predecessor_room_id: string; + last_known_event_id?: string; + }>(); + const roomId = content.predecessor_room_id; + let eventId = content.last_known_event_id; if (typeof eventId !== "string") { - eventId = null; + eventId = undefined; } if (typeof roomId === "string") { return { roomId, eventId }; @@ -998,13 +1000,18 @@ export class RoomState extends TypedEventEmitter const createEvent = this.getStateEvents(EventType.RoomCreate, ""); if (createEvent) { - const predecessor = createEvent.getContent()["predecessor"]; + const predecessor = createEvent.getContent<{ + predecessor?: Partial<{ + room_id: string; + event_id: string; + }>; + }>()["predecessor"]; if (predecessor) { const roomId = predecessor["room_id"]; if (typeof roomId === "string") { let eventId = predecessor["event_id"]; if (typeof eventId !== "string" || eventId === "") { - eventId = null; + eventId = undefined; } return { roomId, eventId }; } diff --git a/src/models/room.ts b/src/models/room.ts index 75813fd98..93bdb99a7 100644 --- a/src/models/room.ts +++ b/src/models/room.ts @@ -3052,12 +3052,10 @@ export class Room extends ReadReceipt { * 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. + * Note: if an m.predecessor event is used, eventId may be undefined + * since last_known_event_id is optional. */ - public findPredecessor( - msc3946ProcessDynamicPredecessor = false, - ): { roomId: string; eventId: string | null } | null { + public findPredecessor(msc3946ProcessDynamicPredecessor = false): { roomId: string; eventId?: string } | null { const currentState = this.getLiveTimeline().getState(EventTimeline.FORWARDS); if (!currentState) { return null;