chore: sync worktree changes - update protocols, trellis workspace, and config
This commit is contained in:
@@ -12,28 +12,29 @@
|
||||
|
||||
### 1) 作用域级别
|
||||
|
||||
- `anonymous`:未登录态(或未绑定用户上下文)
|
||||
当前实现仅启用以下作用域:
|
||||
|
||||
- `user:<user_id>`:已登录用户态
|
||||
|
||||
未登录态实现说明:
|
||||
|
||||
- `apps/lib/app/services/session_scope_manager.dart` 在登出后会调用 `CacheScope.resetProvider()`。
|
||||
- 当 provider 未配置时,`apps/lib/data/cache/cached_repository.dart` 会跳过 scoped cache 读写,而不是写入 `anonymous` 命名空间。
|
||||
|
||||
### 2) 键格式
|
||||
|
||||
客户端持久缓存最终键必须按以下格式生成:
|
||||
|
||||
`cache:<scope>:<feature-key>`
|
||||
|
||||
其中 `<scope>` 可以附带会话代际后缀(推荐):
|
||||
当前实现未使用会话代际后缀(epoch/version token),最终键格式为:
|
||||
|
||||
- `user:<user_id>:v<epoch>`
|
||||
- `anonymous:v<epoch>`
|
||||
|
||||
该后缀用于切号并发场景,确保旧会话异步回写落在旧命名空间。
|
||||
- `cache:user:<user_id>:<feature-key>`
|
||||
|
||||
示例:
|
||||
|
||||
- `cache:user:8ef4...:chat:history:first:default`
|
||||
- `cache:user:8ef4...:v12:chat:history:first:default`
|
||||
- `cache:user:8ef4...:v12:calendar:day:2026-03-29`
|
||||
- `cache:anonymous:v13:inbox:list:all`
|
||||
- `cache:user:8ef4...:calendar:day:2026-03-29`
|
||||
|
||||
---
|
||||
|
||||
@@ -47,18 +48,18 @@
|
||||
### 应用层(必须)
|
||||
|
||||
- 在认证状态变化时更新当前缓存作用域:
|
||||
- 登录成功 -> `user:<user_id>`
|
||||
- 登出/失效 -> `anonymous`
|
||||
- 登录成功 -> `user:<user_id>`
|
||||
- 登出/失效 -> 清空当前用户作用域并重置 provider(不进入 `anonymous` 作用域)
|
||||
|
||||
---
|
||||
|
||||
## 并发与切号安全
|
||||
|
||||
- 切号后,旧账号异步请求结果不得回写到新账号 UI 状态。
|
||||
- 推荐使用会话代际(epoch/token)保护异步回写。
|
||||
- 缓存分区与 UI 状态隔离必须同时存在:
|
||||
- 仅有分区,无代际保护:仍可能出现瞬时回流显示。
|
||||
- 仅有代际保护,无分区:仍可能读取到旧持久缓存。
|
||||
- 当前实现依赖 `user:<user_id>` 级别缓存分区 + 认证切换时清理上一用户前缀:
|
||||
- - 登录切换:清理上一用户 `cache:user:<old_user_id>:` 前缀
|
||||
- - 登出:清理当前用户前缀并关闭 scoped cache 读写
|
||||
- 当前实现未引入 epoch/token 代际保护;若未来出现“切号后旧请求晚到并覆盖新 UI”问题,需要另行升级协议与实现。
|
||||
|
||||
---
|
||||
|
||||
@@ -67,7 +68,7 @@
|
||||
### 向后兼容
|
||||
|
||||
- 旧无作用域键允许保留在本地存储中,不参与新读取路径。
|
||||
- 新版本只读取带 `cache:<scope>:` 前缀的键。
|
||||
- 新版本只读取带 `cache:user:<user_id>:` 前缀的键。
|
||||
|
||||
### 迁移方式
|
||||
|
||||
@@ -79,5 +80,12 @@
|
||||
## 验收标准
|
||||
|
||||
1. 同设备 A/B 账号来回切换,不出现跨账号历史/列表串读。
|
||||
2. 登录后首次读取命中当前用户作用域键;登出后读取命中匿名作用域键。
|
||||
2. 登录后首次读取命中当前用户作用域键;登出后 scoped cache 不再参与读取。
|
||||
3. Feature 仓库不再自行实现 userId 拼 key 逻辑。
|
||||
|
||||
---
|
||||
|
||||
## Compatibility Strategy
|
||||
|
||||
- 策略:`backward-compatible`
|
||||
- 本次为文档对齐更新,收敛未落地的 `anonymous`/epoch 设计,不改变现有应用行为。
|
||||
|
||||
Reference in New Issue
Block a user