index.ts 3.7 KB

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