// 分发器:success 优先分流、未知 rpc 不崩、路由表完整性 const { load } = require('./_load'); const t = require('./_assert')(); load('client/js/gameabc-framework/system/EventBus.js'); load('client/js/01_SubGame/codes/state/Events.js'); load('client/js/01_SubGame/codes/net/handlers/FailHandler.js'); load('client/js/01_SubGame/codes/net/Dispatcher.js'); // ---- 注册与分发 ---- const got = []; EQW_Dispatcher.register('testRpc', function (d) { got.push(d); }); EQW_Dispatcher.dispatch({ rpc: 'testRpc', data: { success: true, v: 1 } }); t.eq('成功包进业务 handler', got, [{ success: true, v: 1 }]); // ---- success:false 优先走 FailHandler,不进业务 handler ---- const failed = []; EventBus.on(EQW_Events.EQW_RPC_FAILED, function (e) { failed.push(e); }); got.length = 0; EQW_Dispatcher.dispatch({ rpc: 'testRpc', data: { success: false, errcode: 5 } }); t.eq('失败包不进业务 handler', got, []); t.eq('失败包 emit RPC_FAILED', failed, [{ rpc: 'testRpc', errcode: 5 }]); // ---- 失败包即使 rpc 没注册过也要被处理(如 chupai 只会以失败包出现)---- failed.length = 0; EQW_Dispatcher.dispatch({ rpc: 'chupai', data: { success: false, errcode: 6 } }); t.eq('未注册 rpc 的失败包也处理', failed, [{ rpc: 'chupai', errcode: 6 }]); // ---- 未知 rpc 的成功包:只警告、不抛错 ---- let threw = false; try { EQW_Dispatcher.dispatch({ rpc: 'brandNewRpc', data: { success: true } }); } catch (e) { threw = true; } t.eq('未知 rpc 不抛错', threw, false); // ---- 畸形入参不崩 ---- [null, undefined, {}, { rpc: 'testRpc' }, { data: {} }].forEach((bad, i) => { let boom = false; try { EQW_Dispatcher.dispatch(bad); } catch (e) { boom = true; } t.eq('畸形入参 #' + i + ' 不崩', boom, false); }); // ---- 路由表完整性:协议里每个服务端推送 rpc 都要有 handler ---- // (本条在 Task 10 全部 handler 就位后才会真正通过;此刻先写下期望, // Task 10 完成时它会自动转绿——这正是它存在的意义:漏接一个包就会红) // Task 10 完成后取消注释以下代码块 /* load('client/js/01_SubGame/codes/state/GameState.js'); load('client/js/01_SubGame/codes/state/RoomOptions.js'); ['fapai','jiaofen','shangzhuang','xuanzhu','maipai', 'chupai1','chupai2','chupai3','mingpai','tishi','jiesuan','zhunbei'].forEach(rpc => { t.eq('已注册 handler: ' + rpc, EQW_Dispatcher.hasHandler(rpc), true); }); */ process.exit(t.done('dispatcher') ? 0 : 1);