mark(name, options) { const mark = new PerformanceMark(name, options); enqueue(mark); bufferUserTiming(mark); return mark; } function calculateStartDuration(startOrMeasureOptions, endMark) { startOrMeasureOptions ??= 0; let start; let end; let duration; let optionsValid = false; if (typeof startOrMeasureOptions === 'object') { ({ start, end, duration } = startOrMeasureOptions); optionsValid = start !== undefined || end !== undefined; } if (optionsValid) { if (endMark !== undefined) { throw new ERR_PERFORMANCE_MEASURE_INVALID_OPTIONS( 'endMark must not be specified'); } if (start === undefined && end === undefined) { throw new ERR_PERFORMANCE_MEASURE_INVALID_OPTIONS( 'One of options.start or options.end is required'); } if (start !== undefined && end !== undefined && duration !== undefined) { throw new ERR_PERFORMANCE_MEASURE_INVALID_OPTIONS( 'Must not have options.start, options.end, and ' + 'options.duration specified'); } } if (endMark !== undefined) { end = getMark(endMark); } else if (optionsValid && end !== undefined) { end = getMark(end); } else if (optionsValid && start !== undefined && duration !== undefined) { end = getMark(start) + getMark(duration); } else { end = now(); } if (typeof startOrMeasureOptions === 'string') { start = getMark(startOrMeasureOptions); } else if (optionsValid && start !== undefined) { start = getMark(start); } else if (optionsValid && duration !== undefined && end !== undefined) { start = end - getMark(duration); } else { start = 0; } duration = end - start; return { start, duration }; } function measure(name, startOrMeasureOptions, endMark) { validateString(name, 'name'); const { start, duration, } = calculateStartDuration(startOrMeasureOptions, endMark); let detail = startOrMeasureOptions?.detail; detail = detail != null ? structuredClone(detail) : null; const measure = createPerformanceMeasure(name, start, duration, detail); enqueue(measure); bufferUserTiming(measure); return measure; } function clearMarkTimings(name) { if (name !== undefined) { name = `${name}`; if (nodeTimingReadOnlyAttributes.has(name)) throw new ERR_INVALID_ARG_VALUE('name', name); markTimings.delete(name); return; } markTimings.clear(); } module.exports = { PerformanceMark, PerformanceMeasure, clearMarkTimings, mark, measure, };