Просмотр исходного кода

fix(app): failed to create store

Adam 2 месяцев назад
Родитель
Сommit
0303c29e3f

+ 39 - 0
packages/app/src/context/global-sync/child-store.test.ts

@@ -0,0 +1,39 @@
+import { describe, expect, test } from "bun:test"
+import { createRoot, getOwner } from "solid-js"
+import { createStore } from "solid-js/store"
+import type { State } from "./types"
+import { createChildStoreManager } from "./child-store"
+
+const child = () => createStore({} as State)
+
+describe("createChildStoreManager", () => {
+  test("does not evict the active directory during mark", () => {
+    const owner = createRoot((dispose) => {
+      const current = getOwner()
+      dispose()
+      return current
+    })
+    if (!owner) throw new Error("owner required")
+
+    const manager = createChildStoreManager({
+      owner,
+      markStats() {},
+      incrementEvictions() {},
+      isBooting: () => false,
+      isLoadingSessions: () => false,
+      onBootstrap() {},
+      onDispose() {},
+    })
+
+    Array.from({ length: 30 }, (_, index) => `/pinned-${index}`).forEach((directory) => {
+      manager.children[directory] = child()
+      manager.pin(directory)
+    })
+
+    const directory = "/active"
+    manager.children[directory] = child()
+    manager.mark(directory)
+
+    expect(manager.children[directory]).toBeDefined()
+  })
+})

+ 3 - 3
packages/app/src/context/global-sync/child-store.ts

@@ -36,7 +36,7 @@ export function createChildStoreManager(input: {
   const mark = (directory: string) => {
     if (!directory) return
     lifecycle.set(directory, { lastAccessAt: Date.now() })
-    runEviction()
+    runEviction(directory)
   }
 
   const pin = (directory: string) => {
@@ -106,7 +106,7 @@ export function createChildStoreManager(input: {
     return true
   }
 
-  function runEviction() {
+  function runEviction(skip?: string) {
     const stores = Object.keys(children)
     if (stores.length === 0) return
     const list = pickDirectoriesToEvict({
@@ -116,7 +116,7 @@ export function createChildStoreManager(input: {
       max: MAX_DIR_STORES,
       ttl: DIR_IDLE_TTL_MS,
       now: Date.now(),
-    })
+    }).filter((directory) => directory !== skip)
     if (list.length === 0) return
     for (const directory of list) {
       if (!disposeDirectory(directory)) continue