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