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