UNPKG

@opentelemetry/core

Version:

OpenTelemetry Core provides constants and utilities shared by all OpenTelemetry SDK packages.

124 lines (123 loc) • 3.63 kB
//#region src/common/time.ts const NANOSECOND_DIGITS = 9; const MILLISECONDS_TO_NANOSECONDS = Math.pow(10, 6); const SECOND_TO_NANOSECONDS = Math.pow(10, NANOSECOND_DIGITS); /** * Converts a number of milliseconds from epoch to HrTime([seconds, remainder in nanoseconds]). * @param epochMillis */ function millisToHrTime(epochMillis) { const epochSeconds = epochMillis / 1e3; return [Math.trunc(epochSeconds), Math.round(epochMillis % 1e3 * MILLISECONDS_TO_NANOSECONDS)]; } /** * Returns an hrtime calculated via performance component. * @param performanceNow */ function hrTime(performanceNow) { return addHrTimes(millisToHrTime(performance.timeOrigin), millisToHrTime(typeof performanceNow === "number" ? performanceNow : performance.now())); } /** * * Converts a TimeInput to an HrTime, defaults to _hrtime(). * @param time */ function timeInputToHrTime(time) { if (isTimeInputHrTime(time)) return time; else if (typeof time === "number") { if (time < performance.timeOrigin / 2) return hrTime(time); else return millisToHrTime(time); } else if (time instanceof Date) return millisToHrTime(time.getTime()); else throw TypeError("Invalid input type"); } /** * Returns a duration of two hrTime. * @param startTime * @param endTime */ function hrTimeDuration(startTime, endTime) { let seconds = endTime[0] - startTime[0]; let nanos = endTime[1] - startTime[1]; if (nanos < 0) { seconds -= 1; nanos += SECOND_TO_NANOSECONDS; } return [seconds, nanos]; } /** * Convert hrTime to timestamp, for example "2019-05-14T17:00:00.000123456Z" * @param time */ function hrTimeToTimeStamp(time) { const precision = NANOSECOND_DIGITS; const tmp = `${"0".repeat(precision)}${time[1]}Z`; const nanoString = tmp.substring(tmp.length - precision - 1); return (/* @__PURE__ */ new Date(time[0] * 1e3)).toISOString().replace("000Z", nanoString); } /** * Convert hrTime to nanoseconds. * @param time */ function hrTimeToNanoseconds(time) { return time[0] * SECOND_TO_NANOSECONDS + time[1]; } /** * Convert hrTime to microseconds. * @param time */ function hrTimeToMicroseconds(time) { return time[0] * 1e6 + time[1] / 1e3; } /** * Convert hrTime to milliseconds. * @param time */ function hrTimeToMilliseconds(time) { return time[0] * 1e3 + time[1] / 1e6; } /** * Convert hrTime to seconds. * @param time */ function hrTimeToSeconds(time) { return time[0] + time[1] / SECOND_TO_NANOSECONDS; } /** * check if time is HrTime * @param value */ function isTimeInputHrTime(value) { return Array.isArray(value) && value.length === 2 && typeof value[0] === "number" && typeof value[1] === "number"; } /** * check if input value is a correct types.TimeInput * @param value */ function isTimeInput(value) { return isTimeInputHrTime(value) || typeof value === "number" || value instanceof Date; } /** * Given 2 HrTime formatted times, return their sum as an HrTime. */ function addHrTimes(time1, time2) { const out = [time1[0] + time2[0], time1[1] + time2[1]]; if (out[1] >= SECOND_TO_NANOSECONDS) { out[1] -= SECOND_TO_NANOSECONDS; out[0] += 1; } return out; } //#endregion exports.addHrTimes = addHrTimes; exports.hrTime = hrTime; exports.hrTimeDuration = hrTimeDuration; exports.hrTimeToMicroseconds = hrTimeToMicroseconds; exports.hrTimeToMilliseconds = hrTimeToMilliseconds; exports.hrTimeToNanoseconds = hrTimeToNanoseconds; exports.hrTimeToSeconds = hrTimeToSeconds; exports.hrTimeToTimeStamp = hrTimeToTimeStamp; exports.isTimeInput = isTimeInput; exports.isTimeInputHrTime = isTimeInputHrTime; exports.millisToHrTime = millisToHrTime; exports.timeInputToHrTime = timeInputToHrTime; //# sourceMappingURL=time.cjs.map