51 lines
1.5 KiB
TypeScript
51 lines
1.5 KiB
TypeScript
// 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)
|