dsh-unlag 1.9.119 → 1.9.121

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/EVIDENCE.md +46 -0
  2. package/README.md +15 -0
  3. package/package.json +2 -1
package/EVIDENCE.md ADDED
@@ -0,0 +1,46 @@
1
+ # 凭什么信这个插件
2
+
3
+ 每一类说法都跟着能自己重跑的证据:先看哪条测试、再看运行中的 App 上哪个输出。运行中的证据用 `npm run live-smoke` 拿,它不按按钮,也从不换代码。
4
+
5
+ ## 按下去真的会生效
6
+
7
+ | 说法 | 测试 | 现场 |
8
+ | --- | --- | --- |
9
+ | 一次按下只请求一次重建,连按只算一次 | `press.test.mjs`(99)、`reload-answer.test.mjs`(26) | `pressPath.ready` 为 `true` 表示此刻放行 |
10
+ | 重建后新文档能起来:清单里每个脚本都能加载、每个插件都注册 | `bundle-shim.test.mjs`(76)、`host-verify.test.mjs`(45) | `verify.sound=ok`、`rehearsal.ok=true` |
11
+ | 坏清单会被拒,不会带着坏字节去开新文档 | `host-verify.test.mjs`(45)、`verify-deadline.test.mjs`(7)、`url-fuzz.test.mjs`(5) | `verify.broken=blocked`、`verify.refuses=true` |
12
+ | 冻结清单里的旧 revision 仍然拿得到现在的字节 | `bundle-shim.test.mjs`(76) | `shim.staleRev` 为 200 且字节数 > 0 |
13
+ | 按钮不会装作在工作:挡住时提示写的是真实原因 | `reason-copy.test.mjs`(6)、`copy.test.mjs`(8)、`client-guard.test.mjs`(123) | 每次拦下都在日志里留一行,带原因与地址 |
14
+
15
+ ## 不会把 App 弄崩
16
+
17
+ | 说法 | 测试 |
18
+ | --- | --- |
19
+ | 任何插件、任何服务、任何路由抛错都只丢一个答案,不往上冒 | `hostile-services.test.mjs`(20)、`route-hostile.test.mjs`(30)、`route-guard.test.mjs`(16)、`hostile-host.test.mjs`(12)、`safety.test.mjs`(22) |
20
+ | 文件监听器出错、日志写不出去、日志爆量都只是少一行记录 | `watch-faults.test.mjs`(11)、`log-faults.test.mjs`(17)、`log-burst.test.mjs`(3)、`log-cap.test.mjs`(9) |
21
+ | 慢插件、卡住的读取、并发按下都不会拖住页面或进程 | `reload-late.test.mjs`(10)、`verify-deadline.test.mjs`(7)、`verify-route.test.mjs`(19) |
22
+ | 卸载插件时半开的定时器、监听、路由全部关掉,且不误关别人的 | `button.test.mjs`(89)、`client-guard.test.mjs`(123) |
23
+ | 8 个历史版本的页面(旧代码)对着新宿主按,都不抛、都只请求一次重建、都不留失败提示 | `old-page.test.mjs`(5) |
24
+
25
+ ## 别人不能替你按
26
+
27
+ | 说法 | 测试 | 现场 |
28
+ | --- | --- | --- |
29
+ | 别的源的页面按不动这个按钮 | `button-origin.test.mjs`(25)、`request-shape.test.mjs`(6) | `contract` 里三条外来源请求全部 403 |
30
+ | 读路由只认读,写路由要那个页面才能带的头 | `report-route.test.mjs`(8)、`route-hostile.test.mjs`(30) | `contract` 里缺头、乱方法全部 403/405 |
31
+ | 域名重绑(Host 与 Origin 一致但都是公网名)不能用,公网名的页面一律 403 | `button-origin.test.mjs`(25) | 手工 curl 复核过一次:403 |
32
+
33
+ ## 证据怎么重跑
34
+
35
+ ```sh
36
+ npm test # 726 项,全绿才算数
37
+ npm run audit # 静态检查
38
+ npm run live-smoke # 对着运行中的 App 复核;输出里 verdict 为 true 才算数
39
+ ```
40
+
41
+ 演练输出里的每一项含义见 README「改完后让运行中的 App 用上」。
42
+
43
+ ## 还没证到的两件事
44
+
45
+ - **人手按下的那一下**:只有人按才会真的换插件代码,这台机器上最后一次真按是 1.9.30。`pressPath.ready` 证明的是「此刻按下去会被接受」,不是「按过了」。
46
+ - **日志轮转在真实 App 里发生**:真实日志还不到上限的一半,轮转只有离线测试(`log-cap.test.mjs`)证过,没在现场触发过。
package/README.md CHANGED
@@ -77,6 +77,21 @@ dsh plugin install dsh-unlag
77
77
  - 状态:`GET /dsh-unlag/state` → `{"version":"<当前版本>","code":"<index.js 写入时间>","plugins":true,"page":true,"shim":{...}}`。`code` 用来分清「版本号没刷」和「旧代码真的还在跑」。
78
78
  - 重建后的日志带起页面代次:`interface rebuilt; the page runs the plugins as served now (page <rev>)`,据此判断新文档加载的是新脚本还是旧脚本。
79
79
 
80
+ 每类说法对应的测试与现场输出整理在 [EVIDENCE.md](EVIDENCE.md),含还没证到的两件事。
81
+
82
+ ## 与官方文档的对照
83
+
84
+ 判定按下后能不能重建,依赖的是 Client Modules 的读接口和它自己公布的路由规则。逐条核对的是 App 内随包发布的文档 `.research/asar-dsh/dsh-client-modules/README.zh.md`(15968 B,sha256 前缀 `33cee13e7b61a151`)。
85
+
86
+ | 官方规则(该文档行) | 这里的做法 | 为什么 |
87
+ | --- | --- | --- |
88
+ | 未知资源或 revision 返回 404(80) | 冻结的启动清单里的行,旧 revision 照样给现在的字节;表里已经没有的插件仍然 404 | 桌面壳从启动时读到的清单重启文档,任何一行 404 都会让壳以退出码 1 结束,正在跑的会话随之死掉。只在「这一行确实还在表里」时接管,别的 404 原样放行 |
89
+ | 启动图与批次 URL 是应用目录相对形式(80) | 校验时按同样形式(`plugins/??…&rev=…`)读,相对路径补前导 `/` 后再取 | 与文档一致,避免把文档相对形式当绝对路径 |
90
+ | 每个阶段在 URL 超过 3 KiB 前分区(80) | 一行超过 8 KiB 就拒检(`blocked/list`) | 官方既然在 3 KiB 前分区,真实启动行就短于 3 KiB(这台机器实测最长 2834 B),8 KiB 只挡伪造清单,不会误拒正常行 |
91
+ | revision 由 mtime/ctime/大小派生,不哈希内容(80、136) | 只用官方读接口拿到的 revision,不自己算版本;比对的是正文里注册的插件 id | 哈希会引入一套自己的代际,和官方的 404 规则打架 |
92
+ | bundle 内容变更只能通过 `rebuilt()` 进入图(78) | 不调用 `rebuilt()` | 调了会让运行中的页面就地换模块,草稿和正在跑的任务受影响;这里只换宿主侧代码,页面由人来按按钮重开 |
93
+ | 图更新在同一个 Loader 上串行执行(90) | 重建走宿主自己的插件重载,不自己改 Loader | 自己改会和官方协调逻辑冲突,这是不能碰的那层 |
94
+
80
95
  ## 改完后让运行中的 App 用上
81
96
 
82
97
  不用重启 App,也不用重启页面:换掉 `index.js` 后让插件的记录重载一次即可。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-unlag",
3
- "version": "1.9.119",
3
+ "version": "1.9.121",
4
4
  "type": "module",
5
5
  "description": "A press applies plugin edits right away and brings a laggy interface back; automatic reloading stays off unless you turn it on, so the press is the only trigger, and nothing restarts.",
6
6
  "license": "MIT",
@@ -17,6 +17,7 @@
17
17
  "locale/*.json",
18
18
  "scripts/live-smoke.mjs",
19
19
  "README.md",
20
+ "EVIDENCE.md",
20
21
  "icon.svg"
21
22
  ],
22
23
  "keywords": [