gameClient/assets/scripts/network/messageDecoder.ts

51 lines
1.5 KiB
TypeScript
Raw Normal View History

// MessageDecoder.ts
import * as pb from './pbExport'
export class MessageDecoder {
// 消息ID与消息类的映射表
private static _messageClasses: Map<number, (buffer: Uint8Array) => any> = new Map()
/**
*
* @param msgId ID
* @param decoder pb.ReqUserLogin.decode
*/
public static Register<T>(msgId: number, decoder: (buffer: Uint8Array) => T): void {
this._messageClasses.set(msgId, decoder)
}
/**
* ID动态实例化对应消息类
* @param msgId ID
* @param buffer Uint8Array
* @returns
*/
public static Decode(msgId: number, buffer: Uint8Array): [any, Error] {
try {
const decoder = this._messageClasses.get(msgId)
if (!decoder) {
return [null, new Error(`未注册的消息ID: ${msgId}`)]
}
// 实例化消息类并解码数据
const instance = decoder(buffer)
return [instance, null]
} catch (err) {
return [null, new Error(`解消息: ${msgId} 失败。err:${err}`)]
}
}
/**
* Hex码
* @param buffer Uint8Array
* @returns Hex码
*/
public static Uint8ToHex(buffer: Uint8Array): string {
return Array.from(buffer)
.map((byte) => byte.toString(16).padStart(2, '0'))
.join(' ')
}
}
MessageDecoder.Register(pb.MsgId.ReqUserLoginId, pb.ReqUserLogin.decode)
MessageDecoder.Register(pb.MsgId.RspUserLoginId, pb.RspUserLogin.decode)