Repository navigation
dsh-remote v0.8.25 — 安装心跳:可测的真实日活(去重装机 / 在跑版本 / 平台分布)
安装心跳:可测的真实日活(去重装机 / 在跑版本 / 平台分布)
隐私说明见 README 的「数据采集 / 遥测」一节:每次启动发一次匿名心跳(最少间隔 6 小时),只发送 5 个字段(HMAC 伪名 / 版本 / 平台 / 架构 / Node 版本),原始安装 ID 不离开本机。
升级方式
# npm 用户(推荐)
dsh plugin --profile web add dsh-remote@latest
# 或在设置页 → 更新 处点击「立即更新」
# 若 updateMode=auto(0.8.27 起默认),会自动更新正常升级即可。
本版变更
安装心跳:可测的真实日活(去重装机 / 在跑版本 / 平台分布)
背景:到 0.8.24 为止,"有多少人在用"只能靠代理指标,而且都不成立——
npm 下载量由发版驱动(活跃版本占近周 1955/2078、旧版本地板 ≤21),且日粒度存在
上报缺口(dsh-remote 2026-09 的零值日为 09-03/07/08/15/29/30;用 dsh-better-sidebar
与 dsh-vision-router 对照,零值日完全相同 ⇒ 是 npm 管线缺口,不是真实零使用);
GitHub clone 里混着 CI 与爬虫。这些都无法回答"多少人真的在用、用的哪一版、在哪个平台"。
-
新增每次启动一次的匿名心跳(同安装最少间隔 6 小时),落库到 CloudBase:
dsh_remote_hb_daily(_id = day:idHash,每天每装机一条)+dsh_remote_hb_install
(_id = idHash,装机量/留存)。日活 = 当天文档数,靠确定性_id天然幂等去重,
不用唯一索引以避免竞态。 -
隐私边界(硬约束,写进
lib/telemetry.js顶部注释与 README):
上报字段严格白名单{idHash, version, platform, arch, node};idHash是
HMAC-SHA256('dsh-remote/telemetry/v1', installId)[:32],原始 installId 不离开本机,
服务端无法与其他数据交叉关联。本插件能拿到 SSH 主机/路径/机器列表,这些一律不上报。
测试里有一条断言专门守"请求体不得包含原始 installId"。 -
身份存放位置是刻意的:
<DSH_HOME>/.dsh-remote-install-id(不是插件目录)。
插件目录每次 pnpm 重装都被覆盖,放那里会让同一台机器每次升级都换身份,
把 1 个用户算成 N 个。进程内缓存按身份文件路径分键(同一进程出现第二个
DSH_HOME 时不会串号)——这条是测试抓出来的真 bug。 -
心跳是尽力而为的旁路:
void sendHeartbeat(...),不 await、不阻塞加载、
失败静默;失败时回滚节流,避免一次网络抖动让该身份静默 6 小时,
把"网络不可达"错记成"用户当天没来"。 -
避开启动高峰:首帧 fetch 会因 DSH 启动期并发初始化被饿死
(实测 5s 超时下稳定This operation was aborted,只剩 250~520ms 的端点却发不出去),
故超时放宽到 15s 且首次发送延迟 3s —— 延迟是为了让它成功,不是为了让人等。 -
新增
scripts/stats.mjs:一条命令读出「逐日日活 + 累计装机 + 版本分布 + 平台分布」,
并在输出里直接写明口径提醒(只有装了含心跳版本的安装会上报 ⇒ 首发后前几周
日活会被系统性低估,应配合 npm/GitHub 做总量校准)。 -
配置:无开关,默认开启(按作者要求)。
updateAutoReload等既有配置不变。 -
测试:新增
test/telemetry.test.js(10 例:身份跨进程稳定/坏文件自愈/伪名不等于原始 id/
两安装伪名不同/字段白名单/失败静默且可重试/节流/启动延迟)。全量npm test234/234。
真机端到端:隔离沙箱启动真实 DSH → 云端出现该装机的行,且
HMAC(salt, 本地 id)与云端idHash逐字节吻合(证明上限就是伪名)。