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