重连即重画:断线重连与硬刷新复用同一条路径(填 GameState → emit RESYNC_ALL), 不为重连单写一套渲染。deskinfo 按 step 分组填充,重连不重放 70 分开底那类 一次性事件。StartWar 支持差异化下发,按本座位取自己那份。 路由表 12 条注册齐全,test_dispatcher 的完整性断言随之转绿—— 漏接一个包就会红。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
67 lines
3.2 KiB
JavaScript
67 lines
3.2 KiB
JavaScript
///////////////////////////////////////////////////////////////
|
||
////////// EQW_Dispatcher: 唯一收包入口 + 纯路由表 ////////////
|
||
///////////////////////////////////////////////////////////////
|
||
// 前端 04 §2:收包统一分发,一 rpc 一处理器。
|
||
// 【本文件只分发,不写业务】——新增一种服务端推送 = 注册一条 rpc → handler。
|
||
//
|
||
// 判定顺序(关键):先看 data.success,为 false 一律交 FailHandler、不进业务 handler。
|
||
// 因为协议 §0.2 规定失败回包的 rpc 与【请求】同名(chupai 失败回 chupai,
|
||
// 而成功走 chupai1/2/3),不先分流的话每个业务 handler 都得自己判一遍。
|
||
var EQW_Dispatcher = EQW_Dispatcher || {
|
||
|
||
_handlers: {},
|
||
|
||
//注册一条 rpc → handler
|
||
register: function (rpc, handler) {
|
||
if (typeof rpc !== 'string' || typeof handler !== 'function') {
|
||
throw new Error('[EQW_Dispatcher] register 参数非法: ' + rpc);
|
||
}
|
||
if (this._handlers.hasOwnProperty(rpc)) {
|
||
throw new Error('[EQW_Dispatcher] rpc 重复注册: ' + rpc);
|
||
}
|
||
this._handlers[rpc] = handler;
|
||
},
|
||
|
||
hasHandler: function (rpc) {
|
||
return this._handlers.hasOwnProperty(rpc);
|
||
},
|
||
|
||
//唯一收包入口。msg = { rpc, data }
|
||
dispatch: function (msg) {
|
||
if (!msg || typeof msg.rpc !== 'string') {
|
||
console.warn('[EQW_Dispatcher] 畸形数据包,已忽略');
|
||
return;
|
||
}
|
||
var data = msg.data || {};
|
||
|
||
//成败只认 data.success(前端 04 §4):失败包一律先分流
|
||
if (data.success === false) {
|
||
EQW_FailHandler.handle(msg.rpc, data);
|
||
return;
|
||
}
|
||
|
||
var h = this._handlers[msg.rpc];
|
||
if (h) {
|
||
h(data);
|
||
} else {
|
||
//平台日后新增推送不该让前端崩
|
||
console.warn('[EQW_Dispatcher] 未处理的 rpc: ' + msg.rpc);
|
||
}
|
||
}
|
||
};
|
||
|
||
//—— 路由表:一 rpc 一处理器(协议里每个服务端推送都要在这里注册)——
|
||
//新增一种推送 = 加一条注册 + 写对应 handler;本文件不写业务。
|
||
EQW_Dispatcher.register('fapai', function (d) { EQW_DealHandler.handle(d); });
|
||
EQW_Dispatcher.register('jiaofen', function (d) { EQW_CallHandler.handleJiaofen(d); });
|
||
EQW_Dispatcher.register('shangzhuang', function (d) { EQW_CallHandler.handleShangzhuang(d); });
|
||
EQW_Dispatcher.register('xuanzhu', function (d) { EQW_MainHandler.handleXuanzhu(d); });
|
||
EQW_Dispatcher.register('maipai', function (d) { EQW_BuryHandler.handle(d); });
|
||
EQW_Dispatcher.register('chupai1', function (d) { EQW_PlayHandler.handle(d, 1); });
|
||
EQW_Dispatcher.register('chupai2', function (d) { EQW_PlayHandler.handle(d, 2); });
|
||
EQW_Dispatcher.register('chupai3', function (d) { EQW_PlayHandler.handle(d, 3); });
|
||
EQW_Dispatcher.register('mingpai', function (d) { EQW_QueryHandler.handleMingpai(d); });
|
||
EQW_Dispatcher.register('tishi', function (d) { EQW_QueryHandler.handleTishi(d); });
|
||
EQW_Dispatcher.register('jiesuan', function (d) { EQW_ResultHandler.handleJiesuan(d); });
|
||
EQW_Dispatcher.register('zhunbei', function (d) { EQW_ReadyHandler.handle(d); });
|