Repository navigation
✨ 外部接入:以独立实例身份连接 sctl,被拒绝时停止重连并说明原因,支持命名与改名 - #1821
Merged
Merged
Conversation
getBrowserVersion() 只认 UA 中的 Chrome/ 标记,Firefox 与 Safari 上 productVersion 总被省略;改为按产品读取 Firefox/ 与 Version/ 标记,Chromium 系不变。 顺带修正随本功能过期的注释与测试标题(clientId、paired、接入提示),并去掉 en-US 文案中会原样显示的反引号。
- onEstablished 改以 disabled 状态而非内存里的 active 判断是否接收:SW 在配对握手期间重启后,daemon 已登记的新密钥仍会落盘并转为已连接;stop() 之后迟到的通知仍被忽略 - 实例名称规则收敛为 config 中唯一的 isValidExternalAccessName,页面与控制器共用,并拒绝 sctl 保留给旧版 ScriptCat 的 scriptcat(否则接入会在认证后被拒、白白消耗一次性配对码),各语言提示同步说明 - 接入请求本身失败(doThrow 拒绝)时页面提示失败,不再产生未处理的 Promise 拒绝 - 能力声明只对来自 UA、可被改写的浏览器版本截断到 64 字节;名称与扩展版本均为受控输入,删去不可达的 UTF-8 截断 - Web Locks 测试替身从生产目录移到 tests/mockWebLocks.ts;连接测试改经 Group 下发能力声明、以 hello 转发观察握手完成、以重连后的会话模式握手验证密钥切换,不再读私有字段
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Checklist / 检查清单
背景
scriptscat/sctl#16(已合并)让 sctl daemon 同时接入多个 ScriptCat 实例:按实例 ID 区分、按名称或 ID 前缀指定、合并
scripts.list。ScriptCat 之前不声明身份,只能作为唯一的“老版实例”连接,第二个 ScriptCat 会顶掉第一个(scriptscat/sctl#14 的根因之一)。另外 ScriptCat 被 sctl 拒绝时会无限重连:名称冲突发生在认证成功之后,按现有逻辑会每 2 秒重试一次;被sctl scriptcats forget的实例会每 30 秒白连一次,页面只显示“连接失败”。本次改动
system_external_access_identity,Web Lock 保证并发首次读取只生成一份)。默认名称为<chrome|edge|firefox|safari|scriptcat>-<ID 前 4 位>。“停止外部接入”只清密钥,ID 与名称保留,重新接入仍是同一实例。删除没有读取方的clientId。peer: {kind: "scriptcat", instanceId},HMAC 使用scriptcat*上下文并绑定实例 ID(与 sctl Go 实现生成的固定向量对拍);能力声明带peer: {name, product, productVersion, extensionVersion},从浏览器 UA 读取的版本最多 64 字节。从 1.5 升级的已接入用户无需操作,sctl 会接管原密钥。rejected,原因refused(认证完成前被 1008 关闭)或name-taken(会话能力声明收到CONFLICT)。进入后停止自动重连;能力声明被接受前不重置退避。关开开关、重新接入或修改名称会离开rejected。enroll(code, name)/rename(name)。接入时名称冲突不保存密钥,并提示需要重新运行sctl connect获取新配对码(sctl 在认证时即消费配对码);已连接时改名冲突恢复原名并保持连接;未连接时改名在下次连接时生效。本地拦下保留名scriptcat。配对中途 SW 重启不会丢弃新密钥。rejected两种原因的说明与对应操作(重新接入 / 修改名称)。新文案覆盖 10 种语言。tests/mockWebLocks.ts(happy-dom 没有 Web Locks);event_page_manager.test.ts在重置模块后重建 logger 单例(否则后续文件在共享模块环境里初始化Server失败)。实现考虑
refused处理并提示可能是 sctl 版本过旧。发布顺序:先发包含 ✨ daemon 同时接入多个 ScriptCat 实例,修复普通与隐身进程互相顶替 (#14) sctl#16 的 sctl,再发本变更。refused,并保留原有的失败提示。已知限制
建议审查重点
external-access-connect.ts中 1008 判定与重连退避的时机(能力声明被接受前不重置)。controller.ts中配对密钥延后到能力声明被接受才保存、SW 重启后的状态恢复。config.ts)。关联
验证
base
acec65cb(main)…headbc7620db;git diff origin/main...HEAD涉及 26 个文件:src/app/service/offscreen/、src/app/service/service_worker/(含external_access/)、src/pkg/config/、src/pages/options/routes/Tools/sections/ExternalAccessSection*、10 个src/locales/*/external_access.json、src/pages/components/ui/pairing-code-input.tsx、tests/mockWebLocks.ts。pnpm exec tsc --noEmit通过;pnpm lint通过。CI=1 pnpm test:ci(headf7ba8feb):377 个文件中 376 通过,1 个用例 850ms 超时(Agent/Provider/index.test.tsx,本分支未改动,本机负载高),单独重跑 7/7 通过。此前在638a90b4上 377/377、5100 个测试全部通过。本机全量结果受负载影响,以 CI 为准。bc7620db(新增两个提交):CI=1 pnpm test:ci377 个文件中 376 通过,1 个用例 850ms 超时(src/pages/import/components.test.tsx,本分支未改动),单独重跑 22/22 通过;pnpm lint通过。名称恢复先写失败测试(冲突后名称仍为work),修复后通过;手机布局在构建产物中实测:390px 下对话框scrollWidth=clientWidth(388),配对码格 32px,桌面仍为 40px;徽标高度 22px 单行。2939485的独立 daemon;三个独立配置代表三份安装):chrome-6f6c,sctl 列出实例 ID、Chrome 156、扩展版本。sctl get合并并标注来源,--scriptcat分别指定。sctl scriptcats forget后进入rejected(refused),40 秒内无重连;重新接入后以同一实例 ID 回到在线。rejected(name-taken),20 秒内无重试;通知里“修改名称”改名后立即连上。pairing.key):打开开关后以实例身份在线,sctl 删除pairing.key。rejected通知可用,无横向溢出。Screenshots / 截图
构建产物在一次性 Chromium 中、连接 sctl main 独立 daemon 时截取(亮色为主,另附暗色与 390px 手机宽度)。