From f89c2eac877ea4fc5698d6b2b11c6b80ba21df7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E6=97=AD=E6=B9=98?= <3423729430@qq.com> Date: Tue, 7 May 2024 10:14:51 +0000 Subject: [PATCH] =?UTF-8?q?update=20src/utils/hackTimer.js.=20=E5=9C=A8wor?= =?UTF-8?q?ker=E4=B8=AD=E5=B0=81=E8=A3=85=E5=AE=9A=E6=97=B6=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 周旭湘 <3423729430@qq.com> --- src/utils/hackTimer.js | 147 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) diff --git a/src/utils/hackTimer.js b/src/utils/hackTimer.js index e69de29..8ec5b91 100644 --- a/src/utils/hackTimer.js +++ 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