index.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import { v4 } from 'uuid'
  2. import { Package50 } from '@/utils/websocket/package'
  3. import { FunCode } from '@/constants/funcode'
  4. import { sessionData } from '@/stores'
  5. import { IMessageHead } from './protobuf/proto'
  6. import { TradeRequest, TradeResponse } from './interface'
  7. import Protobuf from './protobuf'
  8. import socket from '../index'
  9. /**
  10. * 构建消息头部
  11. */
  12. function getProtoHeader(funCode: keyof typeof FunCode, header?: IMessageHead, marketId?: number) {
  13. // 组合请求头
  14. const protoHeader: IMessageHead = {
  15. FunCode: FunCode[funCode],
  16. UUID: v4(),
  17. UserID: sessionData.getLoginInfo('UserID'),
  18. ...(header ?? {})
  19. }
  20. if (marketId) {
  21. protoHeader.MarketID = marketId;
  22. }
  23. return protoHeader;
  24. }
  25. /**
  26. * 向交易服务器发送请求
  27. * @param params 请求参数
  28. * @param reqKey 请求代码
  29. * @param rspKey 回调代码
  30. * @param marketId 市场ID
  31. */
  32. function tradeServerMiddleware<Req, Rsp>(reqKey: keyof typeof FunCode, rspKey: keyof typeof FunCode, params: TradeRequest<Req, Rsp>, marketId?: number): Promise<Rsp> {
  33. params.data.Header = getProtoHeader(reqKey, params.data.Header, marketId);
  34. console.log(reqKey, FunCode[reqKey], params.data);
  35. return new Promise((resolve, reject) => {
  36. Protobuf.requestEncode(reqKey, params.data).then((res) => {
  37. // 发送消息
  38. socket.sendTradeServer({
  39. data: {
  40. rspCode: FunCode[rspKey],
  41. payload: new Package50(FunCode[reqKey], res)
  42. },
  43. success: (raw) => {
  44. Protobuf.responseDecode<Rsp>(rspKey, raw.content).then((res) => {
  45. console.log(rspKey, FunCode[rspKey], res);
  46. resolve(res);
  47. }).catch(() => {
  48. console.error(rspKey, raw);
  49. reject('报文解析失败');
  50. })
  51. },
  52. fail: (err) => {
  53. console.error(reqKey, err);
  54. reject(err);
  55. }
  56. })
  57. }).catch((msg) => {
  58. console.error(reqKey, msg);
  59. reject('报文构建失败');
  60. })
  61. })
  62. }
  63. /**
  64. * 向交易服务器发送请求
  65. * @param reqKey
  66. * @param rspKey
  67. * @param params
  68. * @param marketId
  69. */
  70. export async function tradeServerRequest<Req, Rsp>(reqKey: keyof typeof FunCode, rspKey: keyof typeof FunCode, params: TradeRequest<Req, Rsp & TradeResponse>, marketId?: number) {
  71. const { success, fail, complete } = params;
  72. await tradeServerMiddleware(reqKey, rspKey, params, marketId).then((res) => {
  73. const { RetCode, RetDesc } = res;
  74. switch (RetCode) {
  75. case 0: {
  76. success && success(res);
  77. return Promise.resolve();
  78. }
  79. case -1: {
  80. // 管理端错误消息
  81. return Promise.reject(RetDesc);
  82. }
  83. case 12018: {
  84. if (RetDesc) {
  85. // 解析base64
  86. res.RetDesc = Buffer.from(RetDesc, 'base64').toString();
  87. }
  88. return Promise.reject(res.RetDesc);
  89. }
  90. default: {
  91. const msg = (RetDesc || RetCode).toString();
  92. return Promise.reject(msg);
  93. }
  94. }
  95. }).catch((err) => {
  96. fail && fail(err);
  97. return Promise.reject(err);
  98. }).finally(() => {
  99. complete && complete();
  100. })
  101. }