54 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			54 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | "use strict"; | ||
|  | 
 | ||
|  | // Actual implementation of the Performance class.
 | ||
|  | 
 | ||
|  | const clockIsAccurate = require("./clock-is-accurate"); | ||
|  | const calculateClockOffset = require("./calculate-clock-offset"); | ||
|  | const { hrtime, toMS } = require("./utils"); | ||
|  | 
 | ||
|  | const kTimeOrigin = Symbol("time origin"); | ||
|  | const kTimeOriginTimestamp = Symbol("time origin timestamp"); | ||
|  | 
 | ||
|  | class Performance { | ||
|  |   constructor() { | ||
|  |     // Time origin.
 | ||
|  |     const timeOrigin = hrtime(); | ||
|  |     this[kTimeOrigin] = timeOrigin; | ||
|  | 
 | ||
|  |     if (clockIsAccurate) { | ||
|  |       // Let |t1| be the DOMHighResTimeStamp representing the high resolution Unix time at which the global monotonic
 | ||
|  |       // clock is zero. This has to be calculated for every Performance object to account for clock drifts.
 | ||
|  |       const t1 = calculateClockOffset(); | ||
|  | 
 | ||
|  |       // Let |t2| be the DOMHighResTimeStamp representing the high resolution time value of the global monotonic clock
 | ||
|  |       // at global's time origin.
 | ||
|  |       const t2 = toMS(timeOrigin); | ||
|  | 
 | ||
|  |       // Return the sum of |t1| and |t2|.
 | ||
|  |       this[kTimeOriginTimestamp] = t1 + t2; | ||
|  |     } else { | ||
|  |       // Clock isn't accurate enough. Use millisecond accuracy per spec.
 | ||
|  |       const cur = Date.now(); | ||
|  |       this[kTimeOriginTimestamp] = cur; | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   // The timeOrigin getter actually returns the time origin timestamp, not the raw time origin.
 | ||
|  |   get timeOrigin() { | ||
|  |     return this[kTimeOriginTimestamp]; | ||
|  |   } | ||
|  | 
 | ||
|  |   now() { | ||
|  |     const diff = toMS(hrtime(this[kTimeOrigin])); | ||
|  |     return clockIsAccurate ? diff : Math.round(diff); | ||
|  |   } | ||
|  | 
 | ||
|  |   toJSON() { | ||
|  |     return { | ||
|  |       timeOrigin: this.timeOrigin | ||
|  |     }; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = { Performance }; |