38 lines
		
	
	
		
			901 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			38 lines
		
	
	
		
			901 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| const internals = {
 | |
|     maxTimer: 2 ** 31 - 1              // ~25 days
 | |
| };
 | |
| 
 | |
| 
 | |
| module.exports = function (timeout, returnValue, options) {
 | |
| 
 | |
|     if (typeof timeout === 'bigint') {
 | |
|         timeout = Number(timeout);
 | |
|     }
 | |
| 
 | |
|     if (timeout >= Number.MAX_SAFE_INTEGER) {         // Thousands of years
 | |
|         timeout = Infinity;
 | |
|     }
 | |
| 
 | |
|     if (typeof timeout !== 'number' && timeout !== undefined) {
 | |
|         throw new TypeError('Timeout must be a number or bigint');
 | |
|     }
 | |
| 
 | |
|     return new Promise((resolve) => {
 | |
| 
 | |
|         const _setTimeout = options ? options.setTimeout : setTimeout;
 | |
| 
 | |
|         const activate = () => {
 | |
| 
 | |
|             const time = Math.min(timeout, internals.maxTimer);
 | |
|             timeout -= time;
 | |
|             _setTimeout(() => (timeout > 0 ? activate() : resolve(returnValue)), time);
 | |
|         };
 | |
| 
 | |
|         if (timeout !== Infinity) {
 | |
|             activate();
 | |
|         }
 | |
|     });
 | |
| };
 |