dsh-cindy-host 0.1.22 → 0.1.23
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.
- package/CHANGELOG.md +13 -0
- package/package.json +1 -1
- package/src/cindy-channels.js +9 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,19 @@
|
|
|
3
3
|
本文件记录**用户可见**的变化与**每次发布验证过的 DSH 版本**。格式遵循
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),版本号遵循语义化版本。
|
|
5
5
|
|
|
6
|
+
## [0.1.23] - 2026-10-14
|
|
7
|
+
|
|
8
|
+
### Fixed
|
|
9
|
+
|
|
10
|
+
- 手机删除已不存在的 DSH 会话时,在删除标记持久化成功后返回最小删除确认,重复删除也成功,避免手机因 NOT_FOUND 回滚而留下幽灵任务。
|
|
11
|
+
- 仅放宽纯删除元数据请求(可同时取消置顶);归档、重命名和混合编辑仍保留 NOT_FOUND。保存或读取失败不冒充删除成功,不伪造完整会话。
|
|
12
|
+
|
|
13
|
+
### 验证
|
|
14
|
+
|
|
15
|
+
- 完整测试:770 通过 / 3 跳过 / 0 失败;另设置 CINDY_SOURCE_ROOT 补跑其中 2 项真实双端契约测试,均通过。剩余跳过项为需显式启用的 11 分钟慢上传测试。
|
|
16
|
+
- 通道审计:54 served / 142 declined / 0 unclassified。干净 DSH 0.2.0-rc.2 隔离 profile 加载 tarball 成功,HTTP 连续两次删除不存在会话均返回成功;未构建原生凭据依赖,未登录账号。
|
|
17
|
+
- 旧版整体验收 67/77:存在账号/历史数据前置条件缺失及旧协议断言,不计为全绿。用户明确接受本次专项验证范围后发布;手机端实测及真实宿主重启生效仍需单独确认。
|
|
18
|
+
|
|
6
19
|
## [0.1.22] - 2026-10-03
|
|
7
20
|
|
|
8
21
|
### Fixed
|
package/package.json
CHANGED
package/src/cindy-channels.js
CHANGED
|
@@ -1041,6 +1041,7 @@ export function createChannelRouter({
|
|
|
1041
1041
|
wrote = true;
|
|
1042
1042
|
}
|
|
1043
1043
|
|
|
1044
|
+
let deleteAcknowledgement;
|
|
1044
1045
|
const writesMeta = patch.status !== undefined || patch.pinnedAt !== undefined;
|
|
1045
1046
|
if (writesMeta) {
|
|
1046
1047
|
const applyFlags = capabilities.applySessionFlags;
|
|
@@ -1053,6 +1054,13 @@ export function createChannelRouter({
|
|
|
1053
1054
|
const echoed = {};
|
|
1054
1055
|
if (patch.status !== undefined) echoed.status = applied.status;
|
|
1055
1056
|
if (patch.pinnedAt !== undefined) echoed.pinnedAt = applied.pinnedAt;
|
|
1057
|
+
// Deleting an already absent source session is still a successful hide once
|
|
1058
|
+
// its flags are saved. The phone needs only the fields it wrote; do not
|
|
1059
|
+
// fabricate a full session or extend this acknowledgement to mixed edits.
|
|
1060
|
+
if (patch.status === 'deleted' && applied.status === 'deleted'
|
|
1061
|
+
&& Object.keys(patch).every((key) => key === 'status' || key === 'pinnedAt')) {
|
|
1062
|
+
deleteAcknowledgement = { id: sessionId, ...echoed };
|
|
1063
|
+
}
|
|
1056
1064
|
if (typeof capabilities.publishSessionMeta === 'function') capabilities.publishSessionMeta(sessionId, echoed);
|
|
1057
1065
|
}
|
|
1058
1066
|
|
|
@@ -1061,6 +1069,7 @@ export function createChannelRouter({
|
|
|
1061
1069
|
// unchanged row as "revert my edit" (that is how these buttons looked dead once already).
|
|
1062
1070
|
if (wrote) invalidateSessionRows();
|
|
1063
1071
|
const row = await sessionRow(sessionId);
|
|
1072
|
+
if (row === undefined && deleteAcknowledgement !== undefined) return invokeResult(request, deleteAcknowledgement);
|
|
1064
1073
|
return row === undefined ? invokeError(request, 'NOT_FOUND', `No DSH session ${sessionId}`) : invokeResult(request, row);
|
|
1065
1074
|
}
|
|
1066
1075
|
|