Explorar el Código

perf(app): don't keep parts in memory

adamelmore hace 4 semanas
padre
commit
3e420bf8e1
Se han modificado 1 ficheros con 59 adiciones y 13 borrados
  1. 59 13
      packages/app/src/context/global-sync.tsx

+ 59 - 13
packages/app/src/context/global-sync.tsx

@@ -579,6 +579,41 @@ function createGlobalSync() {
     if (!existing) return
 
     const [store, setStore] = existing
+
+    const cleanupSessionCaches = (sessionID: string) => {
+      if (!sessionID) return
+
+      const hasAny =
+        store.message[sessionID] !== undefined ||
+        store.session_diff[sessionID] !== undefined ||
+        store.todo[sessionID] !== undefined ||
+        store.permission[sessionID] !== undefined ||
+        store.question[sessionID] !== undefined ||
+        store.session_status[sessionID] !== undefined
+
+      if (!hasAny) return
+
+      setStore(
+        produce((draft) => {
+          const messages = draft.message[sessionID]
+          if (messages) {
+            for (const message of messages) {
+              const id = message?.id
+              if (!id) continue
+              delete draft.part[id]
+            }
+          }
+
+          delete draft.message[sessionID]
+          delete draft.session_diff[sessionID]
+          delete draft.todo[sessionID]
+          delete draft.permission[sessionID]
+          delete draft.question[sessionID]
+          delete draft.session_status[sessionID]
+        }),
+      )
+    }
+
     switch (event.type) {
       case "server.instance.disposed": {
         if (globalStore.reload) {
@@ -616,6 +651,9 @@ function createGlobalSync() {
               }),
             )
           }
+
+          cleanupSessionCaches(info.id)
+
           if (info.parentID) break
           setStore("sessionTotal", (value) => Math.max(0, value - 1))
           break
@@ -631,7 +669,8 @@ function createGlobalSync() {
         break
       }
       case "session.deleted": {
-        const result = Binary.search(store.session, event.properties.info.id, (s) => s.id)
+        const sessionID = event.properties.info.id
+        const result = Binary.search(store.session, sessionID, (s) => s.id)
         if (result.found) {
           setStore(
             "session",
@@ -640,6 +679,9 @@ function createGlobalSync() {
             }),
           )
         }
+
+        cleanupSessionCaches(sessionID)
+
         if (event.properties.info.parentID) break
         setStore("sessionTotal", (value) => Math.max(0, value - 1))
         break
@@ -675,18 +717,22 @@ function createGlobalSync() {
         break
       }
       case "message.removed": {
-        const messages = store.message[event.properties.sessionID]
-        if (!messages) break
-        const result = Binary.search(messages, event.properties.messageID, (m) => m.id)
-        if (result.found) {
-          setStore(
-            "message",
-            event.properties.sessionID,
-            produce((draft) => {
-              draft.splice(result.index, 1)
-            }),
-          )
-        }
+        const sessionID = event.properties.sessionID
+        const messageID = event.properties.messageID
+
+        setStore(
+          produce((draft) => {
+            const messages = draft.message[sessionID]
+            if (messages) {
+              const result = Binary.search(messages, messageID, (m) => m.id)
+              if (result.found) {
+                messages.splice(result.index, 1)
+              }
+            }
+
+            delete draft.part[messageID]
+          }),
+        )
         break
       }
       case "message.part.updated": {