Skip to content

🐛 外部接入:隐身(split)进程不再连接 sctl,避免与普通进程每 2 秒互相顶替 - #1819

Merged
CodFrm merged 1 commit into
mainfrom
fix/incognito-external-access
Nov 3, 2026
Merged

CodFrm merged 1 commit into
mainfrom
fix/incognito-external-access

Conversation

@CodFrm

@CodFrm CodFrm commented Nov 3, 2026

Copy link
Copy Markdown
Member

Checklist / 检查清单

  • Fixes mentioned issues / 修复已提及的问题
  • Code reviewed by human / 代码通过人工检查
  • Changes tested / 已完成测试

背景

ScriptCat 的 manifest 设了 "incognito": "split",隐身窗口里会运行一个独立的扩展进程。它和普通进程共用 chrome.storage.local 中的配对密钥与脚本,所以两个进程都会用同一把密钥连接 sctl daemon。daemon 只保留一条 ScriptCat 连接,新连接顶替旧连接;ScriptCat 每次握手成功都把重连间隔重置为 2 秒,于是两个进程每 2 秒互相顶替,sctl 日志和审计缓冲区被 handshake.ok 刷满(scriptscat/sctl#14)。

复现:真实 sctl daemon 加一个照抄 external-access-connect.ts 重连策略的模拟客户端,单实例 12 秒内 1 次 handshake.ok,两实例 7 次,每次间隔 2 秒,关闭原因 replaced by new connection。

本次改动

ExternalAccessController 在隐身进程(chrome.extension.inIncognitoContext 为真)中不再发起连接,也不接受接入(enroll)。普通进程代表这份安装连接 sctl;隐身进程看到的脚本与普通进程相同,不连接不会少任何能力。

已知限制

关联

验证

基于 79f2a99f(main)…80ea2ea3,git diff origin/main...origin/fix/incognito-external-access 只改 external_access/controller.ts 与其测试。

  • 改动前新增的两个测试(“已启用且已接入时启动也不拨号,状态保持 disabled”“enroll(code) 不以配对模式拨号”)失败,原因是隐身进程发起了连接;改动后通过。
  • pnpm vitest run --no-coverage src/app/service/service_worker/external_access/:8 个文件 141 个测试通过。
  • tsc --noEmit、eslint、prettier 通过(提交时的 lint-staged 也跑过)。

split 模式下隐身进程与普通进程共用 chrome.storage.local 里的配对密钥和脚本,
两者都连 sctl daemon 时,daemon 只保留一条 ScriptCat 连接,被顶掉的一方 2 秒后重连
又顶掉另一方,日志和审计缓冲区被 handshake.ok 刷满(scriptscat/sctl#14)。
隐身进程不再启动连接,也不接受配对。
@CodFrm
CodFrm merged commit acec65c into main Nov 3, 2026
11 checks passed
@CodFrm
CodFrm deleted the fix/incognito-external-access branch November 3, 2026 03:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant