'use strict'; const { customInspectSymbol: kInspect, } = require('internal/util'); const { format } = require('util'); const { Map, Symbol } = primordials; const { ERR_INVALID_ARG_TYPE, ERR_INVALID_ARG_VALUE, } = require('internal/errors').codes; const kDestroy = Symbol('kDestroy'); const kHandle = Symbol('kHandle'); // Histograms are created internally by Node.js and used to // record various metrics. This Histogram class provides a // generally read-only view of the internal histogram. class Histogram { #handle = undefined; #map = new Map(); constructor(internal) { this.#handle = internal; } [kInspect]() { const obj = { min: this.min, max: this.max, mean: this.mean, exceeds: this.exceeds, stddev: this.stddev, percentiles: this.percentiles, }; return `Histogram ${format(obj)}`; } get min() { return this.#handle ? this.#handle.min() : undefined; } get max() { return this.#handle ? this.#handle.max() : undefined; } get mean() { return this.#handle ? this.#handle.mean() : undefined; } get exceeds() { return this.#handle ? this.#handle.exceeds() : undefined; } get stddev() { return this.#handle ? this.#handle.stddev() : undefined; } percentile(percentile) { if (typeof percentile !== 'number') throw new ERR_INVALID_ARG_TYPE('percentile', 'number', percentile); if (percentile <= 0 || percentile > 100) throw new ERR_INVALID_ARG_VALUE.RangeError('percentile', percentile); return this.#handle ? this.#handle.percentile(percentile) : undefined; } get percentiles() { this.#map.clear(); if (this.#handle) this.#handle.percentiles(this.#map); return this.#map; } reset() { if (this.#handle) this.#handle.reset(); } [kDestroy]() { this.#handle = undefined; } get [kHandle]() { return this.#handle; } } module.exports = { Histogram, kDestroy, kHandle, };