37 lines
1.1 KiB
TypeScript
37 lines
1.1 KiB
TypeScript
import { ClientMsg } from '../network/pbExport'
|
|
|
|
interface ProtoEncodable<T> {
|
|
create(data: T): unknown
|
|
encode(message: unknown): { finish(): Uint8Array }
|
|
decode(buffer: Uint8Array): T
|
|
}
|
|
|
|
// 将proto对象序列化成buffer
|
|
export class PbHelper {
|
|
static Encode<T>(protoClass: ProtoEncodable<T>, data: T): Uint8Array {
|
|
const message = protoClass.create(data)
|
|
return protoClass.encode(message).finish()
|
|
}
|
|
static DecodeClient(buffer: Uint8Array): [number, Uint8Array] {
|
|
const cMsg = ClientMsg.decode(buffer)
|
|
return [cMsg.msgId, cMsg.data]
|
|
}
|
|
static Decode<T>(protoClass: ProtoEncodable<T>, buffer: Uint8Array): T {
|
|
return protoClass.decode(buffer)
|
|
}
|
|
static Uint8ToHex(buffer: Uint8Array): string {
|
|
return Array.from(buffer)
|
|
.map((byte) => byte.toString(16).padStart(2, '0'))
|
|
.join(' ')
|
|
}
|
|
}
|
|
|
|
// // 假设有一个生成的 Protobuf 类
|
|
// class UserMessage {
|
|
// static create(data: User) { /*...*/ }
|
|
// static encode(msg: unknown) { /*...*/ }
|
|
// }
|
|
|
|
// const data = { name: "Alice" };
|
|
// const buffer = PbHelper.encode(UserMessage, data); // 显式传入消息类
|