protoMap1.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import {
  2. common,
  3. user
  4. } from '../proto/bundle.js';
  5. const protoMap = {}
  6. function getEncodeFun(servant) {
  7. return protoMap[servant.toString()].requestEncode;
  8. }
  9. function getDecodeFun(servant) {
  10. return protoMap[servant.toString()].responseDecode
  11. }
  12. function getMsgWebsocket(version, server, servant, buffer) {
  13. return common.MsgWebsocket.create({
  14. version: version,
  15. app: 1,
  16. server: server,
  17. servant: servant,
  18. data: buffer,
  19. })
  20. }
  21. function getRequestBuffer(request, buffer){
  22. let requestMessage = getMsgWebsocket(1, request.server, request.servant, buffer)
  23. let requestBuffer = common.MsgWebsocket.encode(requestMessage).finish()
  24. return new Uint8Array([...requestBuffer]).buffer
  25. }
  26. function getResponseDataBuf(response){
  27. let resBuf = Buffer.from(response.data)
  28. let resMessage = common.MsgWebsocket.decode(resBuf)
  29. return resMessage.data
  30. }
  31. //1005 是后端提供的此接口的servant
  32. protoMap['1005'] = {
  33. requestEncode: function(request) { //登录请求的编码
  34. //创建login_req的message对象
  35. let loginMessage = user.login_req.create({
  36. type: request.data.type,
  37. //如果phone定义的是bytes,这里要转换一下,
  38. //如果phone定义的是string,这里就不需要Buffer.from了
  39. //要确认phone是string类型,才能把phone的bytes更换成string
  40. phone: Buffer.from(request.data.phone),
  41. //同phone,在proto文件中字段名(verifyInfo)最好用驼峰命名规则,不要用verify_info
  42. verifyInfo: Buffer.from(request.data.verifyInfo),
  43. })
  44. //login_req的message 编码转换为Buffer数据
  45. let buffer = user.login_req.encode(loginMessage).finish()
  46. //返回请求的ArrayBuffer
  47. return getRequestBuffer(request,buffer)
  48. },
  49. responseDecode: function(response) { //登录响应的解码
  50. //得到loginRsp message的buffer数据
  51. let loginRspBuf = getResponseDataBuf(response)
  52. //解码得到loginRsp的message对象
  53. let loginRspMessage = user.login_rsp.decode(loginRspBuf)
  54. //把loginRsp Message对象转换为js对象
  55. let obj = user.login_rsp.toObject(loginRspMessage, {
  56. longs: String,
  57. enums: String,
  58. })
  59. //如果proto定义的字段是bytes,在这里可以转换成一下String
  60. //也可以直接在proto文件中把字段的bytes 类型 替换成string类型,
  61. //但是要确认这个字段是string类型的,string类型在这里就不需要转换了
  62. if(typeof obj.errInfo.errorMessage !== 'undefined'){
  63. obj.errInfo.errorMessage = Buffer.from(obj.errInfo.errorMessage).toString()
  64. }
  65. if(typeof obj.token !== 'undefined'){
  66. obj.token = Buffer.from(obj.token).toString()
  67. }
  68. return obj
  69. }
  70. }
  71. module.exports = {
  72. getEncodeFun,
  73. getDecodeFun,
  74. }