38 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			38 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | "use strict"; | ||
|  | 
 | ||
|  | // This files implements the calculation of the offset between the global monotonic clock and UNIX time. This value is
 | ||
|  | // known as |t1| in the calculation of "time origin timestamp" in the spec. This value needs to be calculated once and
 | ||
|  | // can be used in all subsequent Performance instances.
 | ||
|  | //
 | ||
|  | // However, if the clock is not fast enough, the export is undefined to signify that we should use Date.now() to get the
 | ||
|  | // time origin timestamp with millisecond accuracy, per spec.
 | ||
|  | 
 | ||
|  | const { getGlobalMonotonicClockMS } = require("./global-monotonic-clock"); | ||
|  | const clockIsAccurate = require("./clock-is-accurate"); | ||
|  | 
 | ||
|  | // This function assumes the clock is accurate.
 | ||
|  | function calculateClockOffset() { | ||
|  |   const start = Date.now(); | ||
|  |   let cur = start; | ||
|  |   while (cur === start) { | ||
|  |     cur = Date.now(); | ||
|  |   } | ||
|  | 
 | ||
|  |   // At this point |cur| "just" became equal to the next millisecond -- the unseen digits after |cur| are approximately
 | ||
|  |   // all 0, and |cur| is the closest to the actual value of the UNIX time. Now, get the current global monotonic clock
 | ||
|  |   // value and do the remaining calculations.
 | ||
|  | 
 | ||
|  |   return cur - getGlobalMonotonicClockMS(); | ||
|  | } | ||
|  | 
 | ||
|  | if (clockIsAccurate) { | ||
|  |   // Warm up the function.
 | ||
|  |   calculateClockOffset(); | ||
|  |   calculateClockOffset(); | ||
|  |   calculateClockOffset(); | ||
|  | 
 | ||
|  |   module.exports = calculateClockOffset; | ||
|  | } else { | ||
|  |   module.exports = undefined; | ||
|  | } |