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