From 9ce95da8f41b1f93e632f2e989f74620f7282612 Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Sat, 25 Sep 2021 20:18:06 +0530 Subject: [PATCH] Fixed #103: Crash when space nesting has a loop Signed-off-by: Ajay Bura --- src/client/state/RoomList.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/client/state/RoomList.js b/src/client/state/RoomList.js index b746a46..5b45bc7 100644 --- a/src/client/state/RoomList.js +++ b/src/client/state/RoomList.js @@ -76,10 +76,23 @@ class RoomList extends EventEmitter { if (parents.size === 0) this.roomIdToParents.delete(roomId); } + getParentSpaces(roomId) { + let parentIds = this.roomIdToParents.get(roomId); + if (parentIds) { + [...parentIds].forEach((parentId) => { + parentIds = new Set([...parentIds, ...this.getParentSpaces(parentId)]); + }); + } + return parentIds || new Set(); + } + addToSpaces(roomId) { this.spaces.add(roomId); + const allParentSpaces = this.getParentSpaces(roomId); + const spaceChildren = this.getSpaceChildren(roomId); spaceChildren?.forEach((childRoomId) => { + if (allParentSpaces.has(childRoomId)) return; this.addToRoomIdToParents(childRoomId, roomId); }); } @@ -268,6 +281,8 @@ class RoomList extends EventEmitter { if (mEvent.getType() === 'm.space.child') { const { event } = mEvent; if (isMEventSpaceChild(mEvent)) { + const allParentSpaces = this.getParentSpaces(event.room_id); + if (allParentSpaces.has(event.state_key)) return; this.addToRoomIdToParents(event.state_key, event.room_id); } else this.removeFromRoomIdToParents(event.state_key, event.room_id); this.emit(cons.events.roomList.ROOMLIST_UPDATED);