You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			61 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			61 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,
 | 
						|
};
 |