
import protobuf from 'protobufjs';
const messageType: AnyObject = {
1: '认证消息👋',
2: '心跳消息💗',
40000: '自定义消息🪡'
};
class ProtobufMessage {
RequestUser: any;
constructor() {
this.RequestUser = null;
}
async initCreateUser() {
return new Promise(resolve => {
if (this.RequestUser !== null) {
return resolve(this.RequestUser);
}
// 此处访问的是public/protobufjs/NetMessage.proto;
protobuf.load('/protobufjs/NetMessage.proto', (err: any, root: any) => {
if (err) {
return resolve(null);
}
const RequestUser = root.lookupType('com.network.message.web.NetMessage'); // Obtain a message type
this.RequestUser = RequestUser;
resolve(RequestUser);
});
});
}
// 编码
async requestUserEncoder(data: MsgType.INetMessage) {
console.log(`📱向服务端发送【${messageType[data.messageid as string]}】消息`, data);
const RequestUser: any = await this.initCreateUser();
if (RequestUser !== null) {
const payload = data;
const errMsg = RequestUser.verify(payload);
if (errMsg) {
console.log(errMsg);
return null;
}
const message = RequestUser.create(payload); // or use .fromObject if conversion is necessary
const buffer = RequestUser.encode(message).finish();
const dview1 = new DataView(new Uint8Array(buffer).buffer);
const len = dview1.byteLength;
const buff = new ArrayBuffer(4 + len);
const dview = new DataView(buff);
dview.setInt32(0, len);
for (let i = 0; i < len; i++) {
dview.setUint8(4 + i, dview1.getUint8(i));
}
return dview.buffer;
}
}
// 解码
async responseUserDecoder(data: any): Promise<MsgType.INetMessageResponse> {
// eslint-disable-next-line no-async-promise-executor
return new Promise(async resolve => {
const RequestUser: any = await this.initCreateUser();
const reader = new FileReader();
reader.readAsArrayBuffer(data);
reader.onload = function () {
const buf = new Uint8Array(reader.result as Uint8Array);
console.log(buf);
console.log(RequestUser);
const response = RequestUser.decode(buf).toJSON();
console.log(`💻接收到服务端【${messageType[response.messageid]}】消息`, response);
resolve(response);
};
});
}
}
export default new ProtobufMessage();