import type { RelativeTime, Duration, TimeStamp } from '@datadog/js-core/time' import { elapsed, timeStampNow, relativeNow } from '@datadog/js-core/time' export function createTimer() { let duration: Duration | undefined let startTime: TimeStamp | undefined let highPrecisionStartTime: RelativeTime | undefined return { startTimer(this: void) { // timeStampNow uses Date.now() internally, which is not high precision, but this is what is // used for other events, so we use it here as well. startTime = timeStampNow() // relativeNow uses performance.now() which is higher precision than Date.now(), so we use for // the duration highPrecisionStartTime = relativeNow() }, stopTimer(this: void) { duration = elapsed(highPrecisionStartTime!, relativeNow()) }, getDuration(this: void) { return duration }, getStartTime(this: void) { return startTime }, } }