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:
@@ -4,7 +4,7 @@
|
||||
<img src="https://img.shields.io/badge/version-0.8.0-blue?style=flat-square" alt="version">
|
||||
<img src="https://img.shields.io/badge/license-MIT-green?style=flat-square" alt="license">
|
||||
<img src="https://img.shields.io/badge/coverage-90.59%25%20stmts-brightgreen?style=flat-square" alt="coverage">
|
||||
<img src="https://img.shields.io/badge/tests-1980%20passed-success?style=flat-square" alt="tests">
|
||||
<img src="https://img.shields.io/badge/tests-1985%20passed-success?style=flat-square" alt="tests">
|
||||
</p>
|
||||
|
||||
> 基于 TypeScript 的**前端关系型数据库**:完整 SQL + Query Builder 双 API,
|
||||
@@ -91,7 +91,7 @@ npm install @metona-team/metona-sqlark
|
||||
<script src="https://git.metona.cn/MetonaTeam/MetonaSqlark/raw/branch/master/dist/metona-sqlark.min.js"></script>
|
||||
```
|
||||
|
||||
或从 [`dist/`](./dist/) 下载:`metona-sqlark.js`(UMD 开发版)/ `metona-sqlark.min.js`(压缩版:实测 251,109 字节 / gzip 63,145 字节)/ `metona-sqlark.esm.js` / `metona-sqlark.cjs` / `metona-sqlark.d.ts`
|
||||
或从 [`dist/`](./dist/) 下载:`metona-sqlark.js`(UMD 开发版)/ `metona-sqlark.min.js`(压缩版:实测 251,731 字节 / gzip 63,431 字节)/ `metona-sqlark.esm.js` / `metona-sqlark.cjs` / `metona-sqlark.d.ts`
|
||||
|
||||
---
|
||||
|
||||
@@ -423,7 +423,7 @@ const { data, loading, error, refresh } = useSqlarkQuery(db, 'SELECT * FROM user
|
||||
npm install # 安装依赖
|
||||
npm run dev # 开发模式(localhost:3001)
|
||||
npm run build # 生产构建(生成 dist/)
|
||||
npm test # 运行测试(1980 用例 · 92 套件;+4 个重型套件)
|
||||
npm test # 运行测试(1985 用例 · 93 套件;+4 个重型套件)
|
||||
python3 scripts/mutation-b6.py # 变异验证:把 B-6 的修复逐项回退,对应用例必须失败
|
||||
npm run test:e2e # Playwright e2e(真实 Chromium + OPFS + 崩溃注入,需先 build)
|
||||
npm run lint # 代码检查
|
||||
@@ -436,11 +436,11 @@ npm run typecheck # 类型检查
|
||||
|
||||
| 指标 | 数值 |
|
||||
|------|------|
|
||||
| 测试用例 | 1980(92 套件)+ 14 Playwright e2e,另 4 个重型套件在独立 CI job 串行运行 |
|
||||
| 语句覆盖率 | 90.59%(8532/9418) |
|
||||
| 分支覆盖率 | 82.59%(4452/5390) |
|
||||
| 测试用例 | 1985(93 套件)+ 14 Playwright e2e,另 4 个重型套件在独立 CI job 串行运行 |
|
||||
| 语句覆盖率 | 90.59%(8538/9424) |
|
||||
| 分支覆盖率 | 82.61%(4459/5397) |
|
||||
| 函数覆盖率 | 94.14%(1223/1299) |
|
||||
| 行覆盖率 | 93.50%(7727/8264) |
|
||||
| 行覆盖率 | 93.50%(7733/8270) |
|
||||
| SQL 关键字 | 72 |
|
||||
| 存储模式 | 4(`memory` / `disk` / `hybrid` / `aria`) |
|
||||
| 存储后端 | 3(OPFS / KVStore / Memory),Aria 引擎另有 LSM-Tree + WAL + 页面化 |
|
||||
@@ -516,6 +516,13 @@ npm run typecheck # 类型检查
|
||||
> 分片空洞与记录级损坏都会被**显式上报**(恢复报告 + 告警),不做静默截断。
|
||||
>
|
||||
> **多标签页保护**:AriaEngine 通过 Web Locks 获取库级独占锁,第二个标签页打开同一库抛 `ARIA_LOCKED`。
|
||||
>
|
||||
> **OPFS 需要 http(s) 页面**:`aria` + `diskEngine: 'opfs'` 在 **`file://` 直接打开的页面里不可用** ——
|
||||
> Chromium 会以 `SecurityError` 拒绝 `navigator.storage.getDirectory()`(注意此时
|
||||
> `isSecureContext` 仍是 `true`、API 也存在,只有真正调用才会发现)。引擎会抛
|
||||
> `ARIA_OPFS_UNAVAILABLE`,消息里给出两条出路:用本地服务器打开
|
||||
> (`node tests/e2e/server.cjs 3344` → `http://127.0.0.1:3344/...`),或改用
|
||||
> `mode: 'memory'` / KVStore 后端。
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user