index.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. return new Promise((resolve, reject) => {
  35. Protobuf.requestEncode(reqCode, params.data).then((res) => {
  36. // 发送消息
  37. socket.sendTradeServer({
  38. data: {
  39. payload: new Package50(FunCode[reqCode], res)
  40. },
  41. success: (raw) => {
  42. if (raw.funCode === FunCode[rspCode]) {
  43. Protobuf.responseDecode<Rsp>(rspCode, raw.content).then((res) => {
  44. resolve(res);
  45. }).catch((msg) => {
  46. console.warn(rspCode, msg);
  47. reject('报文解析失败');
  48. })
  49. } else {
  50. console.warn('解析包错误', rspCode, rspCode);
  51. reject('解析包错误');
  52. }
  53. },
  54. fail: (err: any) => {
  55. console.error(reqCode, err);
  56. reject(err);
  57. }
  58. })
  59. }).catch((msg) => {
  60. console.error(reqCode, msg);
  61. reject('报文构建失败');
  62. })
  63. })
  64. }
  65. /**
  66. * 向交易服务器发送请求
  67. * @param params
  68. * @param reqCode
  69. * @param rspCode
  70. * @param marketId
  71. */
  72. export async function tradeServerRequest<Req, Rsp>(reqCode: keyof typeof FunCode, rspCode: keyof typeof FunCode, params: TradeRequest<Req, Rsp & TradeResponse>, marketId?: number) {
  73. const { success, fail, complete } = params;
  74. await tradeServerMiddleware(reqCode, rspCode, params, marketId).then((res) => {
  75. const { RetCode, RetDesc } = res;
  76. switch (RetCode) {
  77. case 0: {
  78. success && success(res);
  79. return Promise.resolve();
  80. }
  81. case -1: {
  82. // 管理端错误消息
  83. return Promise.reject(RetDesc);
  84. }
  85. case 12018: {
  86. if (RetDesc) {
  87. // 解析base64
  88. res.RetDesc = Buffer.from(RetDesc, 'base64').toString();
  89. }
  90. return Promise.reject(res.RetDesc);
  91. }
  92. default: {
  93. const msg = (RetDesc || RetCode).toString();
  94. return Promise.reject(msg);
  95. }
  96. }
  97. }).catch((err) => {
  98. fail && fail(err);
  99. return Promise.reject(err);
  100. }).finally(() => {
  101. complete && complete();
  102. })
  103. }