dsh-session-keepwarm

DSH 0.1.7 引入了基于引用计数的会话管理机制:主视图切换会话时会释放旧会话的引用,当引用计数归零,该会话的 generation(包含本地数据、作用域 Context 和历史窗口)会被销毁。切回该会话时,系统会重建一个新的 generation 并重新拉取历史记录(至少 50 条消息),这会导致界面显示“Loading history…”。

dsh-session-keepwarm 插件通过为最近使用过的会话持有额外的引用,防止其被销毁。切回这些会话时,可以直接复用内存中已加载的历史窗口,避免重复读取。该插件实现了一个基于 keepWarm 设置的 LRU(最近最少使用)缓存,在减少历史重读的同时控制内存占用。

基本信息

  • 名称:dsh-session-keepwarm
  • 作者:dzwalker
  • 分类:记忆
  • 许可证:MIT

核心功能

  1. 持有额外引用:为最近使用过的会话持有额外的引用,确保其不会因为引用计数归零而被销毁。
  2. 复用历史窗口:切回已保活的会话时,复用内存中已有的历史窗口。由于 Session.open() 对已打开会话是幂等的,因此不会再次拉取历史。
  3. LRU 缓存:实现了一个 LRU 缓存,上限由 keepWarm 设置决定,防止无限占用内存。
  4. 会话监控:监控 sessions.list 快照,当检测到会话被切换到时,将其移动到 LRU 队列头部。
  5. 仅支持普通会话:只处理普通会话;子代理行有自己的生命周期管理,不受此插件影响。
  6. 轻量级保活:只保活客户端本地数据和历史流,不会启动或持有 Host Agent。

安装与启用

通过以下命令安装插件:

dsh plugin --profile web add dsh-session-keepwarm

安装后,在对应的 profile 中启用该插件。

配置与使用

插件的配置项定义在 session-keepwarm profile 条目下:

配置项 默认值 说明
enabled true 总开关。设为 false 会释放所有被保活的引用。
keepWarm 5 保活最近使用会话的数量。范围通常为 1 到 20。值越大,占用浏览器内存越多。

适用场景与限制

  1. 仅限同标签页:该插件只对同一个标签页内的会话状态有效。客户端不在标签页或浏览器之间共享会话状态(无 SharedWorker 或 BroadcastChannel),因此新窗口或新浏览器打开会话时仍需重新加载历史。
  2. 首次打开仍需加载:即使会话被保活,第一次在任何标签页打开该会话时,仍然需要加载历史记录。保活只影响“切走之后切回来”的场景。
  3. 退出条件:这是一个临时方案。如果上游 DSH 客户端添加了原生的“保留最近 N 个会话”设置或等价的延迟销毁策略,应优先使用上游设置并移除此插件。

总结

dsh-session-keepwarm 通过简单的引用计数补充,解决了 DSH 0.1.7+ 版本中会话切换时的历史重读问题。它适合需要频繁在多个会话间切换以减少历史加载延迟的用户,但需注意其内存占用与同标签页的限制。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜