- 渲染管线迁移至 MetonaEditor 内置解析器,移除 unified/rehype 全家桶(9 个依赖) - 修复相对路径图片修复的目录前缀碰撞与路径解析 bug - ConfirmDialog/useConfirm/LoadingSpinner/useDocStats 移除,改用 MeToast.confirm/loading/promise - 新增状态栏(字数/行数/阅读时间/光标位置)、Zen 模式、数据备份导出导入 - Sqlark: 版本化迁移(addMigration/migrateTo)、subscribe 表变更、备份 exportAll/importTable - 数据库损坏自愈:异常退出残留残缺 SSTable 导致打开失败时自动重建 - 大纲导航改用 scrollToLine 官方 API - 修复 rollup 平台包互删(postinstall 自动补齐)+ 集成测试(fake-indexeddb)
42 lines
1.9 KiB
JavaScript
42 lines
1.9 KiB
JavaScript
import 'fake-indexeddb/auto'
|
|
import { create } from '/mnt/d/CodeWorkspace/MarkLite/node_modules/@metona-team/metona-sqlark/dist/metona-sqlark.esm.js'
|
|
|
|
const DB = 'aria-heal-test'
|
|
|
|
// 1. 正常建库写数据
|
|
const db1 = await create({ name: 'heal-test', mode: 'aria', diskEngine: 'indexeddb', version: 0 })
|
|
await db1.defineTable('recentFiles', { filePath: { type: 'string', primaryKey: true }, lastOpened: { type: 'number' } })
|
|
await db1.table('recentFiles').insert({ filePath: '/a.md', lastOpened: 1 })
|
|
await db1.close()
|
|
|
|
// 2. 制造损坏:写一个 footer 声称块偏移在 100000 的残缺 sst 文件(data store 里直接塞坏数据)
|
|
await new Promise((resolve, reject) => {
|
|
const req = indexedDB.open(DB, 1)
|
|
req.onsuccess = () => {
|
|
const idb = req.result
|
|
const tx = idb.transaction('data', 'readwrite')
|
|
const store = tx.objectStore('data')
|
|
// 残缺 sst:8 字节(正常是 4096 块),meta 记录会声称偏移 4096+
|
|
store.put(new ArrayBuffer(8), 'sst_1')
|
|
tx.oncomplete = () => { idb.close(); resolve() }
|
|
tx.onerror = () => reject(tx.error)
|
|
}
|
|
req.onerror = () => reject(req.error)
|
|
})
|
|
|
|
// 3. 删除损坏库(模拟自愈,无活动连接时应该成功)
|
|
await new Promise((resolve) => {
|
|
const req = indexedDB.deleteDatabase(DB)
|
|
req.onsuccess = () => { console.log('deleteDatabase OK'); resolve() }
|
|
req.onerror = () => { console.log('deleteDatabase error'); resolve() }
|
|
req.onblocked = () => { console.log('deleteDatabase BLOCKED'); resolve() }
|
|
})
|
|
|
|
// 4. 重建库成功
|
|
const db2 = await create({ name: 'heal-test', mode: 'aria', diskEngine: 'indexeddb', version: 0 })
|
|
await db2.defineTable('recentFiles', { filePath: { type: 'string', primaryKey: true }, lastOpened: { type: 'number' } })
|
|
await db2.table('recentFiles').insert({ filePath: '/new.md', lastOpened: 2 })
|
|
console.log('rebuilt rows:', JSON.stringify(await db2.table('recentFiles').select().execute()))
|
|
await db2.close()
|
|
console.log('HEAL OK')
|