Commit Graph
27 Commits
Author SHA1 Message Date
joywayer 8eae3258ca fix(platform): preserve recoverable outcomes and terminal sessions 2026-09-05 10:50:55 +08:00
joywayer 1e3a21b476 refactor(platform): complete decoupled vertical runtime 2026-09-05 10:21:28 +08:00
joywayer d177c52c3f fix(platform): close startup subscription handoff gaps 2026-09-05 10:02:45 +08:00
joywayer 3963b3b791 fix(platform): harden runtime lifecycle cleanup 2026-09-05 09:40:00 +08:00
joywayer 3a9c5d6fdb feat(platform): add single-entry platform runtime 2026-09-05 09:13:00 +08:00
joywayer dfaa4f0ef4 fix(sdk): enforce runtime dependency boundary 2026-09-05 08:01:07 +08:00
joywayer 471e2e9479 fix(platform): isolate game host leases 2026-09-05 07:48:23 +08:00
joywayer 30547f6a54 feat(platform): expose restricted game host and commands 2026-09-05 07:25:21 +08:00
joywayer a383c0330e fix(platform): snapshot session fault errors safely 2026-09-05 07:05:06 +08:00
joywayer 77b2bff40a fix(platform): recognize session faults across realms 2026-09-05 06:49:59 +08:00
joywayer 224df1c21c fix(platform): preserve session failures and URL syntax 2026-09-05 06:38:00 +08:00
joywayer 7e5a950cc7 fix(platform): serialize runtime session transitions 2026-09-05 06:17:04 +08:00
joywayer 1c124cf216 refactor(platform): unify routing and session dispatch 2026-09-05 05:23:58 +08:00
joywayer 72227efd05 fix(platform): apply room action battle flags 2026-09-05 03:44:32 +08:00
joywayer 9840ed70b2 fix(platform): stabilize store snapshots and notifications 2026-09-05 03:29:49 +08:00
joywayer 462e2e9267 fix(platform): separate room stage contracts 2026-09-05 03:12:19 +08:00
joywayer 4ffa59bf8e fix(platform): enforce atomic store input validation 2026-09-05 02:57:07 +08:00
joywayer 7acd3ed96e feat(platform): add atomic canonical platform store 2026-09-05 02:44:51 +08:00
joywayer a173d410e0 refactor(native): isolate exact WVJB compatibility adapter 2026-09-05 01:47:57 +08:00
joywayerandClaude Opus 5 c57d1d9214 feat(framework): StartupOrchestrator 启动链路编排
串联启动门控四条件(C 规范 §6.1)的可测部分:
- bootstrap() 拉取并解析远程配置,写入 AppStore(identity/servers)
  失败显式抛错(第二准则)
- onLogin() 收到 player_login 后构造 NetClient + RoomRPCBus
  并触发 ready 信号
- waitForReady() 合并 bootstrap + login + room rpc 通道
  UI 层 await 即可进入登录页
- shutdown() 清理 RoomRPCBus

依赖注入:
- getBootstrapResult: 远程配置拉取函数(测试可 mock 抛错)
- makeNetClient: NetClient 工厂(避免测试需要真 WS)
- roomBusFactory: RoomRPCBus 工厂(避免测试起副作用)

167/167 tests pass, typecheck exit 0。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-31 21:27:14 +08:00
joywayerandClaude Opus 5 64b818d514 feat(framework): RoomRPCBus 把 NetClient 'message' 分发到 room handlers
端到端打通「收包 → 路由分界 → RoomStore 更新」」」」」」」」」」」

RoomRPCBus.start() 订阅 NetClient.bus 'message':
- route==='room' 的包 → 查 roomHandlers[msg.rpc](ctx, msg.data)
- 其他 route 不处理(归 Router 单独管平台/agent)

未注册 room rpc 显式抛错(第二准则:不静默吞包)
start/stop 幂等,可重复调用

业务侧在 PlatformSession 构造后:
  const roomBus = new RoomRPCBus(net.bus, session);
  roomBus.start();  // 进房前
  roomBus.stop();   // 退房后

162/162 tests pass, typecheck exit 0。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-31 21:00:02 +08:00
joywayerandClaude Opus 5 065ebb1f58 refactor(framework): native-bridge 内部命名现代化(外部契约保留)
外部契约逐字不变(与原生 app 零改动对接):
- handler 名白名单 14 个字符串(getVideoinfo/sharelogin/...)
- window.WVJBCallbacks / WebViewJavascriptBridgeReady 事件名
- window.settings.getothername API
- 回调签名 (data, responseCallback) 与数据结构

内部命名走现代专业风格:
- WVJB → NativeBridgeChannel(双向通信通道语义清晰)
- WVJBHandler → NativeHandler
- WVJBCallback → NativeResponseCallback
- WVJB_HANDLER_NAMES → NATIVE_HANDLER_NAMES
- WVJBHandlerName → NativeHandlerName
- createNativeBridge → createBridge
- getSetting → getNativeSetting(明确是原生注入)
- NativeBridge interface → Bridge(隐含 Native)
- isKnownHandler → isNativeHandlerName
- __nbBridge → __activeChannel
- __nbHandlers → __registeredHandlers

144/144 tests pass, typecheck exit 0。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-31 20:49:51 +08:00
joywayerandClaude Opus 5 9b69bb8611 feat(framework): 原生桥 WVJB + window.settings(NativeBridge facade)
严格对齐原 gameabc 项目 05_Func.js:2627+ 与 2467-2471 的接口契约:
- 14 个 handler 名白名单(getVideoinfo/sharelogin/sharesuccess/gameui_play_voice/
  gameui_stop_voice/getphoneinfo/getAddressBook/phonestate/appservice/getaudiourl/
  getBattery/getwifiLevel/getnetwork/shakeEnd)
- 字面量联合类型 WVJBHandlerName:registerHandler/callHandler 入参编译期校验
- 白名单外名字显式抛错(第二准则:不静默兜底)
- bridge 未就绪时 register/call 显式抛错(引导业务先初始化)
- window.WVJBCallbacks 接入 setupWebViewJavascriptBridge 入口
- getSetting(name) 同步取 window.settings.getothername(name)

Node 单测用 mock bridge + triggerReady() 模拟 WebView bridge 就绪。
Cocos 侧走相同 facade,原生侧 WVJB handler 零改动对接。

143/143 tests pass, typecheck exit 0。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-31 20:38:53 +08:00
joywayerandClaude Opus 5 77be6c0d19 feat(framework): AppStore + PlatformSession(登录接入)
AppStore(=旧 GameData 子集): setIdentity/setServers/setPhase/applyLogin
- applyLogin 区分两类字段语义:
  * 身份字段(agentid/channelid/agentmode/gameversion)缺省保留旧值
  * 显示字段(agentname)缺省重置为空字符串
- phase 仅由 session 驱动,applyLogin 不写 phase

PlatformSession: 订阅 NetClient 事件总线 → 扇出到三 Store
- 'open' → phase=connected
- 'login'(state==0) → 三 Store 填充 + phase=loggedIn
- 'login'(state!=0) → phase=loginFailed, 不污染 playerid/roomcode
- 'reconnecting' → phase=reconnecting
- 'slow' → phase=slow
- 'kicked' → phase=kicked

110/110 tests pass, typecheck exit 0。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-31 19:46:14 +08:00
joywayerandClaude Opus 5 b54de5bbda feat(framework): RoomStore + RoomState.players 类型精确化
RoomState.players: unknown[] → Array<PlayerState | null>
- 座位未占用显式为 null(不是 undefined、不是空对象)
- 长度由 maxPlayerCount 决定,RoomStore.applyRecovery 校验填充

deskinfo 字段注释强调"C 规范 §5 边界判据 2:平台层不持有、不解析",
新测试覆盖引用相等透传(不深拷贝)。

新增 RoomStore: applyRecovery/clear,响应式 + 类型化入参 RoomRecoveryData。

97/97 tests pass, typecheck exit 0。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-31 18:17:29 +08:00
joywayerandClaude Opus 4.8 4b4e2261b4 feat(framework): platform PlayerStore(=C_Player) applyLogin
Implement PlayerStore wrapping signal<PlayerState> for player account data.
Adds applyLogin(raw) to fill state from login response A group, with:
- Mandatory fields get default 0/'' if missing (never undefined)
- Optional fields (openid/unionid/province/city) only set if present
- Immutable updates via spread operator
- Notifies subscribers on state change

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 22:06:06 +08:00
joywayerandClaude Opus 4.8 854d72a420 feat(framework): core 响应式 signal 基元(自研薄封装)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 21:32:03 +08:00