Commit Graph
13 Commits
Author SHA1 Message Date
lanterngamescnandClaude Opus 4.8 c39d8eb400 refactor(config): 七牛/微信密钥外置——AK/SK+微信AppID 入本地 app_config, domain/bucket 走远程配置
- app_config.json + AppConfig: qiniu_access_key/qiniu_secret_key/wechat_app_id/wechat_app_secret(扁平snake_case)
- RemoteConfig.VersionFields + audio_domain/audio_bucket(4层可携带), VersionDecision + audioDomain/audioBucket
- VersionResolver.resolve 复用 pickStr 解析 audioDomain/audioBucket(4层逐级回退)
- QiniuToken.uploadToken(accessKey,secretKey,bucket) 改传参,去掉硬编码常量
- AudioProvider.doUpload: AK/SK取本地配置, domain/bucket取远程配置(cfg.resolve), URL用远程domain
- WeChatApi.configure(appId) 注入AppID(去WX_APP_ID常量), EntryAbility.onCreate 从配置注入
- 更新 QiniuToken 单测传参

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 19:12:43 +08:00
lanterngamescnandClaude Opus 4.8 a6ef891507 fix(config): VersionResolver 改为 4 层逐级回退(agent/game/channel/market 每层 merge 全字段)
原实现资源字段 game_zip/game_version 只在 game/channel/market 三层覆盖、app 字段只在
market 层,漏了 agent 层。按 4 层模型:每个字段取最深命中层非空值、深层缺省逐级回退到根。
Acc 合并为单个 merge() 每层调用。新增 agent层回退/app上浮回退/四层全覆盖 3 个单测。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 18:49:05 +08:00
lanterngamescnandClaude Opus 4.8 1bea5a3598 fix(录音): 七牛 bucket 'gameauio'→'gameaudio'(原webviewActivity拼写错误)
真机上传 631 no-such-bucket 根因:抄了 webviewActivity 的 typo 'gameauio'(无d)。
区域查询确认正确 bucket 是 'gameaudio'(有d,与回放域名 gameaudio.daoqi88.cn +
NewwebviewActivity 一致),region z0/华东,up host upload.qiniup.com。同步改单测断言。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 18:00:08 +08:00
lanterngamescnandClaude Sonnet 4.6 0a9ba6c8be feat(录音): 七牛 uploadToken 端侧生成(HMAC-SHA1,对齐原工程不走服务端) + 结构单测
新增 platform/src/main/ets/upload/QiniuToken.ets:
- QiniuToken.uploadToken() 异步生成 uploadToken(deadline=now+1h)
- HMAC-SHA1 via cryptoFramework.createMac('SHA1'),对齐原 Android 硬编码 AK/SK
- urlsafeBase64 工具方法(util.Base64Helper.encodeToStringSync + 替换+/-/_)
- eslint-disable-next-line @security/no-unsafe-mac 注释说明七牛协议强制要求
platform/Index.ets 导出 QiniuToken。
entry/src/test/QiniuToken.test.ets 结构单测(三段token格式/AK/scope验证)。
List.test.ets 注册 QiniuTokenTest。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 17:06:13 +08:00
lanterngamescn 457ebf2f74 test(share): buildShareText 单测(单换行/空字段/无url,分享重构 §9) 2026-06-27 14:17:09 +08:00
lanterngamescnandClaude Opus 4.8 799e78d8af 启动链路真实化:版本解析层对齐线上配置,复刻 Android chuliversion_1(H5 零改动)
对照原 Android 工程 + 线上实测配置,修正 4 处会破坏 H5 适配的根因:
1. 配置树层级改为真实的 agentlist→gamelist→channellist→marketlist
   (原抄了废弃 Bean1 的 agent→channel→market→game)。
2. 资源下载字段名 game_download → 真实的 game_zip(原永远取空,资源升级永不触发)。
3. marketid/版本为数字,匹配/比较做 string↔number 归一(原 ===  "3" 永不命中 market 层)。
4. 大厅 app_config.gameid 为空时回退 version.xml 的 <game id>(复刻 versd.getGameid()),
   否则大厅永远定位不到自己的 game_zip。

实现:
- RemoteConfig/VersionResolver 按真实格式重写,VersionResolver 复刻 chuliversion_1
  的 game/channel/market 三层累积 + market 层 app 升级,"0"/空不覆盖。
- ConfigManager 拆分 fetchRemote(IO) / resolveWith(纯函数 + gameid 回退),移除失效的二级 url 编排。
- VersionXml 补解析 <game id>;ResourceManager 增 localGameId()。
- StartupOrchestrator 调整时序:内置资源(version.xml 种子)就绪→取 gameid→解析远程,拉取仍并行。
- 内置 gamehall_builtin.zip 改为真实版本种子(game id=G2hw... version=42),离线首启阻断、联网下载真实大厅。
- app_config.json gameconfig 切生产端点(去 _test),不再使用测试配置。
- VersionResolver 单测重写为真实格式 + 线上大厅样例。

注:远程配置格式属原生内部消费(H5 不可见),按铁律以线上服务器为准对齐。devecocli build 通过。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 17:43:20 +08:00
lanterngamescn a865ac766b M5: BridgeController 激活闸门 setActive(双 Web 基础件)
- BridgeController 加 active 状态 + setActive/isActive:
  - 非激活:onLoadIntercept 拦截 yy:// 但不分发(入站忽略)、dispatch 直接返回(出站抑制)
  - 保证双 Web 下"同时只有一个 Web 执行桥接口",且去激活端不会收到 native 推送
- 去激活顺序约定:先 callHandler(appservice,'2')(彼时仍激活),再 setActive(false)
- 单测新增 inactive_gate_suppresses_outbound_and_inbound;scripts/test.sh 通过
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 23:25:49 +08:00
lanterngamescn 4590d5bf70 review: M2 成果审查后的质量加固
三路+对照审查 M2 全部成果。桥核心(M1,本期未改)与契约骨架零问题;发现集中在新的资源/启动/容器代码,已修:

高危
- ResourceManager.updateGame 原子化:下载→解压暂存→校验 <gamestart>/index.html→才删旧并 rename 换入。
  修复"先删旧 gamehall 再解压,失败即把可用资源砖掉"且 catch『keep local』失效的数据丢失风险
- BridgeGameContainer.setupBridge:先建桥并赋值 this.bridge,能力注册/配置加载整体兜底 try/catch。
  修复"config/registration 抛错→bridge 永远 undefined→H5 所有 callHandler 静默"违反 H5 零改动铁律

中危
- VersionResolver:空 gameid 守卫(大厅不参与 game 树匹配,避免误命中 gamelist 空 id 节点);
  两树 version 平手时取"有下载地址"的一棵(避免选中只有版本号无下载地址的层)。新增 2 单测,覆盖率 83.7%
- Downloader:dataReceive 写盘失败标记并于请求结束后抛出(避免磁盘满致截断文件被当作下载成功)
- FileSystem:rmrf 的 statSync 纳入 try(兑现"不存在/竞态则忽略"承诺);copyRawFileTo 按
  byteOffset/byteLength 切片写入(避免 Uint8Array 为大池子视图时写入多余字节致 zip 损坏);新增 rename
- ConfigManager.fetchSecondary:二级节点本层版本字段也并入(此前只换 channellist/agentlist 会丢节点自身版本/下载地址)

清理/抗回归
- 跨域白名单路径改用 ResourceManager.resourceRoot()(单一来源,避免与领域层路径定义漂移致 V2 回归)
- 前后台订阅移到 setupBridge(桥就位后),避免冷启动 FOREGROUND 早于桥到达被丢
- prepareBuiltin 单次读取内置包(去掉"先整包读探测、再整包读拷贝"双读)
- LocalUploadServer 删死码 isRunning/running
- 文档化延期项:weburl 分支不注入 app_data(同 Android,远程大厅自带)、app_gamename 待 M3 扩展 VersionXml、
  子游戏切换 firstProgressDone 复位 TODO(M3 T-M3-06)

devecocli build 通过;单测全通过;模拟器复测 app_data/V2 fetch/桥双向/特殊字符往返均无回归。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 19:05:46 +08:00
lanterngamescn d2da223c8d M2(领域层): ConfigManager/VersionResolver/ResourceManager/AppDataInjector/StartupOrchestrator
T-M2-05 ConfigManager:本地 rawfile/app_config.json(§4.2 实测值)、远程 URL 拼装('-'→'/'+.txt+?a=ts 禁缓存)、
        长度<30 走 showmessage 阻断、二级 url 二次请求(语义待真机校验)、产出版本决策
T-M2-06 VersionResolver:纯函数,agentlist/gamelist 两棵树 + agent→channel→market→game 后层覆盖 +
        两树取更高 version(§4.4)。单测 8 用例全通过,覆盖率 81.8%(≥80%)
T-M2-07 ResourceManager:沙箱路径规范、内置包拷贝解压、version.xml 解析(@ohos.xml)、远程 zip 下载/删旧/解压、版本比较
T-M2-09 AppDataInjector:加载前写 <gameDir>/app_data.js(§6 全局变量同名同义,JSON.stringify 安全字面量)
T-M2-11 StartupOrchestrator:INIT→…→ENTER_HALL 状态机,远程失败降级本地、showmessage 阻断、weburl 空/非空入口规则
配套:module.json5 声明 ohos.permission.INTERNET + reason_internet 字符串

devecocli build 通过;scripts/test.sh 单测全通过(修复 PermissionRequestResult 顶层导入)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 18:29:45 +08:00
lanterngamescnandClaude Opus 4.8 bdb920f61e review: M0/M1 成果审查后的质量加固
三路独立审查:桥引擎(对照 lzyzsd 逐字)与契约 SSOT(对照原 Android 44 handler)
两个命门维度【零问题】;以下为架构/质量改进项的修复:

- [安全红线] BridgeGameContainer setWebDebuggingAccess 加 AppEnv.isDebug() 守卫
  (common 新增 AppEnv,用 bundleManager.appInfo.debug 运行时判断,release 自动关闭,
  消除 CLAUDE.md 附录B 红线违反)
- [生命周期] BridgeController 加 dispose() 清回执表/注册表/启动队列;HandlerRegistry 加
  clear();容器 aboutToDisappear 先 dispose 桥再 dispose adapter 并置空,防残留命中/泄漏
- [事件总线] EventBus.on/once 返回取消函数支持 per-subscriber 精确退订;off→offAll 并
  标注谨慎(避免 M3 多容器订阅 appservice 时误注销他人回调)
- [单测] 加强 escape 断言覆盖内层 " 加倍(命门);新增 dispose 用例;16 用例全通过,
  桥核心覆盖率 89.0%
- [记录] Index.pageMap param as 运行期不校验,M4 外部 scheme 唤起时需补校验(已注释)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 13:16:37 +08:00
lanterngamescnandClaude Opus 4.8 159dcf2687 M1: 桥引擎单测跑通,桥核心覆盖率 87.3%(T-M1-08 完成,R-18 处置)
- 修复 2 个测试用例(漏先触发 flushMessageQueue 注册 _fetchQueue 回调)
- 补 set_default/remove、FakeWebController、send 用例,共 15 用例全通过
- 桥核心覆盖率 87.3%(MessageCodec/Message 100%、BridgeController 83%、
  HandlerRegistry 88%)≥80% 达标;Adapter/BridgeJsLoader 系统耦合由 V1 真机覆盖
- scripts/test.sh:本地单测 + 覆盖率运行脚本(devecocli 无 test,用 DevEco hvigorw
  + 强制 DEVECO_SDK_HOME 指向自带 sdk);ci.sh 集成单测(SKIP_TESTS=1 可跳过)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 12:26:23 +08:00
lanterngamescnandClaude Opus 4.8 5587df0562 M1: 桥引擎单测代码(T-M1-08,运行待工具链)
- entry/src/test/Bridge.test.ets:13 用例覆盖
  MessageCodec(toJson省略/response/escape转义/toArray)、
  HandlerRegistry(put/get/默认兜底不抛错)、
  BridgeController(入站分发+回执/出站callHandler/启动队列补发/
  responseId回执路由/未注册名默认兜底) —— 用 FakeWebController 纯逻辑、不依赖设备
- 接入本地单测入口 List.test.ets
- ⚠ 运行受阻:devecocli 无 test 子命令,本地单测 hvigor task 未常规暴露,
  待定运行方式(DevEco IDE / CI / 其他)后跑覆盖率(目标 ≥80%)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 09:06:55 +08:00
joywayer 561af47817 first commit 2026-06-25 06:25:30 +08:00