| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- import { defineStore } from "pinia";
- import verConfig from "@/ver.config";
- import { Toast } from "@/utils";
- import { useUserStore } from "./user";
- const state = () => ({
- socket: null,
- heartBeatInterval: null,
- connectNum: 1,
- timeout: 30000,
- heartbeatInterval: null,
- reconnectTimeOut: null,
- is_open_socket: false,
- traderDetailIndex: 100,
- accountStateIndex: 100,
- followFlake: false,
- init: false,
- networkStatus: true,
- socket_id: ''
- })
- export const useSocketStore = defineStore('socket', {
- state,
- getters: {
- socketId() {
- return this.socket_id;
- }
- },
- actions: {
- connect() {
- this.socket = uni.connectSocket({
- url: verConfig.wsUrl,
- success: () => { console.log("Connection successful") }
- })
- this.socket.onOpen(() => this.onOpen());
- this.socket.onMessage((res) => this.onMessage(res));
- this.socket.onClose(() => this.onClose());
- },
- CALLBACK(res) {
- if (res.isConnected) {
- this.traderDetailIndex = 2;
- this.connect()
- }
- },
- send(_data) {
- if (this.socket) {
- this.socket.send({
- data: JSON.stringify(_data),
- async success() { },
- });
- }
- },
- onOpen(event) {
- uni.$emit('socketStatus', true);
- if (!this.networkStatus) {
- uni.offNetworkStatusChange(this.CALLBACK);
- }
- this.networkStatus = true;
- this.connectNum = 1;
- // this.send({ "event": "pusher:subscribe", "data": { "auth": "", "channel": "chat" } });
- clearInterval(this.reconnectTimeOut)
- clearInterval(this.heartbeatInterval)
- this.is_open_socket = true;
- this.start();
- },
- onMessage(res) {
- const useUser = useUserStore();
- const messageData = JSON.parse(res.data || '{}');
- const message = (messageData.data && messageData.data != '{}') ? JSON.parse(messageData.data) : {};
- if (Object.keys(message).length && messageData.event != 'pusher:connection_established') { uni.$emit('$onMessage', { event: messageData.event, channel: messageData.channel || '', data: message }) }
- if (messageData.event === 'pusher:connection_established') {
- this.timeout = Number(message.activity_timeout) * 1000;
- this.socket_id = message.socket_id;
- if (useUser.getuserInfo.id && message.socket_id) return useUser.setAuth({ id: useUser.getuserInfo.id, socket_id: message.socket_id });
- }
- },
- onClose() {
- clearInterval(this.heartbeatInterval)
- clearInterval(this.reconnectTimeOut)
- this.is_open_socket = false;
- this.socket = null
- if (this.connectNum < 6) {
- this.reconnect();
- } else {
- uni.$emit('connectError');
- this.networkStatus = false;
- uni.onNetworkStatusChange(this.CALLBACK);
- this.connectNum = 1
- }
- },
- checkStatus() {
- console.log("检查状态")
- clearInterval(this.reconnectTimeOut)
- const { readyState } = this.socket
- if (!this.socket || [2, 3].includes(readyState)) {
- console.log("未链接!")
- return false;
- }
- return true;
- },
- start() {
- this.heartbeatInterval = setInterval(() => {
- this.send({ "event": "pusher:ping", "data": {} });
- }, this.timeout)
- },
- reconnect() {
- clearInterval(this.heartbeatInterval)
- if (!this.is_open_socket && (this.traderDetailIndex == 2 || this.accountStateIndex == 0 || this
- .followFlake)) {
- console.log("5秒后重新连接...")
- this.reconnectTimeOut = setInterval(() => {
- this.connect();
- }, 5000)
- }
- },
- closeScoket() {
- if (!this.is_open_socket) return;
- this.socket.close({
- success() { Toast('Scoket 关闭成功') }
- });
- },
- setSate(_state = {}) {
- let keys = Object.keys(_state);
- if (keys.length) {
- this[keys[0]] = _state[keys[0]]
- }
- }
- }
- })
|