index.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import { MTP2WebSocket } from '@/utils/websocket'
  2. import { SendMessage } from '@/utils/websocket/interface'
  3. import { Package40, Package50 } from '@/utils/websocket/package'
  4. import { timerInterceptor } from '@/utils/timer'
  5. import { FunCode } from '@/constants/funcode'
  6. import { parseReceivePush } from './quote/build/decode'
  7. import protobuf from './trade/protobuf'
  8. import { checkToken, stopCheckToken, checkTokenLoop } from '@/business/common'
  9. import { errorInfoStore } from '@/stores'
  10. import service from '@/services'
  11. import eventBus from '@/services/bus'
  12. /**
  13. * 全局数据连接生命周期控制类
  14. */
  15. export default new (class {
  16. /** 行情服务 */
  17. private readonly quoteServer = new MTP2WebSocket(Package40);
  18. /** 交易服务 */
  19. private readonly tradeServer = new MTP2WebSocket(Package50);
  20. constructor() {
  21. this.quoteServer.onPush = (p) => {
  22. const { mainClassNumber, content } = p;
  23. if (mainClassNumber === 65 && content) {
  24. const result = parseReceivePush(content);
  25. // 通知上层 行情推送
  26. eventBus.$emit('QuotePushNotify', result);
  27. }
  28. }
  29. this.quoteServer.onReconnect = () => {
  30. // 通知上层 重新订阅商品
  31. eventBus.$emit('QuoteServerReconnectNotify');
  32. }
  33. this.tradeServer.onPush = (p) => {
  34. const { funCode, content } = p;
  35. const delay = 1000; // 延迟推送消息,防止短时间内重复请求
  36. switch (funCode) {
  37. case FunCode.LogoutRsp: {
  38. // 通知上层 用户登出
  39. protobuf.responseDecode<Proto.LogoutRsp>(FunCode[funCode], content).then(({ RetCode, RetDesc }) => {
  40. const msg = errorInfoStore.actions.getErrorInfoByCode(RetCode)
  41. const error = (RetDesc || RetCode).toString();
  42. eventBus.$emit('LogoutNotify', msg ?? error);
  43. })
  44. break;
  45. }
  46. case FunCode.MoneyChangedNotify: {
  47. timerInterceptor.debounce(() => {
  48. // 通知上层 资金变动
  49. eventBus.$emit('MoneyChangedNotify');
  50. }, delay, funCode.toString())
  51. break;
  52. }
  53. case FunCode.UserChangeNtf: {
  54. timerInterceptor.debounce(() => {
  55. // 账户信息变更通知
  56. eventBus.$emit('UserChangeNtf');
  57. }, delay, funCode.toString())
  58. break;
  59. }
  60. case FunCode.ListingOrderChangeNtf: {
  61. timerInterceptor.debounce(() => {
  62. // 挂牌委托变更广播通知
  63. eventBus.$emit('ListingOrderChangeNtf');
  64. }, delay, funCode.toString())
  65. break;
  66. }
  67. default: {
  68. if (funCode) {
  69. console.warn('接收到未定义的通知', funCode);
  70. }
  71. }
  72. }
  73. }
  74. this.tradeServer.onBeforeReconnect = () => {
  75. // 停止令牌校验
  76. stopCheckToken();
  77. }
  78. this.tradeServer.onReconnect = () => {
  79. // 重新进行令牌校验
  80. checkToken().then(() => checkTokenLoop());
  81. }
  82. }
  83. /** 主动连接行情服务 */
  84. async connectQuote() {
  85. const res = await service.onReady();
  86. await this.quoteServer.connect(res.quoteUrl);
  87. }
  88. /** 主动连接交易服务 */
  89. async connectTrade() {
  90. const res = await service.onReady();
  91. await this.tradeServer.connect(res.tradeUrl);
  92. }
  93. /** 向行情服务器发送请求 */
  94. async sendQuoteServer(msg: SendMessage<Package40>) {
  95. await this.connectQuote().catch((err) => {
  96. msg.fail && msg.fail(err);
  97. })
  98. return this.quoteServer.send(msg);
  99. }
  100. /** 向交易服务器发送请求 */
  101. async sendTradeServer(msg: SendMessage<Package50>) {
  102. await this.connectTrade().catch((err) => {
  103. msg.fail && msg.fail(err);
  104. })
  105. return this.tradeServer.send(msg);
  106. }
  107. /** 主动关闭行情服务 */
  108. closeQuoteServer() {
  109. this.quoteServer.close();
  110. }
  111. /** 主动关闭交易服务 */
  112. closeTradeServer() {
  113. this.tradeServer.close();
  114. }
  115. /** 关闭所有服务 */
  116. closeAll() {
  117. this.closeQuoteServer();
  118. this.closeTradeServer();
  119. }
  120. })