Skip to content

dsh-remote v0.8.25 — 安装心跳:可测的真实日活(去重装机 / 在跑版本 / 平台分布)

Choose a tag to compare

@flymysql flymysql released this 30 Sep 07:00
· 241 commits to main since this release

安装心跳:可测的真实日活(去重装机 / 在跑版本 / 平台分布)

隐私说明见 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 test 234/234。
    真机端到端:隔离沙箱启动真实 DSH → 云端出现该装机的行,且
    HMAC(salt, 本地 id) 与云端 idHash 逐字节吻合(证明上限就是伪名)。


安装:npm install dsh-remote@0.8.25 · npm 页面 · 完整变更记录