Conversation
There was a problem hiding this comment.
Pull request overview
该 PR 聚焦修复 packages/filesystem 在云同步场景下的两个关键稳定性问题:认证失效后的错误 token 回退/恢复,以及多设备重复删除导致的非幂等失败;并补齐对应的单测覆盖。
Changes:
- 修复
AuthVerify():token 过期/失效时 refresh 失败不再回退旧 token,而是直接抛错暴露真实认证问题。 - 统一增强 OneDrive / Google Drive / Dropbox 的 request 认证恢复逻辑(401 自动刷新并重试),并让删除在目标不存在时幂等成功(404 / not_found 视为成功)。
- 新增/补充 Vitest 用例覆盖 token 刷新与幂等删除行为。
Reviewed changes
Copilot reviewed 10 out of 10 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| packages/filesystem/auth.ts | token 过期/失效时 refresh 失败改为抛错,避免回退旧 token 掩盖认证问题 |
| packages/filesystem/auth.test.ts | 新增 AuthVerify 的“过期 refresh 失败不回退”与“未过期不刷新”测试 |
| packages/filesystem/onedrive/onedrive.ts | request 支持 401 刷新并返回重试结果;delete 对 404 幂等成功 |
| packages/filesystem/onedrive/onedrive.test.ts | 新增 OneDrive request 刷新后返回重试结果、delete 404 幂等测试 |
| packages/filesystem/googledrive/googledrive.ts | request 统一先按 HTTP 状态处理并支持 401 刷新;delete 对缺失/404 幂等 |
| packages/filesystem/googledrive/googledrive.test.ts | 新增 GoogleDrive delete 幂等(fileId 缺失 / 404)测试 |
| packages/filesystem/dropbox/dropbox.ts | request 增加 401 刷新重试;delete 对 not_found 幂等成功;header 用 set() |
| packages/filesystem/dropbox/dropbox.test.ts | 新增 Dropbox delete not_found 幂等测试 |
| packages/filesystem/webdav/webdav.ts | WebDAV delete 对 404 幂等成功 |
| packages/filesystem/webdav/webdav.test.ts | 补充 WebDAV delete 404 幂等测试 |
Comments suppressed due to low confidence (1)
packages/filesystem/onedrive/onedrive.ts:145
- delete() 的返回类型是 Promise,但最后
return resp;实际返回了值(且 resp 在此处也不会被调用方使用)。建议改为直接return;/移除该 return 表达式,避免误导调用方并让实现与签名一致。
if (resp.status !== 204) {
throw new Error(await resp.text());
}
return resp;
}
| beforeEach(async () => { | ||
| vi.clearAllMocks(); | ||
| await chrome.storage.local.clear(); | ||
| }); |
There was a problem hiding this comment.
这里用 vi.stubGlobal("fetch", ...) 覆盖了全局 fetch,但没有在用例结束后恢复,可能导致其它测试用例受到污染(同仓库里如 packages/filesystem/s3/client.test.ts 会在 afterEach 里 vi.unstubAllGlobals)。建议在本 describe 增加 afterEach 调用 vi.unstubAllGlobals()(或保存原 fetch 并恢复),确保测试隔离。
| beforeEach(async () => { | ||
| vi.clearAllMocks(); | ||
| await chrome.storage.local.clear(); | ||
| }); |
There was a problem hiding this comment.
该文件通过 vi.stubGlobal("fetch", fetchMock) 注入全局 fetch,但没有在用例结束后 unstub,可能污染同一测试进程中的其他 suite。建议补充 afterEach(() => vi.unstubAllGlobals())(或在 beforeEach 里先 unstub)来保证测试隔离。
- auth.test.ts / onedrive.test.ts 增加 afterEach 恢复原 fetch,
避免 stubGlobal("fetch") 泄漏到其它测试套件。
- 不使用 vi.unstubAllGlobals():会连带移除 setup 中注入的全局
chrome mock,导致后续用例 chrome 未定义。
- onedrive.delete() 移除多余的 return resp;,与 Promise<void> 签名一致。
背景
云同步场景下,
packages/filesystem这层直接决定了“认证失效后是否能恢复”和“多设备重复删除是否会被误判成失败”。这次修正聚焦两类高风险问题:
本次修改只处理高价值、低歧义、可验证的问题,不扩大到更大范围的重构。
修正重点
1. 修复
AuthVerify()在 token 过期后错误回退旧 token 的问题修改文件
packages/filesystem/auth.ts问题
修正
意义
2. 修复 OneDrive 请求层在 token 刷新后返回旧失败结果的问题
修改文件
packages/filesystem/onedrive/onedrive.ts问题
request()在检测到 token 失效后会刷新 token 并重试nothen原始响应路径不支持 token 刷新恢复修正
nothen路径也支持 401 后刷新并重试意义
3. 为 Google Drive 请求层补充更稳定的认证恢复与 HTTP 错误处理
修改文件
packages/filesystem/googledrive/googledrive.ts问题
nothen原始响应路径缺少 token 自动恢复修正
nothen路径支持 token 自动恢复delete()对“目标不存在”改为幂等成功意义
4. 为 Dropbox 请求层补充 token 恢复,并将删除改为幂等
修改文件
packages/filesystem/dropbox/dropbox.ts问题
append(),重复设置时可读性较差修正
nothen路径支持 401 后刷新 token 并重试delete()对path_lookup/not_found/path/not_found视为成功set()意义
5. 为 WebDAV 删除补充幂等语义
修改文件
packages/filesystem/webdav/webdav.ts问题
修正
delete()遇到 404 时静默成功意义
6. 为 OneDrive 删除补充幂等语义
修改文件
packages/filesystem/onedrive/onedrive.ts修正
delete()遇到 404 时静默成功意义
测试
新增测试
packages/filesystem/auth.test.tspackages/filesystem/onedrive/onedrive.test.tspackages/filesystem/googledrive/googledrive.test.tspackages/filesystem/dropbox/dropbox.test.ts补充测试
packages/filesystem/webdav/webdav.test.ts覆盖内容
验证结果
vitest测试通过tsc --noEmit通过影响范围
本次改动主要影响:
不影响:
packages/filesystem公开接口签名总结
这次修正的核心不是增加新能力,而是修正两类会放大同步问题的底层误判:
修完后,
packages/filesystem在以下场景下会更稳定: