60 lines
1.3 KiB
JavaScript
60 lines
1.3 KiB
JavaScript
/* eslint-env browser */
|
|
|
|
const EventEmitter = require('events');
|
|
|
|
const POLL_INTERVAL_MS = 5 * 1000;
|
|
const IDLE_THRESHOLD_MS = 20;
|
|
|
|
class IdleDetector extends EventEmitter {
|
|
constructor() {
|
|
super();
|
|
this.handle = null;
|
|
this.timeoutId = null;
|
|
}
|
|
|
|
start() {
|
|
window.log.info('Start idle detector');
|
|
this._scheduleNextCallback();
|
|
}
|
|
|
|
stop() {
|
|
if (!this.handle) {
|
|
return;
|
|
}
|
|
|
|
window.log.info('Stop idle detector');
|
|
this._clearScheduledCallbacks();
|
|
}
|
|
|
|
_clearScheduledCallbacks() {
|
|
if (this.handle) {
|
|
cancelIdleCallback(this.handle);
|
|
this.handle = null;
|
|
}
|
|
|
|
if (this.timeoutId) {
|
|
clearTimeout(this.timeoutId);
|
|
this.timeoutId = null;
|
|
}
|
|
}
|
|
|
|
_scheduleNextCallback() {
|
|
this._clearScheduledCallbacks();
|
|
this.handle = window.requestIdleCallback(deadline => {
|
|
const { didTimeout } = deadline;
|
|
const timeRemaining = deadline.timeRemaining();
|
|
const isIdle = timeRemaining >= IDLE_THRESHOLD_MS;
|
|
this.timeoutId = setTimeout(
|
|
() => this._scheduleNextCallback(),
|
|
POLL_INTERVAL_MS
|
|
);
|
|
if (isIdle || didTimeout) {
|
|
this.emit('idle', { timestamp: Date.now(), didTimeout, timeRemaining });
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
IdleDetector,
|
|
};
|