Skip to content

MemoryDriver 持久化能力:磁盘文件/LocalStorage 支持 #815

@hotlong

Description

@hotlong

需求背景

当前 @objectstack/driver-memory 仅支持纯内存数据,无法在开发与浏览器模式下实现数据持久化,导致进程重启、页面刷新或热重载时所有数据丢失。对开发体验和 UED 流程形成阻碍。

主要目标:

  • 支持在 Node.js 环境下通过磁盘文件自动保存和恢复内存数据库。
  • 支持在浏览器环境下通过 localStorage 自动保存和恢复内存数据库。
  • 允许用户无感配置,即"配置字符串"自动切换对应 Adapter。
  • 不考虑 IndexDB,后者未来通过单独 driver 实现。

详细需求

  1. 统一持久化入口:

    • 在 InMemoryDriverConfig 增加 persistence 配置项。
    • 新增 type union: 'file' | 'local' | { type: 'file', path?: string } | { type: 'local', key?: string } | { adapter: PersistenceAdapter }
    • 默认情况下不启用持久化(纯内存,行为不变)。
  2. 文件适配器(Node.js 环境):

    • 实现 FileSystemPersistenceAdapter:以 JSON 格式序列化 this.db,保存到磁盘文件。
    • 路径和文件名可配置,默认 .objectstack/data/memory-driver.json
    • 支持原子写(写 temp 文件再 rename)。
    • 启动时自动 load 恢复。
    • CRUD/批量写时自动 dirty 标记,定时(如 2s) autosave。
    • 需有 flush() 方法和 disconnect 生命周期钩子确保安全关闭。
  3. localStorage 适配器(浏览器环境):

    • 实现 LocalStoragePersistenceAdapter:用 localStorage.getItem/setItem/JSON.stringify 保存完整 db。
    • key 可配置,默认 objectstack:memory-db
    • 刷新或关闭页面时自动恢复。
    • 小于 5MB 上限,超限可警告。
    • 不需要异步逻辑或大数据管理。
  4. 接口/配置一致性:

    • persistence: 'file' 自动在 Node.js 下选择 FileSystemAdapter。
    • persistence: 'local' 自动在浏览器下选择 localStorageAdapter。
    • 对调用者完全透明,旧接口代码零破坏。
  5. 配置示例:

    // Node.js
    new InMemoryDriver({ persistence: 'file' })
    // 浏览器
    new InMemoryDriver({ persistence: 'local' })
    // 纯内存
    new InMemoryDriver()
  6. 兼容性与降级:

    • 非 Node.js 环境配置 file 时抛出清晰错误。
    • 非浏览器环境配置 local 时抛出清晰错误。
    • 清晰注释/文档
  7. 文档与测���:

    • 用例覆盖:纯内存、文件、localStorage 3 种场景。
    • 断言数据可恢复、变更可保存。
    • 文档/README/TypeDoc 配置说明。
  8. 不包含:

    • IndexedDB 相关实现/适配。
    • 持久化跨 Tab 同步能力。
    • 多用户隔离/安全。

相关影响

  • objectstack.config.ts、MSW/Storybook/browser.ts、CLI 默认使用推荐配置。
  • .gitignore 默认忽略 .objectstack/data/

  • 核心实现方案评审
  • 配置项与 API 设计完成
  • Adapter 开发(文件/LocalStorage)
  • dev/测试用例/文档

Metadata

Metadata

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions