fix(site/v0.8.0): 站点版本同步 + 现场失败修复(file:// 打不开 OPFS 的可操作错误)

用户报告"站点演示失败了",实测复现并定位根因:

- 现象:直接双击 site/demo.html(file://)→ 点「🌲 Aria」→
  " 数据库初始化失败: Failed to open AriaEngine database "demo""(Memory 正常)。
- 根因:file:// 属不透明来源,Chromium 拒绝 navigator.storage.getDirectory()
  并抛 SecurityError;此时 isSecureContext 仍为 true、API 也存在,无法提前探测。
  引擎把它包成 ARIA_OPEN_ERROR 时丢掉了底层错误 → 消息对用户不可操作。
- 修复:OPFSBackend.open() 显式检查并抛 ARIA_OPFS_UNAVAILABLE,消息给出两条出路
  (用 http(s) 打开 / 改用 mode:'memory'),原始 SecurityError 挂 cause;
  site/demo.html 额外用中文说明"为什么失败 + 怎么修"。

顺带修掉一个更普遍的问题:DatabaseError 的第三个参数只进 details,err.cause
恒为 undefined,而文档/注释多处写"底层错误作为 cause 保留"。现在两者都成立
(details 语义不变;cause 声明为公开字段并接入标准错误链)。

站点版本同步:demo.html(title / 状态栏 / SQL 预置脚本 / console 日志)与
benchmark.html(title)此前仍是 v0.7.4(日志甚至是 v0.4.2)→ 统一 v0.8.0;
docs.html 的 AriaEngine 版本演进列表补上 v0.8.0 条目、错误码表补
ARIA_OPFS_UNAVAILABLE;README 补"OPFS 需要 http(s) 页面"的浏览器兼容说明。

回归与门禁:tests/engine/aria-opfs-unavailable.test.ts(5 项,含正常环境正控);
变异 R19 / R20 均被拦住(总计 42/42);93 套件 / 1985 用例;覆盖率
90.59 / 82.61 / 94.14 / 93.50(阈值 90/82/94/93);e2e 14/14;lint + 两份 tsc 干净;
dist 重建(251,731 B / gzip 63,431 B)并已同步全部体积宣称。
This commit is contained in:
thzxx
2026-09-15 17:09:29 +08:00
parent 0b44620721
commit c1c3036abd
25 changed files with 439 additions and 55 deletions
+10 -10
View File
@@ -762,7 +762,7 @@ connection-manager/integrations/migration)两份完整报告,以及测试质
**验证**:新增 `tests/v080-sql-three-valued.test.ts` —— 26 条 SQL 语义矩阵 ×
4 引擎(memory/disk/hybrid/aria+ UPDATE/DELETE 写路径,共 **104 断言**
**测试规模**1304 → **1872 通过 / 90 套件**(另 4 个重型套件与 e2e 14 项)。新增:
**测试规模**(B-6 收尾时的**阶段快照**,最终值见附录 I)1304 → **1872 通过 / 90 套件**(另 4 个重型套件与 e2e 14 项)。新增:
`tests/v080-savepoint.test.ts``v080-atomicity.test.ts``v080-subscribe.test.ts`
`v080-correlated.test.ts``v080-sql-three-valued.test.ts`
`v080-unified-validation.test.ts``v080-query-layer.test.ts`
@@ -836,7 +836,7 @@ SSTable / 跨库搬迁),必须在 `save()` 之前补校验**。
- PC-2 真崩溃注入(CDP `Page.crash`+ OPFS `createWritable` 的两个写入窗口;
- `FaultyBackend` 字节级故障注入(撕裂/bit-flip/掉电/写失败);
- **变异验证**成为回归套件的标准做法:把修复回退到修复前的行为,对应用例
必须失败。本轮 A15/A13/A38/A39 与 **B-6 全量 + 审查轮共 40 项**均通过该检查(可执行脚本
必须失败。本轮 A15/A13/A38/A39 与 **B-6 全量 + 审查轮共 42 项**均通过该检查(可执行脚本
`scripts/mutation-b6.py`,逐项打印"变异是否被拦住")——
这是"测试真能拦住回归"与"测试只是陪跑"的分界线。
- 测试介质的两处**忠实性**缺陷已被修正(`SharedMemoryBackend` 跨实例可见性、
@@ -883,7 +883,7 @@ SSTable / 跨库搬迁),必须在 `save()` 之前补校验**。
| `src/engine/aria/index/merge_iterator.ts` | 胜出来源的补充推迟到下一次 `next()`(提前终止不多算) |
| `src/engine/aria/wal/checkpoint.ts` | checkpoint 只落 memtable`flushMemtables?`),不等 compaction |
| `tests/v080-b6-single-commit-point.test.ts` | 上述每一条的回归 + manifest 严格校验表驱动 **24** 例;v0.8.0 审查后扩到 **96 项**(新增事务水位 P0、前缀空洞语义、在途读者与退休文件、孤儿回收门槛、稀疏/损坏分支、形状校验等)|
| `scripts/mutation-b6.py` | **40 项**变异验证(B-6 的 22 项 + 审查轮的 18 项),全部被对应用例拦住;脚本自带正控、编译失败区分、超时、逐字节恢复校验与进程锁(见 CONTRIBUTING|
| `scripts/mutation-b6.py` | **42 项**变异验证(B-6 的 22 项 + 审查轮的 20 项),全部被对应用例拦住;脚本自带正控、编译失败区分、超时、逐字节恢复校验与进程锁(见 CONTRIBUTING|
### H.2 提交顺序(唯一不变量)
@@ -924,7 +924,7 @@ __aria_manifest_<gen> 提交(单文件原子写 + 回读校验)
# 1) B-6 回归(96 项)
npx jest tests/v080-b6-single-commit-point.test.ts
# 2) 变异验证:把每个修复回退到修复前行为,对应用例必须失败(40 项)
# 2) 变异验证:把每个修复回退到修复前行为,对应用例必须失败(42 项)
python3 scripts/mutation-b6.py
# 3) 随机压力 / 检查点崩溃恢复(发现缺陷 1 的套件)
@@ -934,8 +934,8 @@ npx jest tests/engine/aria-repair-hardening.test.ts tests/engine/aria-kv-backend
npx jest --testPathIgnorePatterns='/node_modules/|/tests/e2e/|aria-prod-load|kvstore-stress|aria-matrix-audit|aria-idx-flush-race'
```
**实测数字**(审查轮收尾复测,详见附录 I):常规套件 **1980 通过 / 92 套件**
覆盖率 语句 90.59% / 分支 82.59% / 函数 94.14% / 行 93.50%(阈值 90/82/94/93,全部通过);
**实测数字**(审查轮收尾复测,详见附录 I):常规套件 **1985 通过 / 93 套件**
覆盖率 语句 90.59% / 分支 82.61% / 函数 94.14% / 行 93.50%(阈值 90/82/94/93,全部通过);
e2e 14/14;变异验证 **40/40** 被拦住。
**恢复报告**`engine.getRecoveryReport()` 返回
@@ -1009,7 +1009,7 @@ e2e 14/14;变异验证 **40/40** 被拦住。
MVCC 快照隔离(docs.html ×3 + demo.html + `mvcc.ts` 文件头)、`backup()`
"一致性快照"`interface.ts` 注释)、"空洞检测截断"、"~105KB / gzip ~27KB"
(实测 251,109 字节 / gzip 63,145 字节)、测试与覆盖率数字(README badge/正文、site 徽标与数字卡、
(实测 251,731 字节 / gzip 63,431 字节)、测试与覆盖率数字(README badge/正文、site 徽标与数字卡、
CHANGELOG)、"5 种存储引擎"(→ 4 模式 + 3 后端)、"Tree-shakable"(→ 多格式输出)、
错误码表缺 **16 个**码、CONTRIBUTING 变异数量(17 → 40)、PLAN 附录 G 的
"12 项事故级"(→ 11 项,A1~A11)、G4"零丢失"(限定为矩阵覆盖范围内)、
@@ -1029,16 +1029,16 @@ npx jest tests/v080-b6-single-commit-point.test.ts tests/engine/aria-wal-segment
# 2) 全量常规套件(不含重型与 e2e)
npx jest --testPathIgnorePatterns='/node_modules/|/tests/e2e/|aria-prod-load|kvstore-stress|aria-matrix-audit|aria-idx-flush-race'
# → 92 套件 / 1980 用例全绿
# → 93 套件 / 1985 用例全绿
# 3) 覆盖率(与 CI 常规 job 完全相同的命令)
npx jest --coverage --coverageReporters=text-summary --testPathIgnorePatterns='/node_modules/|/tests/e2e/|aria-prod-load|kvstore-stress|aria-matrix-audit|aria-idx-flush-race'
# → Statements 90.59% / Branches 82.59% / Functions 94.14% / Lines 93.50%(阈值 90/82/94/93
# → Statements 90.59% / Branches 82.61% / Functions 94.14% / Lines 93.50%(阈值 90/82/94/93
# 4) e2e(真实 Chromium + 真实 OPFS + CDP Page.crash
npx playwright test # → 14/14
# 5) 变异验证(40 项;脚本自带正控、编译失败区分、超时、逐字节恢复校验、进程锁)
# 5) 变异验证(42 项;脚本自带正控、编译失败区分、超时、逐字节恢复校验、进程锁)
python3 scripts/mutation-b6.py # → 40/40 全部被拦住
# 6) 静态门禁