import getWsUrl from "./getWsUrl";
|
import {computed, onMounted, onUnmounted, ref} from "vue";
|
|
const createWs = (url)=>{
|
const wsUri = getWsUrl(url);
|
// 重连时间间隔 默认10秒
|
const reConnectDelay = 10 * 1000;
|
let timer = null;
|
let SOCKET = ref(null);
|
|
// 打开链接
|
const openSocket = ()=>{
|
// 初始化WebSocket 如果已经初始化 则什么都不做
|
if (SOCKET.value) {
|
return false;
|
}
|
WSClose();
|
WSInit();
|
}
|
|
const WSInit = ()=>{
|
// 未被初始化初始化
|
if (!isWSOpen.value) {
|
console.log('=====WSinit, url:', wsUri);
|
SOCKET.value = new WebSocket(wsUri);
|
SOCKET.value.onmessage = onWSMessage;
|
SOCKET.value.onopen = onWSOpen;
|
SOCKET.value.onerror = onWSError;
|
SOCKET.value.onclose = WSClose;
|
}
|
}
|
|
const onWSOpen = ()=>{
|
}
|
|
const onWSMessage = ()=>{
|
}
|
|
const onWSError = (Event)=>{
|
console.log('链接失败', wsUri);
|
WSClose(Event);
|
}
|
|
const WSClose = (Event)=>{
|
if (SOCKET.value) {
|
switch (SOCKET.value.readyState) {
|
case 0:
|
SOCKET.value.onopen = () => {
|
SOCKET.value.close();
|
console.log('链接关闭', wsUri, 'close事件对象:', Event);
|
SOCKET.value = null;
|
// 没有event对象 则为手动关闭
|
if (Event) {
|
reConnect();
|
}
|
}
|
break;
|
case 1:
|
SOCKET.value.close();
|
console.log('链接关闭', wsUri, 'close事件对象:', Event);
|
SOCKET.value = null;
|
// 没有event对象 则为手动关闭
|
if (Event) {
|
reConnect();
|
}
|
break;
|
case 2:
|
SOCKET.value.onclose = () => {
|
console.log('链接关闭', wsUri, 'close事件对象:', Event);
|
SOCKET.value = null;
|
// 没有event对象 则为手动关闭
|
if (Event) {
|
reConnect();
|
}
|
}
|
break;
|
case 3:
|
console.log('链接关闭', wsUri, 'close事件对象:', Event);
|
SOCKET.value = null;
|
// 没有event对象 则为手动关闭
|
if (Event) {
|
reConnect();
|
}
|
break;
|
}
|
}
|
}
|
|
// 重连
|
const reConnect = ()=>{
|
// 重连计时开始 就不另重连
|
if (timer) {
|
return;
|
}
|
timer = setTimeout(() => {
|
timer = null;
|
WSInit();
|
}, reConnectDelay);
|
}
|
|
const isWSOpen= computed(()=>{
|
return SOCKET.value && 1 === SOCKET.value.readyState;
|
});
|
|
onMounted(()=>{
|
openSocket();
|
})
|
|
onUnmounted(()=>{
|
WSClose();
|
})
|
|
return {
|
SOCKET,
|
onWSOpen,
|
onWSMessage
|
};
|
}
|
|
export default createWs;
|