写ydoc在tauri桌面应用上持久化update到文件系统的方案

林一二2023年02月10日 09:58
  1. 监听 ydoc update,通过 tauri command 传到主进程,写入 fs
    1. 写入 fs 后读回来再传回前端后不可用,ydoc 里的 map 无变化
    2. 不需要merge,不需要等待
      1. 如果 yrs 处有 ydoc,则 apply 一个 update 即可√
    3. 确保一开始 new 的 private Workspace 里的 ydoc 有 update 到 yjs 的 ydoc 上
      1. 在 rs 侧初始化 ydoc√
      2. 首先 apply 初始的 update,两边互相 on update apply update
        1. 确保在 blocksuite 初始化 ydoc 前,把 rs 侧初始值 apply 进去√
        2. 可以先序列化出内容,用写死的值试一下
          1. tauri对于下载的支持比较麻烦,需要写一堆样板代码
          2. 可以还原meta信息,正文缺失。可以尝试整个写到sqlite再读回来
            1. 估计是space:60b204fbb1c844eba8137a3400711650doc.guid – "622bf4c8-0986-4123-97ea-e453cc4a5cc6"不同导致的
          3. 尝试在 yrs 侧用这个写死的值,看看能不能读到 meta 信息
            1. 只能用static不能let,但是会allocations are not allowed in statics不能用vec
            2. 改为用函数返回后,成功加载到了 meta 信息,所以在 yjs 侧完整导出后,到 rs 转一趟是可行的
  2. 写一个简单的 yjs yrs 通过 tauri 交互的集成测试
  3. 改为把单个 update 写入 sqlite
    1. 依然不可用,update 里能看到键入的文字,但取出 apply 到 yjs 后 ydoc 里的 map 无变化
  4. 在 tauri command 里访问 state 上的 ydoc 实例,把 update 先写进去再 encode_update_v1
    1. tx.commit() 后,tx.encode_update_v1() 取到的内容还是空的,不可行
    2. 可能是初次创建的 ydoc 内容没加入 new doc 是空的
  5. 通过 MessageReader 解码后 match 分类,只处理 SyncMessage::Update 类别
    1. decoder = DecoderV1::from(&parameters.update[..]) MessageReader::new(&mut decoder) 得到的数据为空,即使 update 有值,不可行
    2. 对这个 ydoc get map 然后 to json,发现内容都是空的,在 yrs 这还是没 update 成功
  6. 直接在 yjs 处 merge update 后,每次 on update 存一个 encode state as update 到 rust 处
    1. 尝试把 update 如 blocksuite playground 上的导出功能那样先序列化出来,手动 apply 回去,看看是否生效,如果这个 update 可用,则直接存这个 update
    2. 完整存储可用,开发模式下可以持久化了
      1. 但是启动时间很长,需要优化排查
        1. 是因为数据库问题卡住了。而且其实只有开发模式会卡半天然后才开,因为开发服务器还在构建产物
      2. 而且打包后启动报错 Failed to create_workspace with error error returned from database: (code: 787) FOREIGN KEY constraint failed
        1. 原因是affine没构建,产物是旧的,补上beforeBuildCommand后解决
      3. yrs依然无法apply update,问下apply 完整update会不会有问题
        1. 可以apply 完整update,不是这个问题
      4. 后续放在打包affine的tauri应用
  7. 尝试改用 Electron,在主线程用 yjs 处理问题

Undefined widget 'supertag-form'