You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
2.1 KiB
JavaScript
121 lines
2.1 KiB
JavaScript
import { env } from "./env";
|
|
import { useAuthStore } from "./store";
|
|
|
|
/**
|
|
* 最大链接次数
|
|
*/
|
|
const maxConnNum = 5;
|
|
/**
|
|
* 链接次数
|
|
*/
|
|
let connNum = 0;
|
|
|
|
/**
|
|
* 重连间隔
|
|
*/
|
|
const connTimeout = 5000;
|
|
let timer = undefined;
|
|
|
|
|
|
let ws = undefined;
|
|
const connect = () => {
|
|
if (!useAuthStore().isLogin) {
|
|
reconnect();
|
|
return;
|
|
}
|
|
if (ws != undefined) {
|
|
return;
|
|
}
|
|
ws = uni.connectSocket({
|
|
url: env.baseWs.replace('{host}',location.host) + '?Authorization=Bearer ' + useAuthStore().token,
|
|
multiple: false,
|
|
success: () => {
|
|
connNum = 0;
|
|
uni.onSocketClose(() => {
|
|
console.debug("websocket关闭")
|
|
// reconnect();
|
|
});
|
|
uni.onSocketOpen(() => {
|
|
console.debug("websocket已打开")
|
|
})
|
|
uni.onSocketError(() => {
|
|
console.debug("websocket错误重连")
|
|
reconnect();
|
|
})
|
|
uni.onSocketMessage(e => {
|
|
let data = {};
|
|
try {
|
|
data = JSON.parse(e.data);
|
|
} catch (e) {
|
|
data = e.data;
|
|
}
|
|
if (data?.action) {
|
|
uni.$emit(data.action, data);
|
|
} else {
|
|
uni.$emit("text ", data);
|
|
}
|
|
})
|
|
}, fail: () => {
|
|
connNum++;
|
|
if (connNum < maxConnNum) {
|
|
console.error("websocket重连次数已经用完");
|
|
} else {
|
|
reconnect();
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
const send = (action, data) => {
|
|
ws.send({ data: JSON.stringify({ action, data }) });
|
|
}
|
|
|
|
|
|
const reconnect = () => {
|
|
try {
|
|
if (ws != undefined) {
|
|
uni.closeSocket(ws)
|
|
ws = undefined
|
|
}
|
|
} catch (e) {
|
|
}
|
|
console.debug("websocket重连");
|
|
if (timer == undefined) {
|
|
timer = setTimeout(() => {
|
|
timer = undefined;
|
|
connect();
|
|
}, connTimeout);
|
|
}
|
|
}
|
|
|
|
const resetconnect = () => {
|
|
connNum = 0;
|
|
reconnect();
|
|
}
|
|
|
|
const close = () => {
|
|
try {
|
|
uni.closeSocket(ws)
|
|
ws = undefined
|
|
connNum = 0;
|
|
} catch (e) {
|
|
}
|
|
}
|
|
|
|
const useWebSocket = {
|
|
install(Vue) {
|
|
// connect();
|
|
}
|
|
}
|
|
|
|
setInterval(() => {
|
|
try {
|
|
ws.send({ data: "ping" });
|
|
} catch (e) {
|
|
|
|
}
|
|
}, 30000);
|
|
|
|
export {
|
|
connect, reconnect, resetconnect, close, send, useWebSocket
|
|
} |