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