| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- import { MTP2WebSocket } from '@/utils/websocket'
- import { SendMessage } from '@/utils/websocket/interface'
- import { Package40, Package50 } from '@/utils/websocket/package'
- import { timerInterceptor } from '@/utils/timer'
- import { FunCode } from '@/constants/funcode'
- import { parseReceivePush } from './quote/build/decode'
- import protobuf from './trade/protobuf'
- import { checkToken, stopCheckToken, checkTokenLoop } from '@/business/common'
- import { errorInfoStore } from '@/stores'
- import service from '@/services'
- import eventBus from '@/services/bus'
- /**
- * 全局数据连接生命周期控制类
- */
- export default new (class {
- /** 行情服务 */
- private readonly quoteServer = new MTP2WebSocket(Package40);
- /** 交易服务 */
- private readonly tradeServer = new MTP2WebSocket(Package50);
- constructor() {
- this.quoteServer.onPush = (p) => {
- const { mainClassNumber, content } = p;
- if (mainClassNumber === 65 && content) {
- const result = parseReceivePush(content);
- // 通知上层 行情推送
- eventBus.$emit('QuotePushNotify', result);
- }
- }
- this.quoteServer.onReconnect = () => {
- // 通知上层 重新订阅商品
- eventBus.$emit('QuoteServerReconnectNotify');
- }
- this.tradeServer.onPush = (p) => {
- const { funCode, content } = p;
- const delay = 1000; // 延迟推送消息,防止短时间内重复请求
- switch (funCode) {
- case FunCode.LogoutRsp: {
- // 通知上层 用户登出
- protobuf.responseDecode<Proto.LogoutRsp>(FunCode[funCode], content).then(({ RetCode, RetDesc }) => {
- const msg = errorInfoStore.actions.getErrorInfoByCode(RetCode)
- const error = (RetDesc || RetCode).toString();
- eventBus.$emit('LogoutNotify', msg ?? error);
- })
- break;
- }
- case FunCode.MoneyChangedNotify: {
- timerInterceptor.debounce(() => {
- // 通知上层 资金变动
- eventBus.$emit('MoneyChangedNotify');
- }, delay, funCode.toString())
- break;
- }
- case FunCode.UserChangeNtf: {
- timerInterceptor.debounce(() => {
- // 账户信息变更通知
- eventBus.$emit('UserChangeNtf');
- }, delay, funCode.toString())
- break;
- }
- case FunCode.ListingOrderChangeNtf: {
- timerInterceptor.debounce(() => {
- // 挂牌委托变更广播通知
- eventBus.$emit('ListingOrderChangeNtf');
- }, delay, funCode.toString())
- break;
- }
- default: {
- if (funCode) {
- console.warn('接收到未定义的通知', funCode);
- }
- }
- }
- }
- this.tradeServer.onBeforeReconnect = () => {
- // 停止令牌校验
- stopCheckToken();
- }
- this.tradeServer.onReconnect = () => {
- // 重新进行令牌校验
- checkToken().then(() => checkTokenLoop());
- }
- }
- /** 主动连接行情服务 */
- async connectQuote() {
- const res = await service.onReady();
- await this.quoteServer.connect(res.quoteUrl);
- }
- /** 主动连接交易服务 */
- async connectTrade() {
- const res = await service.onReady();
- await this.tradeServer.connect(res.tradeUrl);
- }
- /** 向行情服务器发送请求 */
- async sendQuoteServer(msg: SendMessage<Package40>) {
- await this.connectQuote().catch((err) => {
- msg.fail && msg.fail(err);
- })
- return this.quoteServer.send(msg);
- }
- /** 向交易服务器发送请求 */
- async sendTradeServer(msg: SendMessage<Package50>) {
- await this.connectTrade().catch((err) => {
- msg.fail && msg.fail(err);
- })
- return this.tradeServer.send(msg);
- }
- /** 主动关闭行情服务 */
- closeQuoteServer() {
- this.quoteServer.close();
- }
- /** 主动关闭交易服务 */
- closeTradeServer() {
- this.tradeServer.close();
- }
- /** 关闭所有服务 */
- closeAll() {
- this.closeQuoteServer();
- this.closeTradeServer();
- }
- })
|