63 lines
1.4 KiB
JavaScript
63 lines
1.4 KiB
JavaScript
|
// @flow
|
||
|
|
||
|
/**
|
||
|
* SET_INTERVAL constant is used to set interval and it is set in
|
||
|
* the id property of the request.data property. timeMs property must
|
||
|
* also be set. request.data example:
|
||
|
*
|
||
|
* {
|
||
|
* id: SET_INTERVAL,
|
||
|
* timeMs: 33
|
||
|
* }
|
||
|
*/
|
||
|
export const SET_INTERVAL = 1;
|
||
|
|
||
|
/**
|
||
|
* CLEAR_INTERVAL constant is used to clear the interval and it is set in
|
||
|
* the id property of the request.data property.
|
||
|
*
|
||
|
* {
|
||
|
* id: CLEAR_INTERVAL
|
||
|
* }
|
||
|
*/
|
||
|
export const CLEAR_INTERVAL = 2;
|
||
|
|
||
|
/**
|
||
|
* INTERVAL_TIMEOUT constant is used as response and it is set in the id
|
||
|
* property.
|
||
|
*
|
||
|
* {
|
||
|
* id: INTERVAL_TIMEOUT
|
||
|
* }
|
||
|
*/
|
||
|
export const INTERVAL_TIMEOUT = 3;
|
||
|
|
||
|
/**
|
||
|
* The following code is needed as string to create a URL from a Blob.
|
||
|
* The URL is then passed to a WebWorker. Reason for this is to enable
|
||
|
* use of setInterval that is not throttled when tab is inactive.
|
||
|
*/
|
||
|
const code = `
|
||
|
var timer;
|
||
|
|
||
|
onmessage = function(request) {
|
||
|
switch (request.data.id) {
|
||
|
case ${SET_INTERVAL}: {
|
||
|
timer = setInterval(() => {
|
||
|
postMessage({ id: ${INTERVAL_TIMEOUT} });
|
||
|
}, request.data.timeMs);
|
||
|
break;
|
||
|
}
|
||
|
case ${CLEAR_INTERVAL}: {
|
||
|
if (timer) {
|
||
|
clearInterval(timer);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
`;
|
||
|
|
||
|
export const timerWorkerScript
|
||
|
= URL.createObjectURL(new Blob([ code ], { type: 'application/javascript' }));
|