import { common, user } from '../proto/bundle.js'; const protoMap = {} function getEncodeFun(servant) { return protoMap[servant.toString()].requestEncode; } function getDecodeFun(servant) { return protoMap[servant.toString()].responseDecode } function getMsgWebsocket(version, server, servant, buffer) { return common.MsgWebsocket.create({ version: version, app: 1, server: server, servant: servant, data: buffer, }) } function getRequestBuffer(request, buffer){ let requestMessage = getMsgWebsocket(1, request.server, request.servant, buffer) let requestBuffer = common.MsgWebsocket.encode(requestMessage).finish() return new Uint8Array([...requestBuffer]).buffer } function getResponseDataBuf(response){ let resBuf = Buffer.from(response.data) let resMessage = common.MsgWebsocket.decode(resBuf) return resMessage.data } //1005 是后端提供的此接口的servant protoMap['1005'] = { requestEncode: function(request) { //登录请求的编码 //创建login_req的message对象 let loginMessage = user.login_req.create({ type: request.data.type, //如果phone定义的是bytes,这里要转换一下, //如果phone定义的是string,这里就不需要Buffer.from了 //要确认phone是string类型,才能把phone的bytes更换成string phone: Buffer.from(request.data.phone), //同phone,在proto文件中字段名(verifyInfo)最好用驼峰命名规则,不要用verify_info verifyInfo: Buffer.from(request.data.verifyInfo), }) //login_req的message 编码转换为Buffer数据 let buffer = user.login_req.encode(loginMessage).finish() //返回请求的ArrayBuffer return getRequestBuffer(request,buffer) }, responseDecode: function(response) { //登录响应的解码 //得到loginRsp message的buffer数据 let loginRspBuf = getResponseDataBuf(response) //解码得到loginRsp的message对象 let loginRspMessage = user.login_rsp.decode(loginRspBuf) //把loginRsp Message对象转换为js对象 let obj = user.login_rsp.toObject(loginRspMessage, { longs: String, enums: String, }) //如果proto定义的字段是bytes,在这里可以转换成一下String //也可以直接在proto文件中把字段的bytes 类型 替换成string类型, //但是要确认这个字段是string类型的,string类型在这里就不需要转换了 if(typeof obj.errInfo.errorMessage !== 'undefined'){ obj.errInfo.errorMessage = Buffer.from(obj.errInfo.errorMessage).toString() } if(typeof obj.token !== 'undefined'){ obj.token = Buffer.from(obj.token).toString() } return obj } } module.exports = { getEncodeFun, getDecodeFun, }