Fix getParentSpaces can cause call stack overflow
authorAjay Bura <ajbura@gmail.com>
Sun, 13 Mar 2022 10:06:15 +0000 (15:36 +0530)
committerAjay Bura <ajbura@gmail.com>
Sun, 13 Mar 2022 10:06:15 +0000 (15:36 +0530)
Signed-off-by: Ajay Bura <ajbura@gmail.com>
src/client/state/RoomList.js

index 8f3233c4279c2a7cdc47a9246fe233f85c3bbe8e..0153c450fc5967cc136a3073af02565adde87164 100644 (file)
@@ -92,13 +92,21 @@ class RoomList extends EventEmitter {
   }
 
   getParentSpaces(roomId) {
-    let parentIds = this.roomIdToParents.get(roomId);
-    if (parentIds) {
-      [...parentIds].forEach((parentId) => {
-        parentIds = new Set([...parentIds, ...this.getParentSpaces(parentId)]);
-      });
-    }
-    return parentIds || new Set();
+    const allParents = new Set();
+    const processed = new Set();
+    const addAllParentIds = (rId) => {
+      if (processed.has(rId)) return;
+      processed.add(rId);
+
+      const parents = this.roomIdToParents.get(rId);
+      if (parents === undefined) return;
+
+      parents.forEach((id) => allParents.add(id));
+      parents.forEach((id) => addAllParentIds(id));
+    };
+    addAllParentIds(roomId);
+    processed.clear();
+    return allParents;
   }
 
   addToSpaces(roomId) {