diff --git a/src/main.ts b/src/main.ts index 592de58b25b55bca622e801e07c5712668d82958..b554ede07a6965ac090a3e780a793d4e5a69be6c 100644 --- a/src/main.ts +++ b/src/main.ts @@ -42,6 +42,8 @@ VXETable.config({ import { ElDialog } from 'element-plus'; ElDialog.props.closeOnClickModal.default = false; +import "@/utils/hackTimer" + const app = createApp(App); app.use(HighLight); diff --git a/src/utils/hackTimer.js b/src/utils/hackTimer.js new file mode 100644 index 0000000000000000000000000000000000000000..8ec5b91060067fb73e053477cab46f56a7d8b4a9 --- /dev/null +++ b/src/utils/hackTimer.js @@ -0,0 +1,147 @@ +(function (workerScript) { + if (!/MSIE 10/i.test (navigator.userAgent)) { + try { + let blob = new Blob (["\ +let fakeIdToId = {};\ +onmessage = function (event) {\ + let data = event.data,\ + name = data.name,\ + fakeId = data.fakeId,\ + time;\ + if(data.hasOwnProperty('time')) {\ + time = data.time;\ + }\ + switch (name) {\ + case 'setInterval':\ + fakeIdToId[fakeId] = setInterval(function () {\ + postMessage({fakeId: fakeId});\ + }, time);\ + break;\ + case 'clearInterval':\ + if (fakeIdToId.hasOwnProperty (fakeId)) {\ + clearInterval(fakeIdToId[fakeId]);\ + delete fakeIdToId[fakeId];\ + }\ + break;\ + case 'setTimeout':\ + fakeIdToId[fakeId] = setTimeout(function () {\ + postMessage({fakeId: fakeId});\ + if (fakeIdToId.hasOwnProperty (fakeId)) {\ + delete fakeIdToId[fakeId];\ + }\ + }, time);\ + break;\ + case 'clearTimeout':\ + if (fakeIdToId.hasOwnProperty (fakeId)) {\ + clearTimeout(fakeIdToId[fakeId]);\ + delete fakeIdToId[fakeId];\ + }\ + break;\ + }\ +}\ +"]); + // Obtain a blob URL reference to our worker 'file'. + workerScript = window.URL.createObjectURL(blob); + } catch (error) { + /* Blob is not supported, use external script instead */ + } + } + let worker, + fakeIdToCallback = {}, + lastFakeId = 0, + maxFakeId = 0x7FFFFFFF, // 2 ^ 31 - 1, 31 bit, positive values of signed 32 bit integer + logPrefix = 'HackTimer.js by turuslan: '; + if (typeof (Worker) !== 'undefined') { + function getFakeId () { + do { + if (lastFakeId == maxFakeId) { + lastFakeId = 0; + } else { + lastFakeId ++; + } + } while (fakeIdToCallback.hasOwnProperty (lastFakeId)); + return lastFakeId; + } + try { + worker = new Worker (workerScript); + window.reliableSetInterval = function (callback, time /* , parameters */) { + let fakeId = getFakeId (); + fakeIdToCallback[fakeId] = { + callback: callback, + parameters: Array.prototype.slice.call(arguments, 2) + }; + worker.postMessage ({ + name: 'setInterval', + fakeId: fakeId, + time: time + }); + return fakeId; + }; + window.reliableClearInterval = function (fakeId) { + if (fakeIdToCallback.hasOwnProperty(fakeId)) { + delete fakeIdToCallback[fakeId]; + worker.postMessage ({ + name: 'clearInterval', + fakeId: fakeId + }); + } + }; + window.reliableSetTimeout = function (callback, time /* , parameters */) { + let fakeId = getFakeId (); + fakeIdToCallback[fakeId] = { + callback: callback, + parameters: Array.prototype.slice.call(arguments, 2), + isTimeout: true + }; + worker.postMessage ({ + name: 'setTimeout', + fakeId: fakeId, + time: time + }); + return fakeId; + }; + window.reliableClearTimeout = function (fakeId) { + if (fakeIdToCallback.hasOwnProperty(fakeId)) { + delete fakeIdToCallback[fakeId]; + worker.postMessage ({ + name: 'clearTimeout', + fakeId: fakeId + }); + } + }; + worker.onmessage = function (event) { + let data = event.data, + fakeId = data.fakeId, + request, + parameters, + callback; + if (fakeIdToCallback.hasOwnProperty(fakeId)) { + request = fakeIdToCallback[fakeId]; + callback = request.callback; + parameters = request.parameters; + if (request.hasOwnProperty ('isTimeout') && request.isTimeout) { + delete fakeIdToCallback[fakeId]; + } + } + if (typeof (callback) === 'string') { + try { + callback = new Function (callback); + } catch (error) { + console.log (logPrefix + 'Error parsing callback code string: ', error); + } + } + if (typeof (callback) === 'function') { + callback.apply (window, parameters); + } + }; + worker.onerror = function (event) { + console.log (event); + }; + } catch (error) { + console.log (logPrefix + 'Initialisation failed'); + console.error (error); + } + } else { + console.log (logPrefix + 'Initialisation failed - HTML5 Web Worker is not supported'); + } +}) ('HackTimerWorker.js'); \ No newline at end of file diff --git a/src/utils/websocket.ts b/src/utils/websocket.ts index d4dd8a87649d32f9c38ba535ce47ff09a213bf22..d319e4b57b104994103e18f370eacc1f913899b3 100644 --- a/src/utils/websocket.ts +++ b/src/utils/websocket.ts @@ -19,8 +19,10 @@ */ import { getToken } from '@/utils/auth'; -import { ElNotification } from 'element-plus'; import useNoticeStore from '@/store/modules/notice'; +import { ElNotification } from "element-plus"; + +const { addNotice } = useNoticeStore(); let socketUrl: any = ''; // socket地址 let websocket: any = null; // websocket 实例 @@ -71,13 +73,13 @@ export const websocketclose = () => { export const resetHeart = () => { socketHeart = 0; socketError = 0; - clearInterval(heartTime); + (window as any).reliableClearInterval(heartTime); sendSocketHeart(); }; // socket心跳发送 export const sendSocketHeart = () => { - heartTime = setInterval(() => { + heartTime = (window as any).reliableSetInterval(() => { // 如果连接正常则发送心跳 if (websocket.readyState == 1) { // if (socketHeart <= 30) { @@ -97,7 +99,7 @@ export const sendSocketHeart = () => { // socket重连 export const reconnect = () => { if (socketError <= 2) { - clearInterval(heartTime); + (window as any).reliableClearInterval(heartTime); initWebSocket(socketUrl); socketError = socketError + 1; // eslint-disable-next-line prettier/prettier @@ -105,7 +107,7 @@ export const reconnect = () => { } else { // eslint-disable-next-line prettier/prettier console.log('重试次数已用完'); - clearInterval(heartTime); + (window as any).reliableClearInterval(heartTime); } }; @@ -123,7 +125,7 @@ export const websocketonmessage = () => { if (e.data.indexOf('ping') > 0) { return; } - useNoticeStore().addNotice({ + addNotice({ message: e.data, read: false, time: new Date().toLocaleString() @@ -133,7 +135,7 @@ export const websocketonmessage = () => { message: e.data, type: 'success', duration: 3000 - }); + }) return e.data; }; };