From 09ee2d4ea296ed02d8cb5e4d4172d83ddf98979d Mon Sep 17 00:00:00 2001 From: Daniel Gasienica Date: Wed, 21 Mar 2018 15:45:39 -0400 Subject: [PATCH] Switch to using `requestIdleCallback` Example: https://developer.mozilla.org/en-US/docs/Web/API/Background_Tasks_API#Example --- js/modules/idle_detector.js | 43 +++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/js/modules/idle_detector.js b/js/modules/idle_detector.js index 0ac975b64..2404b304e 100644 --- a/js/modules/idle_detector.js +++ b/js/modules/idle_detector.js @@ -1,36 +1,43 @@ -const desktopIdle = require('desktop-idle'); +/* eslint-env browser */ + const EventEmitter = require('events'); -const POLL_INTERVAL = 10; // seconds -const IDLE_THRESHOLD = POLL_INTERVAL; +const POLL_INTERVAL_MS = 10 * 1000; +const IDLE_THRESHOLD_MS = 25; class IdleDetector extends EventEmitter { constructor() { super(); - this.intervalId = null; + this.handle = null; + this.timeoutId = null; } start() { - this.stop(); - this.intervalId = setInterval(() => { - const idleDurationInSeconds = desktopIdle.getIdleTime(); - const isIdle = idleDurationInSeconds >= IDLE_THRESHOLD; - if (!isIdle) { - return; - } - - this.emit('idle', { idleDurationInSeconds }); - - }, POLL_INTERVAL * 1000); + this._scheduleNextCallback(); } stop() { - if (!this.intervalId) { - return; + if (this.handle) { + cancelIdleCallback(this.handle); } - clearInterval(this.intervalId); + if (this.timeoutId) { + clearTimeout(this.timeoutId); + } + } + + _scheduleNextCallback() { + this.stop(); + this.handle = requestIdleCallback((deadline) => { + const { didTimeout } = deadline; + const timeRemaining = deadline.timeRemaining(); + const isIdle = timeRemaining >= IDLE_THRESHOLD_MS; + if (isIdle || didTimeout) { + this.emit('idle', { timestamp: Date.now(), didTimeout, timeRemaining }); + } + this.timeoutId = setTimeout(() => this._scheduleNextCallback(), POLL_INTERVAL_MS); + }); } }