Files
youle_cocos/docs/superpowers/specs/2026-09-05-remote-config-memory-design.md
T

46 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 远程配置读取与内存解析
## 已确认目标
用户已确认:debug、release 都读取远程配置;按原工程解析;数据只存变量,不下载落盘、不写本地缓存。2026-09-05 用户回复“开始”,授权实施此方案。Login Layer/MainMenu 接线另批处理。
## 契约与来源
- 原工程 `projects/Game_Surface_3/js/00_Surface/12_Logic.js` 的实际入口是 `get_config`,POST 空 body,URL 为 `gameserver + '?' + timestamp`。`gameconfig` 注入仍按 `-`→`/`、`#`→`:` 后包成 `http://…txt`。
- `getConfig_Succ` JSON.parse 后把根对象保存在 `GameData.serverConfig.data`。`data` 是客户端包装,不是远程响应信封。旧 `ServerUrl_Succ/data.urlserver` 是未启用路径,不能继续作为本次契约。
- 当前项目配置源 DEFAULT_GAMESERVER 保持 `https://tsgames.daoqi88.cn/config/update_jsonv2.txt`。原模板旧 URL 在只读预检中返回非 JSON,不能因追求源码一致而切回失效地址;兼容的是读取与解析协议。
- BUILD_IDENTITY、宿主与 query 身份链沿用已完成实现,不复制 agentid/gameid/channelid/marketid/version,也不改变测试账号与设备来源。
## 内存结构与解析
在现有 remote-config.ts 提供统一远程配置视图:持有原始根 JSON、已解析的身份,以及 `getValue(name)`。RuntimeConfig 持有此视图,rawConfig 引用同一根数据;所有配置值(含 hall_config、game_config、公告、登录图片、扩展字段)均保留。无 localStorage、文件、跨启动缓存或全局第二份配置。
getValue 严格复刻 get_paravalue:全局→匹配 agent→game→channel→market;每层首个宽松相等身份匹配;断层保留上层值;只有 truthy 值覆盖,0/false/空串不覆盖;对象和数组整体覆盖,不自动深合并;缺省返回 null。身份 marketid=0 时保留原函数不搜索该层的语义。非法结构显式 ConfigParseError,不修补。
远程 WebSocket 候选按原 getConfig_Succ 选 truthy game_server_tcp,否则 player_server_tcp。支持原字符串/数组顺序及重复项;在协议适配入口转为 ws/wss URL。实际采用远程服务器时,候选缺失或非法显式失败,不退回 data.urlserver 或 visitor_server_tcp。原工程明确的 game→player 选择属于来源契约。
本批不实现 Logic.setConfigInfo 内的 UI 布局、副作用及子游戏 Game_Modify 回调;其所需原始参数均可从统一 getValue 读取。后续界面接线时再按原工程执行各字段的显示转换和来源默认语义。
## 启动顺序
身份解析 → 远程读取 → 根结构及层级解析 → 显式服务器来源选择 → 校验并规范化最终连接候选 → 发布 RuntimeConfig → 后续 Runtime 启动。
所有 profile 都是 remote。debug 与 release 共用解析器;isDebugger 保持构建模式语义,不控制是否读取。profile=local 是独立的本地服务器选择:仅 debug 使用,远程 JSON/层级解析成功后采用 PROFILES.local 唯一配置的回环地址,不要求未采用的远程 TCP 字段存在。原 getConfig_Succ 在赋值后以 serverType 覆盖地址,并未预先校验未使用的远程值。release 仍选 prod,不能因 URL 参数误接本地。
真实数据核对:当前 BUILD_IDENTITY 匹配 agent,但没有其下匹配 game;继承结果的 game/player TCP 均为 null,仅 visitor TCP 有值。这不授权更换身份或使用游客地址。release 应显式暴露缺失;debug local 在成功读取与层级解析后可用明确的本地地址。该规则是固定的来源选择,禁止捕获读取/解析错误后退回本地。
本地诊断入口继续严格验证 DEBUG/H5/profile=local、身份及回环目标;更新“必须 direct”的旧断言。远程读取/解析失败前不得创建 socket、准备账号或发送登录。停止发生在读取期间时,不得在读取完成后启动连接。
## 验收
1. 自动测试对照原 get_paravalue 实函数,覆盖五层、断层、重复身份、数字/字符串身份、truthy、对象覆盖及不存在字段。
2. debug prod、debug local、release 均实际调用 fetcher;本地目标在读取解析完成后才生效;无缓存读写。
3. 非 JSON、非法层级、HTTP 失败均明确失败;本地 host 无 socket/登录副作用。实际采用远程地址的模式在 game/player TCP 缺失或非法时明确失败;local 不消费这些字段。
4. 真实 HTTP 读取使用当前配置源与 BUILD_IDENTITY,输出脱敏结构/匹配情况;不输出原始配置及认证信息,不连接其生产 WS。
5. 经 funplay MCP 验证实际 Creator 浏览器预览远程读取成功、配置在内存、最终目标仍为本地;若浏览器受 CORS 等阻止,记录真实阻塞,不能用 Node 成功代替浏览器通过。
6. 显式枚举纯 TS 测试、指定架构测试、类型和导入边界检查。原有 dirty 资源不变。
## 实施边界
沿用主 checkout 的 codex/local-platform-login 分支,不创建 worktree。不改服务器、原生契约、资源序列化文件,不扩展 RPC/房间/子游戏。只修改已有 assets TS,避免新增脚本的 meta 生成要求。同步更正本次直接涉及的协议文档错误;已完成计划保留历史意义,不重新执行。