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;