/* 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, };