@nsshunt/stsobservability 1.0.151 → 1.0.152
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs
CHANGED
|
@@ -24,8 +24,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
24
24
|
//#endregion
|
|
25
25
|
let lodash_clonedeep = require("lodash.clonedeep");
|
|
26
26
|
lodash_clonedeep = __toESM(lodash_clonedeep);
|
|
27
|
-
let
|
|
28
|
-
detect_node = __toESM(detect_node);
|
|
27
|
+
let _nsshunt_stsutils = require("@nsshunt/stsutils");
|
|
29
28
|
//#region src/instrumentation/instrumentDefs.ts
|
|
30
29
|
var Gauge = /* @__PURE__ */ function(Gauge) {
|
|
31
30
|
Gauge["ACTIVE_REQUEST_GAUGE"] = "a";
|
|
@@ -307,7 +306,7 @@ var InstrumentVelocity = class extends InstrumentBase {
|
|
|
307
306
|
this.#averageVelocity[i] = pushVal;
|
|
308
307
|
}
|
|
309
308
|
}, this.#timerInterval);
|
|
310
|
-
if (
|
|
309
|
+
if (_nsshunt_stsutils.isNode) this.#interval.unref();
|
|
311
310
|
}
|
|
312
311
|
#ComputeVelocityByTimeDiff(checkTimeDiff, checkDeltaTimeDiff) {
|
|
313
312
|
let val = 0;
|
|
@@ -1567,7 +1566,7 @@ var InstrumentGauge = class extends InstrumentBase {
|
|
|
1567
1566
|
const maxval = this.#GetAndResetMaxVal();
|
|
1568
1567
|
this.#timeSeriesList.push(maxval);
|
|
1569
1568
|
}, this.#timerInterval);
|
|
1570
|
-
if (
|
|
1569
|
+
if (_nsshunt_stsutils.isNode) this.#observer.unref();
|
|
1571
1570
|
} else throw new Error(`Unable to StartTimer for this instrument. The interval is set to <= 0.`);
|
|
1572
1571
|
}
|
|
1573
1572
|
StopTimer() {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["#options","#label","#data","#timerInterval","#valStackMaxLength","#copy","#autoComputeVelocity","#maxAverageValStack","#maxAverageIterations","#velocityTimeDiff","#vaTimeDiff","#autoComputeVelocityTimeout","#maxTimeDiff","#minTimeForReporting","#GetVal","#SetVal","#GetMaxVelocity","#GetDelta","#GetVelocity","#GetVelocityStackAverage","#GetTimeStamp","#GetCountDiff","#GetTimeDiff","#GetDeltaCountDiff","#GetDeltaTimeDif","#GetAverageVelocity","#valStack","#interval","#ComputeVelocity","#velocity","#averageValStack","#averageVelocity","#timeStamp","#velocityVal","#ComputeVelocityByTimeDiff","#valStackAverage","#delta","#countDiff","#timeDiff","#deltaCountDiff","#deltaTimeDif","#lastVelocity","#maxVelocity","#timeoutComputeVelocity","#SetupAutoComputeVelocity","#copy","#histogramData","#GetVal","#SetVal","#GetHistogramData","#SetHistogramData","#val","#maxSize","#copy","#useLatestMessages","#consoleLogging","#instrumentLogging","#winstonLogging","#GetVal","#SetVal","#DumpToConsole","#stsLogger","#messages","#readPos","#copy","#GetVal","#SetVal","#pauseVal","#start","#timerInterval","#maxSampleSize","#copy","#GetVal","#SetVal","#GetPercentileData","#GetMin","#GetMax","#GetAverage","#timeSeriesList","#observer","#GetAndResetMaxVal","#maxval","#lastObservedValue","#val","#observations","#total","#max","#min","#NumberCompare","#copy","#GetVal","#SetVal","#val"],"sources":["../src/instrumentation/instrumentDefs.ts","../src/instrumentation/instruments/instrumentBase.ts","../src/instrumentation/instruments/instrumentVelocity.ts","../src/instrumentation/instruments/instrumentHistogram.ts","../src/instrumentation/instruments/instrumentLog.ts","../src/instrumentation/instruments/instrumentTimerGauge.ts","../node_modules/timsort/build/timsort.js","../node_modules/timsort/index.js","../node_modules/percentile/lib/index.js","../src/instrumentation/instruments/instrumentGauge.ts","../src/instrumentation/instruments/instrumentObject.ts","../src/instrumentation/instrumentUtils.ts"],"sourcesContent":["export enum Gauge {\n\tACTIVE_REQUEST_GAUGE = 'a',\n\tAUTHENTICATION_COUNT_GAUGE = 'b',\n\tAUTHENTICATION_ERROR_COUNT_GAUGE = 'aa',\n\tAUTHENTICATION_RETRY_COUNT_GAUGE = 'ab',\n\tCONNECTION_POOL_IDLE_GAUGE = 'c',\n\tCONNECTION_POOL_TOTAL_GAUGE = 'd',\n\tCONNECTION_POOL_WAITING_GAUGE = 'e',\n\tCPU_LOAD_GAUGE = 'f',\n\tCPU_SYSTEM_LOAD_GAUGE = 'g',\n\tDURATION_GAUGE = 'h',\n\tDURATION_HISTOGRAM_GAUGE = 'i',\n\tERROR_COUNT_GAUGE = 'j',\n\tLATENCY_GAUGE = 'k',\n\tLATENCY_HISTOGRAM_GAUGE = 'l',\n\tLOGGER = 'm',\n\tLOGGER_COPY = 'n',\n\tNETWORK_RX_GAUGE = 'o',\n\tNETWORK_TX_GAUGE = 'p',\n\tREQUEST_COUNT_GAUGE = 'q',\n\tRETRY_COUNT_GAUGE = 'r',\n\tTIMER_GAUGE = 's',\n\tVELOCITY_GAUGE = 't',\n\tCONNECTION_COUNT_GAUGE = 'u',\n\tOBJECT_GAUGE = 'v',\n\tPAYLOAD_SIZE = 'w',\n\tCORE_COUNT_GAUGE = 'x',\n\tCHILD_COUNT = 'y',\n\tUNKNOWN = 'z'\n}\n\nexport enum GaugeTypes {\n\tGAUGE_TYPE = '_',\n\tINSTRUMENT_GAUGE = 'a',\n\tINSTRUMENT_VELOCITY = 'b',\n\tINSTRUMENT_HISTOGRAM = 'c',\n\tINSTRUMENT_LOG = 'd',\n\tINSTRUMENT_TIMER = 'e',\n\tINSTRUMENT_OBJECT = 'f'\n}\n","import { JSONObject } from '@nsshunt/stsutils'\nimport { Gauge, GaugeTypes } from '../instrumentDefs.js'\n\nexport class InstrumentBaseOptions {\n fixedSize?: number\n padLength?: number\n label?: string\n}\n\nexport class InstrumentBaseTelemetry {\n\n}\n\nexport abstract class InstrumentBase {\n #label = '';\n #options: InstrumentBaseOptions | null = null;\n #data: Record<string, unknown> = { };\n\n // Use for copy objects only.\n //protected _data: Record<string, any> = { };\n\n constructor(options: InstrumentBaseOptions = { })\n {\n if (typeof options === 'string' || options instanceof String) {\n throw new Error('Instrument parameter must be an options object.');\n }\n\n this.#options = options;\n\n if (options.label) {\n this.#label = options.label;\n } else {\n this.#label = 'InstrumentGauge';\n }\n\n // Create an object to store all props\n //Object.defineProperty(this, '_data', { value: { } });\n\n //@@ change all properties to use this pattern\n\n /*\n\t\t// https://github.com/Asymmetrik/node-fhir-server-core/blob/master/packages/node-fhir-server-core/src/server/resources/4_0_1/schemas/account.js\n\n\t\t// Create an object to store all props\n\t\tObject.defineProperty(this, '__data', { value: {} });\n\n\t\tObject.defineProperty(this, '_value', {\n\t\t\tenumerable: true,\n\t\t\tget: () => this.__data._value,\n\t\t\tset: (value) => {\n\t\t\tif (value === undefined || value === null) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.__data._value = value;\n\t\t\t}\n\t\t});\n\t\t*/\n\n // Define a default non-writable resourceType property\n /*\n\t\tObject.defineProperty(this, '_reportValue', {\n\t\t\tenumerable: true,\n\t\t\tget: () => this.GetFormatted()\n\t\t});\n\n\t\tObject.defineProperty(this, '_serialValue', {\n\t\t\tenumerable: true,\n\t\t\tget: () => this.GetSerialValue(),\n\t\t\tset: (value) => { this.SetSerialValue(value); }\n\t\t});\n\t\t*/\n }\n\n public [GaugeTypes.GAUGE_TYPE]: GaugeTypes = GaugeTypes.INSTRUMENT_OBJECT // Default Gauge type\n val?: number | string[] | JSONObject\n\n WithLabel(label: string) {\n this.label = label;\n return this;\n }\n\n DefineCopyProperties(propertyNames: string[]): void {\n propertyNames.forEach(propertyName => {\n Object.defineProperty(this, propertyName, {\n enumerable: true,\n get: () => this.#data[propertyName],\n set: (value) => {\n if (value === undefined) {\n return;\n }\n this.#data[propertyName] = value;\n }\n });\n });\n }\n\t\n GetNumber(val: number): number {\n if (Number.isInteger(val)) {\n return val;\n } else {\n return Math.round((val + Number.EPSILON) * 100) / 100;\n }\n }\n\n get options(): InstrumentBaseOptions | null {\n return this.#options;\n }\n\n set options(optionsValue: InstrumentBaseOptions | null) {\n this.#options = optionsValue;\n }\n\n get label(): string {\n return this.#label;\n }\n\n set label(labelValue: string) {\n this.#label = labelValue;\n }\n\n StopTimer(): void\n {\n //\tOverride in sub class if timers are used ...\n }\n\n ProcessTelemetry(telemetry: InstrumentBaseTelemetry): void {\n throw new Error(`Must override in extended class: [ProcessTelemetry]: [${telemetry}].`);\n }\n\n /*\n\ttoJSON()\n\t{\n\t\treturn this._serialValue;\n\t}\n\t*/\n\n /*\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols\n\t[Symbol.iterator]() {\n\t\t// Use a new index for each iterator. This makes multiple\n\t\t// iterations over the iterable safe for non-trivial cases,\n\t\t// such as use of break or nested looping over the same iterable.\n\t\tlet index = 0;\n\t\n\t\treturn {\n\t\t\tnext: () => {\n\t\t\t\tif (index < 1) {\n\t\t\t\t\treturn {value: this.GetFormatted(), done: false}\n\t\t\t\t} else {\n\t\t\t\t\treturn {done: true}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t*/\n}\n\nexport type Instruments = Partial<Record<Gauge, InstrumentBase>>\n","import _cloneDeep from 'lodash.clonedeep'\n\nimport { InstrumentBase, InstrumentBaseOptions, InstrumentBaseTelemetry } from './instrumentBase.js'\nimport { GaugeTypes } from '../instrumentDefs.js'\nimport { JSONObject } from '@nsshunt/stsutils'\nimport isNode from 'detect-node'\n\nexport interface VelocityReportValue extends JSONObject {\n\tval: number\n\tvalue: string\n\tvf: string\n\tdelta: number\n\tmaxVelocity: number\n\tvelocity: number\n\tva: number\n}\n\nexport class InstrumentVelocityOptions extends InstrumentBaseOptions {\n interval?: number\n valStackMaxLength?: number\n maxAverageValStack?: number\n maxAverageIterations?: number\n fromJSON?: InstrumentVelocity\n initValue?: number\n autoComputeVelocity?: boolean\n velocityTimeDiff?: number\n vaTimeDiff?: number\n autoComputeVelocityTimeout?: number\n}\n\nexport class InstrumentVelocityTelemetry extends InstrumentBaseTelemetry {\n val?: number\n Inc?: number\n}\n\ndeclare interface IDataPoint {\n\ttimeStamp: number\n\tcount: number\n}\n\ndeclare interface IVelocityDataPoint {\n\tval: number\n\tcountDiff: number\n\ttimeDiff: number\n\tdeltaVal: number\n\tdeltaCountDiff: number\n\tdeltaTimeDiff: number\n}\n\nexport class InstrumentVelocity extends InstrumentBase\n{\n // eslint-disable-next-line @/no-unused-private-class-members\n #val = 0;\n #interval: NodeJS.Timeout | null = null;\n #timeoutComputeVelocity: NodeJS.Timeout | null = null;\n // eslint-disable-next-line @/no-unused-private-class-members\n #lastVelocity = 0;\n #delta = 0;\n #maxVelocity = 0;\n #timerInterval = 0;\n #copy = false;\n #velocity = 0;\n #velocityVal = 0;\n #valStack: IDataPoint[] = [ ];\n #averageValStack: number[][] = [];\n #maxAverageValStack = 0;\n #maxAverageIterations = 0;\n // eslint-disable-next-line @/no-unused-private-class-members\n #valStackMaxLength = 0;\n #valStackAverage = 0.0;\n #timeStamp = 0;\n #maxTimeDiff = 0;\n #vaTimeDiff = 0;\n #velocityTimeDiff = 0;\n #autoComputeVelocity = false;\n #autoComputeVelocityTimeout = 0; // 50ms to auto computer after an update when not in auto compute mode.\n #countDiff = 0;\n #timeDiff = 0;\n #deltaCountDiff = 0;\n #deltaTimeDif = 0;\n #minTimeForReporting = 0;\n #averageVelocity: number[] = []\n\n // timeWindow = Number of intervals to use as the sliding time window same size. Uses average value within the time window. Larger window produces a smooth (more laggy) curve. Shorter time\n // window may be \"spikey\" depending on the volatility of the data being recorded.\n constructor(options: InstrumentVelocityOptions = { }) {\n super(options);\n\n if (typeof options.label === 'undefined') {\n this.label = 'InstrumentVelocity';\n } else {\n this.label = options.label;\n }\n\n if (typeof options.interval === 'undefined') {\n this.#timerInterval = 1000;\n } else {\n this.#timerInterval = options.interval;\n }\n\n if (typeof options.valStackMaxLength === 'undefined') {\n this.#valStackMaxLength = 100;\n } else {\n this.#valStackMaxLength = options.valStackMaxLength;\n }\n\n if (typeof options.fromJSON === 'undefined') {\n this.#copy = false;\n } else {\n this.#copy = true;\n }\n\n if (typeof options.autoComputeVelocity === 'undefined') {\n this.#autoComputeVelocity = false;\n } else {\n this.#autoComputeVelocity = options.autoComputeVelocity;\n }\n\n if (typeof options.maxAverageValStack === 'undefined') {\n this.#maxAverageValStack = 5;\n } else {\n this.#maxAverageValStack = options.maxAverageValStack;\n }\n\n if (typeof options.maxAverageIterations === 'undefined') {\n this.#maxAverageIterations = 3;\n } else {\n this.#maxAverageIterations = options.maxAverageIterations;\n }\n\n if (typeof options.velocityTimeDiff === 'undefined') {\n this.#velocityTimeDiff = 5000;\n } else {\n this.#velocityTimeDiff = options.velocityTimeDiff;\n }\n\n if (typeof options.vaTimeDiff === 'undefined') {\n this.#vaTimeDiff = 10000;\n } else {\n this.#vaTimeDiff = options.vaTimeDiff;\n }\n\n if (typeof options.autoComputeVelocityTimeout === 'undefined') {\n this.#autoComputeVelocityTimeout = 50;\n } else {\n this.#autoComputeVelocityTimeout = options.autoComputeVelocityTimeout;\n }\n\n this.#maxTimeDiff = this.#vaTimeDiff * 2;\n this.#minTimeForReporting = this.#vaTimeDiff + 2000;\n\n\n Object.defineProperty(this, GaugeTypes.GAUGE_TYPE, {\n enumerable: true,\n get: () => GaugeTypes.INSTRUMENT_VELOCITY\n });\n\n if (this.#copy) {\n this.DefineCopyProperties([\n 'val', 'maxVelocity', 'delta', 'velocity', 'va', 'timeStamp',\n 'deltaTimeDif', 'deltaCountDiff', 'timeDiff', 'countDiff', 'averageVelocity'\n ]);\n } else {\n Object.defineProperty(this, 'val', {\n enumerable: true,\n get: () => this.#GetVal(),\n set: (value) => { this.#SetVal(value); }\n });\n\n Object.defineProperty(this, 'maxVelocity', {\n enumerable: true,\n get: () => this.#GetMaxVelocity()\n });\n\n Object.defineProperty(this, 'delta', {\n enumerable: true,\n get: () => this.#GetDelta()\n });\n\n Object.defineProperty(this, 'velocity', {\n enumerable: true,\n get: () => this.#GetVelocity()\n });\n\n Object.defineProperty(this, 'va', {\n enumerable: true,\n get: () => this.#GetVelocityStackAverage()\n });\n\n Object.defineProperty(this, 'timeStamp', {\n enumerable: true,\n get: () => this.#GetTimeStamp()\n });\n\n Object.defineProperty(this, 'countDiff', {\n enumerable: true,\n get: () => this.#GetCountDiff()\n });\n\n Object.defineProperty(this, 'timeDiff', {\n enumerable: true,\n get: () => this.#GetTimeDiff()\n });\n\n Object.defineProperty(this, 'deltaCountDiff', {\n enumerable: true,\n get: () => this.#GetDeltaCountDiff()\n });\n\n Object.defineProperty(this, 'deltaTimeDif', {\n enumerable: true,\n get: () => this.#GetDeltaTimeDif()\n });\n\n Object.defineProperty(this, 'averageVelocity', {\n enumerable: true,\n get: () => this.#GetAverageVelocity()\n });\n\n if (this.#timerInterval > 0 && this.#autoComputeVelocity === false) {\n this._StartTimer();\n }\n }\n\n if (typeof options.initValue !== 'undefined') {\n this.val = options.initValue;\n }\n\n // Set copy values now that we have defined our properties\n if (typeof options.fromJSON !== 'undefined') {\n const result = _cloneDeep(options.fromJSON);\n this.val = result.val;\n this.velocity = result.velocity;\n this.maxVelocity = result.maxVelocity;\n this.delta = result.delta;\n this.va = result.va;\n this.timeStamp = result.timeStamp;\n this.countDiff = result.countDiff;\n this.timeDiff = result.timeDiff;\n this.deltaCountDiff = result.deltaCountDiff;\n this.deltaTimeDif = result.deltaTimeDif;\n this.averageVelocity = _cloneDeep(result.averageVelocity);\n }\n }\n\n public readonly maxVelocity: number = 0;\n public readonly delta: number = 0;\n public readonly velocity: number = 0;\n public readonly va: number = 0;\n public readonly timeStamp: number = 0;\n public readonly countDiff: number = 0;\n public readonly timeDiff: number = 0;\n public readonly deltaCountDiff: number = 0;\n public readonly deltaTimeDif: number = 0;\n public readonly averageVelocity: number[] = [];\n public val = 0;\n\n WithValStackMaxLength(valStackMaxLength: number): InstrumentVelocity {\n this.#valStackMaxLength = valStackMaxLength;\n this.#valStack = [ ];\n return this;\n }\n\n private _StartTimer(): void\n {\n this.#interval = setInterval(() => {\n this.#ComputeVelocity();\n\n let pushVal = this.#velocity;\n for (let i=0; i < this.#maxAverageIterations; i++) {\n if (!this.#averageValStack[i]) {\n this.#averageValStack[i] = [ ];\n }\n this.#averageValStack[i].push(pushVal);\n if (this.#averageValStack[i].length > this.#maxAverageValStack) {\n this.#averageValStack[i].shift();\n }\n pushVal = this.#averageValStack[i].reduce((prev, current) => prev + current) / this.#averageValStack[i].length;\n this.#averageVelocity[i] = pushVal;\n }\n }, this.#timerInterval);\n\n // If running in node ...\n if (isNode) {\n this.#interval.unref();\n }\n // https://httptoolkit.tech/blog/unblocking-node-with-unref/\n }\n\n #ComputeVelocityByTimeDiff(checkTimeDiff: number, checkDeltaTimeDiff: number): IVelocityDataPoint {\n // As long as we have at least two data points ...\n let val = 0.0;\n let deltaVal = 0.0;\n let countDiff = 0;\n let timeDiff = 0;\n let deltaCountDiff = 0;\n let deltaTimeDiff = 0;\n\n if (this.#valStack.length > 1 && (this.#valStack[this.#valStack.length-1].timeStamp - this.#valStack[0].timeStamp) > this.#minTimeForReporting) {\n // Get the current data point\n const dp: IDataPoint = this.#valStack[this.#valStack.length-1];\n // Compute the stack position for the first entry where the diff is >= timeDiff\n let timeDiffPos = -1;\n let deltaDiffPos = -1;\n for (let i = this.#valStack.length-2; i > -1; i--) {\n if (timeDiffPos === -1 && (this.#timeStamp - this.#valStack[i].timeStamp) >= checkTimeDiff) {\n timeDiffPos = i;\n if (checkDeltaTimeDiff === 0) {\n break;\n }\n }\n if (deltaDiffPos === -1 && (this.#timeStamp - this.#valStack[i].timeStamp) >= checkDeltaTimeDiff) {\n deltaDiffPos = i;\n }\n if (timeDiffPos !== -1 && deltaDiffPos !== -1) {\n break;\n }\n }\n if (timeDiffPos > -1) {\n countDiff = dp.count - this.#valStack[timeDiffPos].count;\n if (countDiff > 0) {\n timeDiff = dp.timeStamp - this.#valStack[timeDiffPos].timeStamp;\n if (timeDiff > 0.0) {\n // Get velocity per second\n val = (1000.0 / timeDiff) * countDiff;\n } else {\n val = 0;\n }\n } else {\n val = 0; // We have the same count for the desired timeDiff time span.\n }\n } else {\n val = 0; // We don't yet have a value for the desired timeDiff time span.\n }\n\n if (deltaDiffPos > -1) {\n deltaCountDiff = this.#valStack[timeDiffPos].count - this.#valStack[deltaDiffPos].count;\n if (deltaCountDiff > 0) {\n deltaTimeDiff = this.#valStack[timeDiffPos].timeStamp - this.#valStack[deltaDiffPos].timeStamp\n if (deltaTimeDiff > 0.0) {\n // Get velocity per second\n deltaVal = (1000.0 / deltaTimeDiff) * deltaTimeDiff;\n } else {\n deltaVal = 0;\n }\n } else {\n deltaVal = 0; // We have the same count for the desired deltaTimeDiff time span.\n }\n } else {\n deltaVal = 0; // We don't yet have a value for the desired deltaTimeDiff time span.\n }\n }\n return {\n val,\n countDiff,\n timeDiff,\n deltaVal,\n deltaCountDiff,\n deltaTimeDiff\n }\n }\n\n #ComputeVelocity(): void {\n const dp: IDataPoint = {\n timeStamp: performance.now(),\n count: this.#velocityVal\n }\n this.#valStack.push(dp);\n\n this.#timeStamp = dp.timeStamp;\n\n while (this.#valStack.length > 0 && ((this.#timeStamp - this.#valStack[0].timeStamp) > this.#maxTimeDiff)) {\n this.#valStack.shift();\n }\n\n const valStackAverageDataPoint = this.#ComputeVelocityByTimeDiff(this.#vaTimeDiff, 0);\n this.#valStackAverage = valStackAverageDataPoint.val;\n\n const velocityDataPoint = this.#ComputeVelocityByTimeDiff(this.#velocityTimeDiff, this.#velocityTimeDiff * 2);\n this.#velocity = velocityDataPoint.val;\n this.#delta = velocityDataPoint.val - velocityDataPoint.deltaVal;\n\n this.#countDiff = velocityDataPoint.countDiff\n this.#timeDiff = velocityDataPoint.timeDiff\n this.#deltaCountDiff = velocityDataPoint.deltaCountDiff\n this.#deltaTimeDif = velocityDataPoint.deltaTimeDiff\n\n this.#lastVelocity = this.#velocity;\n if (this.#velocity > this.#maxVelocity) {\n this.#maxVelocity = this.#velocity;\n }\n }\n\n #SetupAutoComputeVelocity(): void {\n if (this.#timeoutComputeVelocity) {\n clearTimeout(this.#timeoutComputeVelocity);\n }\n this.#timeoutComputeVelocity = setTimeout(() => {\n this.#ComputeVelocity();\n }, this.#autoComputeVelocityTimeout);\n\n // Note: We do not check if running in node for an unref() because unref() is expensive and this is being\n // called for each change in val. The value of autoComputeVelocityTimeout (around 50ms) is very small and should not prevent application\n // termination issues.\n }\n\n #GetVelocityStackAverage(): number {\n return this.GetNumber(this.#valStackAverage);\n }\n\n Inc(incVal = 1): void {\n this.#velocityVal += incVal;\n if (this.#autoComputeVelocity) {\n this.#ComputeVelocity();\n } else {\n this.#SetupAutoComputeVelocity();\n }\n }\n\n #GetVal(): number {\n return this.GetNumber(this.#velocityVal);\n }\n\n #SetVal(updatedValue: number): void {\n this.#velocityVal = updatedValue;\n if (this.#autoComputeVelocity) {\n this.#ComputeVelocity();\n } else {\n this.#SetupAutoComputeVelocity();\n }\n }\n\n #GetVelocity(): number {\n return this.GetNumber(this.#velocity);\n }\n\n #GetMaxVelocity(): number {\n return this.GetNumber(this.#maxVelocity);\n }\n\n #GetDelta(): number {\n return this.GetNumber(this.#delta);\n }\n\n #GetTimeStamp(): number {\n return this.GetNumber(this.#timeStamp);\n }\n\n #GetCountDiff(): number {\n return this.GetNumber(this.#countDiff);\n }\n\n #GetTimeDiff(): number {\n return this.GetNumber(this.#timeDiff);\n }\n\n #GetDeltaCountDiff(): number {\n return this.GetNumber(this.#deltaCountDiff);\n }\n\n #GetDeltaTimeDif(): number {\n return this.GetNumber(this.#deltaTimeDif);\n }\n\n #GetAverageVelocity(): number[] {\n return this.#averageVelocity;\n }\n\n override StopTimer(): void {\n if (this.#interval !== null) {\n clearTimeout(this.#interval);\n this.#interval = null;\n }\n }\n\n override ProcessTelemetry(telemetry: InstrumentVelocityTelemetry): void {\n if (telemetry.Inc !== undefined) {\n this.Inc(telemetry.Inc);\n }\n if (telemetry.val !== undefined) {\n this.val = telemetry.val;\n }\n }\n}\n","import _cloneDeep from 'lodash.clonedeep'\n\nimport { InstrumentBase, InstrumentBaseOptions, InstrumentBaseTelemetry } from './instrumentBase.js'\nimport { GaugeTypes } from '../instrumentDefs.js'\n\nimport { JSONObject } from '@nsshunt/stsutils'\n\nexport interface HistogramReportValue extends JSONObject {\n\tval: number\n\thist: HistogramDataElement[]\n\tvf: string\n}\n\nexport enum HistogramDataElementPos {\n\tval = 0,\n\tlabel = 1,\n\tbreakPoint = 2\n}\n\nexport type HistogramDataElement = [\n\tval: number,\n\tlabel: string,\n\tbreakPoint: number\n]\n\nexport class InstrumentHistogramOptions extends InstrumentBaseOptions {\n histogramData?: number[]\n initValue?: number\n fromJSON?: InstrumentHistogram\n}\n\nexport class InstrumentHistogramTelemetry extends InstrumentBaseTelemetry {\n val?: number\n}\n\nexport class InstrumentHistogram extends InstrumentBase\n{\n #histogramData: HistogramDataElement[] = [ ];\n #val = 0;\n #copy = false;\n\t\n constructor(options: InstrumentHistogramOptions = { }) {\n super(options);\n\n if (typeof options.label === 'undefined') {\n this.label = 'InstrumentHistogram';\n } else {\n this.label = options.label;\n }\n\n let histogramData: number[] | null = null;\n if (typeof options.histogramData === 'undefined') {\n histogramData = null;\n } else {\n histogramData = options.histogramData;\n }\n\n if (typeof options.fromJSON === 'undefined') {\n this.#copy = false;\n } else {\n this.#copy = true;\n }\n\n if (histogramData === null) {\n this.#histogramData = [\n [ 0, \"10\", 10 ],\n [ 0, \"20\", 20 ],\n [ 0, \"50\", 50 ],\n [ 0, \"100\", 100 ],\n [ 0, \"1000\", 1000 ],\n [ 0, \"5000\", 5000 ],\n [ 0, \"EE\", 0 ]\n ]\n } else if (Array.isArray(histogramData)) {\n this.#histogramData = [ ];\n for (let i=0; i < histogramData.length; i++) {\n this.#histogramData.push([0, '' + histogramData[i], parseFloat(histogramData[i].toString())]);\n }\n this.#histogramData.push([ 0, \"EE\", 0 ]);\n } else {\n throw new Error(`Passed [${histogramData}] must be an array.`);\n }\n\n Object.defineProperty(this, GaugeTypes.GAUGE_TYPE, {\n enumerable: true,\n get: () => GaugeTypes.INSTRUMENT_HISTOGRAM\n });\n\n if (this.#copy) {\n this.DefineCopyProperties([\n 'val', 'hist' \n ]);\n } else {\n Object.defineProperty(this, 'val', {\n enumerable: true,\n get: () => this.#GetVal(),\n set: (value) => { this.#SetVal(value); }\n });\n Object.defineProperty(this, 'hist', {\n enumerable: true,\n get: () => this.#GetHistogramData(),\n set: (value) => { this.#SetHistogramData(value); }\n });\n }\n\n if (typeof options.initValue !== 'undefined') {\n this.#val = options.initValue;\n }\n\n // Set copy values now that we have defined our properties\n if (typeof options.fromJSON !== 'undefined') {\n const result = _cloneDeep(options.fromJSON);\n this.#val = result.val as number;\n this.hist = result.hist;\n }\n }\n\n public hist: HistogramDataElement[] = [ ];\n public val = 0;\n\n WithInitVal(initVal: number): InstrumentHistogram {\n this.#val = initVal;\n return this;\n }\n\n ResetHistogramData(): void {\n for (let i=0; i < this.hist.length; i++) {\n this.hist[i][0] = 0;\n }\n }\n\n AddObservation(updateValue: number): void {\n if (this.#copy) {\n throw new Error('Cannot add observations from the copy version of this class.');\n }\n let i = 0;\n for (; i < this.#histogramData.length-1; i++)\n {\n if (updateValue <= this.#histogramData[i][HistogramDataElementPos.breakPoint])\n {\n this.#histogramData[i][HistogramDataElementPos.val]++;\n return;\n }\n }\n this.#histogramData[i][HistogramDataElementPos.val]++;\n }\n\n #GetVal(): number {\n return this.GetNumber(this.#val);\n }\n\n #SetVal(value: number) {\n this.#val = value;\n this.AddObservation(value);\n }\n\n get\tformattedHistogramData(): string {\n let retVal = '';\n let sep = '';\n for (let i=0; i < this.hist.length; i++) {\n retVal += sep + '[' + (this.hist[i][HistogramDataElementPos.val] + '/' + this.hist[i][HistogramDataElementPos.label]).padStart(10, ' ') + ']';\n sep = ' ';\n }\n return retVal;\n }\n\n #GetHistogramData(): HistogramDataElement[] {\n return this.#histogramData;\n }\n\n #SetHistogramData(value: HistogramDataElement[]) {\n this.#histogramData = value;\n }\n\n static AddHistogramDataEx(histoA: InstrumentHistogram | null, histoB: InstrumentHistogram): InstrumentHistogram {\n if (histoA === null) {\n return _cloneDeep(histoB);\n }\n\n const result = _cloneDeep(histoA);\n const histogramAData = result.hist;\n const histogramBData = histoB.hist;\n\n if (histogramAData.length !== histogramBData.length) {\n throw new Error('Invalid HistogramData. HistogramData bucket lengths must be the same.')\n }\n for (let i=0; i < histogramAData.length; i++)\n {\n if (histogramAData[i][HistogramDataElementPos.breakPoint] !== histogramBData[i][HistogramDataElementPos.breakPoint]) {\n throw new Error(`Invalid HistogramData. HistogramData bucket break-point at index [${i}] must be the same.`)\n }\n if (histogramAData[i][HistogramDataElementPos.label] !== histogramBData[i][HistogramDataElementPos.label]) {\n throw new Error(`Invalid HistogramData. HistogramData bucket label at index [${i}] must be the same.`)\n }\n histogramAData[i][HistogramDataElementPos.val] += histogramBData[i][HistogramDataElementPos.val];\n }\n\n return result;\n }\n\n /**\n\t * Adds a value object (from GetFormatted()) to this instance.\n\t * @param {*} value \n\t */\n AddHistogramData(histogramData: InstrumentHistogram): void {\n if (histogramData === null) {\n return;\n }\n\n if (this.hist.length !== histogramData.hist.length) {\n throw new Error('Invalid HistogramData. HistogramData bucket lengths must be the same.')\n }\n for (let i=0; i < histogramData.hist.length; i++)\n {\n if (this.hist[i][HistogramDataElementPos.breakPoint] !== histogramData.hist[i][HistogramDataElementPos.breakPoint]) {\n throw new Error(`Invalid HistogramData. HistogramData bucket break-point at index [${i}] must be the same.`)\n }\n if (this.hist[i][HistogramDataElementPos.label] !== histogramData.hist[i][HistogramDataElementPos.label]) {\n throw new Error(`Invalid HistogramData. HistogramData bucket label at index [${i}] must be the same.`)\n }\n this.hist[i][HistogramDataElementPos.val] += histogramData.hist[i][HistogramDataElementPos.val];\n }\n }\n\t\n override ProcessTelemetry(telemetry: InstrumentHistogramTelemetry): void {\n if (telemetry.val !== undefined) {\n this.val = telemetry.val;\n }\n }\n}\n","/* eslint @typescript-eslint/no-explicit-any: 0 */ // --> OFF\nimport _cloneDeep from 'lodash.clonedeep'\n\nimport { InstrumentBase, InstrumentBaseOptions, InstrumentBaseTelemetry } from './instrumentBase.js'\nimport { GaugeTypes } from '../instrumentDefs.js'\n\nimport { JSONObject, ISTSLogger } from '@nsshunt/stsutils'\n\nexport interface LogReportValue extends JSONObject {\n\tval: string[]\n}\n\nexport class InstrumentLogOptions extends InstrumentBaseOptions {\n maxSize?: number\n useLatestMessages?: boolean\n consoleLogging?: boolean\n instrumentLogging?: boolean\n winstonLogging?: boolean\n fromJSON?: InstrumentLog\n initValue?: string[]\n logger?: ISTSLogger\n}\n\nexport class InstrumentLogTelemetry extends InstrumentBaseTelemetry {\n Append?: string[]\n LogMessage?: string\n val?: string[]\n ResetLog?: boolean\n}\n\nexport class InstrumentLog extends InstrumentBase implements ISTSLogger\n{\n #messages: string[] = [ ];\n #readPos = 0;\n #maxSize = 200; // Max length of cached log messages\n #copy = false;\n #useLatestMessages = false;\n #consoleLogging = false;\n #instrumentLogging = true;\n #winstonLogging = false;\n #stsLogger: ISTSLogger | undefined;\n\n constructor(options: InstrumentLogOptions = { })\n {\n super(options);\n\n if (typeof options.label === 'undefined') {\n this.label = 'InstrumentLog';\n } else {\n this.label = options.label;\n }\n\n if (typeof options.maxSize === 'undefined') {\n this.#maxSize = 200;\n } else {\n this.#maxSize = options.maxSize;\n }\n\n if (typeof options.fromJSON === 'undefined') {\n this.#copy = false;\n } else {\n this.#copy = true;\n }\n\n if (typeof options.useLatestMessages === 'undefined') {\n this.#useLatestMessages = false;\n } else {\n this.#useLatestMessages = options.useLatestMessages;\n }\n\n if (typeof options.consoleLogging === 'undefined') {\n this.#consoleLogging = false;\n } else {\n this.#consoleLogging = options.consoleLogging;\n }\n\n if (typeof options.instrumentLogging === 'undefined') {\n this.#instrumentLogging = true;\n } else {\n this.#instrumentLogging = options.instrumentLogging;\n }\n\n if (typeof options.winstonLogging === 'undefined') {\n this.#winstonLogging = false;\n } else {\n this.#winstonLogging = options.winstonLogging;\n }\n\n Object.defineProperty(this, GaugeTypes.GAUGE_TYPE, {\n enumerable: true,\n get: () => GaugeTypes.INSTRUMENT_LOG\n });\n\n if (this.#copy) {\n this.DefineCopyProperties([\n 'val' \n ]);\n } else {\n Object.defineProperty(this, 'val', {\n enumerable: true,\n get: () => _cloneDeep(this.#GetVal()),\n set: (value) => { this.#SetVal(value); }\n });\n }\n\n if (typeof options.initValue !== 'undefined') {\n this.val = options.initValue;\n }\n\n // Set copy values now that we have defined our properties\n if (typeof options.fromJSON !== 'undefined') {\n const result = _cloneDeep(options.fromJSON);\n this.val = result.val;\n }\n }\n\n public val: string[] = [];\n\n WithMaxSize(maxSize: number): InstrumentLog {\n this.#maxSize = maxSize;\n return this;\n }\n\n WithUseLatestMessages(useLatestMessages: boolean): InstrumentLog {\n this.#useLatestMessages = useLatestMessages;\n return this;\n }\n\n WithConsoleLogging(consoleLogging: boolean): InstrumentLog {\n this.#consoleLogging = consoleLogging;\n return this;\n }\n\n WithInstrumentLogging(instrumentLogging: boolean): InstrumentLog {\n this.#instrumentLogging = instrumentLogging;\n return this;\n }\n\n get MaxSize(): number {\n return this.#maxSize;\n }\n\n set MaxSize(maxSize: number) {\n this.#maxSize = maxSize;\n }\n\n #DumpToConsole(): void\n {\n const logReport = this.GetMessagesSinceLastRead();\n for (let i=0; i < logReport.length; i++) {\n console.log(logReport[i]);\n }\n }\n\n get consoleLogging(): boolean {\n return this.#consoleLogging;\n }\n\n set consoleLogging(value: boolean) {\n this.#consoleLogging = value;\n if (value === true) {\n this.#DumpToConsole();\n }\n }\n\n get instrumentLogging(): boolean {\n return this.#instrumentLogging;\n }\n\n set instrumentLogging(value: boolean) {\n this.#instrumentLogging = value;\n }\n\n Append(messageArray: string[]): void {\n for (let i=0; i < messageArray.length; i++) {\n this.LogMessage(messageArray[i]);\n }\n }\n\n error(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.error(message);\n }\n\n warn(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.warn(message);\n }\n\n info(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.info(message);\n }\n\n http(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.http(message);\n }\n\n verbose(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.verbose(message);\n }\n\n debug(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.debug(message);\n }\n\n silly(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.silly(message);\n }\n\n LogMessage(message: string): void {\n if (this.#copy) {\n throw new Error('Cannot add log messages from the copy version of this class.');\n }\n if (this.#consoleLogging === true) {\n console.log(message);\n }\n\n if (this.#instrumentLogging === false) {\n return;\n }\n\n this.#messages.push(message);\n if (this.#messages.length > this.#maxSize) {\n this.#messages.shift();\n this.#readPos = (this.#readPos > 0 ? this.#readPos-1 : 0);\n }\n }\n\n #GetVal(): string[]\n {\n if (this.#useLatestMessages) {\n return this.GetMessagesSinceLastRead();\n } else {\n return this.#messages;\n }\n }\n\n #SetVal(updatedValue: string[]): void\n {\n this.#messages = updatedValue;\n this.#readPos = 0;\n }\n\n GetMessagesNoUpdate(): string[] {\n return this.#messages.slice(this.#readPos);\n }\n\n // This will return only those messages that have been added since the last read\n GetMessagesSinceLastRead(): string[]\n {\n const retVal = this.#messages.slice(this.#readPos);\n this.#readPos = this.#messages.length;\n return retVal;\n }\n\n ResetLog(): void\n {\n this.#messages = [ ];\n this.#readPos = 0;\n }\n\n override ProcessTelemetry(telemetry: InstrumentLogTelemetry): void {\n if (telemetry.val !== undefined) {\n this.val = telemetry.val;\n }\n if (telemetry.Append !== undefined) {\n this.Append(telemetry.Append);\n }\n if (telemetry.LogMessage !== undefined) {\n this.LogMessage(telemetry.LogMessage);\n }\n if (telemetry.ResetLog !== undefined && telemetry.ResetLog === true) {\n this.ResetLog();\n }\n }\n}\n","//import * as ph from 'node:perf_hooks'; //@@ need to test - may not work in browser\n\nimport _cloneDeep from 'lodash.clonedeep'\n\nimport { InstrumentBase, InstrumentBaseOptions, InstrumentBaseTelemetry } from './instrumentBase.js'\nimport { GaugeTypes } from '../instrumentDefs.js'\n\nimport { JSONObject } from '@nsshunt/stsutils'\n\n// Potentially, look @ this module...\n// https://www.npmjs.com/package/performance-now\n\nexport interface TimerReportValue extends JSONObject {\n\tval: number\n\tvalue: string\n\tvf: string\n\ts: string\n}\n\nexport class InstrumentTimerOptions extends InstrumentBaseOptions {\n fromJSON?: InstrumentTimerGauge\n initValue?: number\n}\n\nexport class InstrumentTimerTelemetry extends InstrumentBaseTelemetry {\n val?: number\n Pause?: boolean\n Resume?: boolean\n Reset?: boolean\n}\n\nexport class InstrumentTimerGauge extends InstrumentBase\n{\n #start = 0;\n #copy = false;\n #pauseVal = 0;\n\n constructor(options: InstrumentTimerOptions = { }) {\n super(options)\n\n if (typeof options.label === 'undefined') {\n this.label = 'InstrumentTimerGauge';\n } else {\n this.label = options.label;\n }\n\n if (typeof options.fromJSON === 'undefined') {\n this.#copy = false;\n } else {\n this.#copy = true;\n }\n\n Object.defineProperty(this, GaugeTypes.GAUGE_TYPE, {\n enumerable: true,\n get: () => GaugeTypes.INSTRUMENT_TIMER\n });\n\n if (this.#copy) {\n this.DefineCopyProperties([\n 'val' \n ]);\n } else {\n Object.defineProperty(this, 'val', {\n enumerable: true,\n get: () => this.#GetVal(),\n set: (value) => { this.#SetVal(value); }\n });\n }\n\n if (typeof options.initValue !== 'undefined') {\n this.val = options.initValue;\n }\n\n // Set copy values now that we have defined our properties\n if (typeof options.fromJSON !== 'undefined') {\n const result = _cloneDeep(options.fromJSON);\n this.val = result.val;\n }\n\n this.Reset();\n }\n\n public val = 0;\n\n // Take a snap shot of the current elapsed time. The 'clock' will still keep running.\n Pause(): void {\n this.#pauseVal = this.val;\n }\n\n Resume(): void {\n this.#pauseVal = 0;\n }\n\n Reset(): void {\n this.#start = performance.now();\n }\n\n #GetVal(): number {\n if (this.#pauseVal !== 0) {\n return this.GetNumber(this.#pauseVal);\n }\n return this.GetNumber(performance.now() - this.#start);\n }\n\t\n #SetVal(updatedValue: number): void {\n // Reset the start time based on the supplied duration\n this.#start = performance.now() - updatedValue;\n }\n\n get start(): number {\n return this.#start;\n }\n\n /*\n #convertMS(ms: number): string {\n //let d, h, m, s;\n let s = Math.floor(ms / 1000);\n let m = Math.floor(s / 60);\n s = s % 60;\n let h = Math.floor(m / 60);\n m = m % 60;\n const d = Math.floor(h / 24);\n h = h % 24;\n\t\n const pad: (n: number) => string = function(n: number) { return n < 10 ? '0' + n : n.toString(); };\n\t\n return (d + '.' + pad(h) + ':' + pad(m) + ':' + pad(s)).padStart(12);\n }\n */ \n\n override ProcessTelemetry(telemetry: InstrumentTimerTelemetry): void {\n if (telemetry.val !== undefined) {\n this.val = telemetry.val;\n }\n if (telemetry.Pause !== undefined && telemetry.Pause === true) {\n this.Pause();\n }\n if (telemetry.Resume !== undefined && telemetry.Resume === true) {\n this.Resume();\n }\n if (telemetry.Reset !== undefined && telemetry.Reset === true) {\n this.Reset();\n }\n }\n}\n","/****\n * The MIT License\n *\n * Copyright (c) 2015 Marco Ziccardi\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n ****/\n(function (global, factory) {\n if (typeof define === 'function' && define.amd) {\n define('timsort', ['exports'], factory);\n } else if (typeof exports !== 'undefined') {\n factory(exports);\n } else {\n var mod = {\n exports: {}\n };\n factory(mod.exports);\n global.timsort = mod.exports;\n }\n})(this, function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n exports.sort = sort;\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError('Cannot call a class as a function');\n }\n }\n\n var DEFAULT_MIN_MERGE = 32;\n\n var DEFAULT_MIN_GALLOPING = 7;\n\n var DEFAULT_TMP_STORAGE_LENGTH = 256;\n\n var POWERS_OF_TEN = [1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9];\n\n function log10(x) {\n if (x < 1e5) {\n if (x < 1e2) {\n return x < 1e1 ? 0 : 1;\n }\n\n if (x < 1e4) {\n return x < 1e3 ? 2 : 3;\n }\n\n return 4;\n }\n\n if (x < 1e7) {\n return x < 1e6 ? 5 : 6;\n }\n\n if (x < 1e9) {\n return x < 1e8 ? 7 : 8;\n }\n\n return 9;\n }\n\n function alphabeticalCompare(a, b) {\n if (a === b) {\n return 0;\n }\n\n if (~ ~a === a && ~ ~b === b) {\n if (a === 0 || b === 0) {\n return a < b ? -1 : 1;\n }\n\n if (a < 0 || b < 0) {\n if (b >= 0) {\n return -1;\n }\n\n if (a >= 0) {\n return 1;\n }\n\n a = -a;\n b = -b;\n }\n\n var al = log10(a);\n var bl = log10(b);\n\n var t = 0;\n\n if (al < bl) {\n a *= POWERS_OF_TEN[bl - al - 1];\n b /= 10;\n t = -1;\n } else if (al > bl) {\n b *= POWERS_OF_TEN[al - bl - 1];\n a /= 10;\n t = 1;\n }\n\n if (a === b) {\n return t;\n }\n\n return a < b ? -1 : 1;\n }\n\n var aStr = String(a);\n var bStr = String(b);\n\n if (aStr === bStr) {\n return 0;\n }\n\n return aStr < bStr ? -1 : 1;\n }\n\n function minRunLength(n) {\n var r = 0;\n\n while (n >= DEFAULT_MIN_MERGE) {\n r |= n & 1;\n n >>= 1;\n }\n\n return n + r;\n }\n\n function makeAscendingRun(array, lo, hi, compare) {\n var runHi = lo + 1;\n\n if (runHi === hi) {\n return 1;\n }\n\n if (compare(array[runHi++], array[lo]) < 0) {\n while (runHi < hi && compare(array[runHi], array[runHi - 1]) < 0) {\n runHi++;\n }\n\n reverseRun(array, lo, runHi);\n } else {\n while (runHi < hi && compare(array[runHi], array[runHi - 1]) >= 0) {\n runHi++;\n }\n }\n\n return runHi - lo;\n }\n\n function reverseRun(array, lo, hi) {\n hi--;\n\n while (lo < hi) {\n var t = array[lo];\n array[lo++] = array[hi];\n array[hi--] = t;\n }\n }\n\n function binaryInsertionSort(array, lo, hi, start, compare) {\n if (start === lo) {\n start++;\n }\n\n for (; start < hi; start++) {\n var pivot = array[start];\n\n var left = lo;\n var right = start;\n\n while (left < right) {\n var mid = left + right >>> 1;\n\n if (compare(pivot, array[mid]) < 0) {\n right = mid;\n } else {\n left = mid + 1;\n }\n }\n\n var n = start - left;\n\n switch (n) {\n case 3:\n array[left + 3] = array[left + 2];\n\n case 2:\n array[left + 2] = array[left + 1];\n\n case 1:\n array[left + 1] = array[left];\n break;\n default:\n while (n > 0) {\n array[left + n] = array[left + n - 1];\n n--;\n }\n }\n\n array[left] = pivot;\n }\n }\n\n function gallopLeft(value, array, start, length, hint, compare) {\n var lastOffset = 0;\n var maxOffset = 0;\n var offset = 1;\n\n if (compare(value, array[start + hint]) > 0) {\n maxOffset = length - hint;\n\n while (offset < maxOffset && compare(value, array[start + hint + offset]) > 0) {\n lastOffset = offset;\n offset = (offset << 1) + 1;\n\n if (offset <= 0) {\n offset = maxOffset;\n }\n }\n\n if (offset > maxOffset) {\n offset = maxOffset;\n }\n\n lastOffset += hint;\n offset += hint;\n } else {\n maxOffset = hint + 1;\n while (offset < maxOffset && compare(value, array[start + hint - offset]) <= 0) {\n lastOffset = offset;\n offset = (offset << 1) + 1;\n\n if (offset <= 0) {\n offset = maxOffset;\n }\n }\n if (offset > maxOffset) {\n offset = maxOffset;\n }\n\n var tmp = lastOffset;\n lastOffset = hint - offset;\n offset = hint - tmp;\n }\n\n lastOffset++;\n while (lastOffset < offset) {\n var m = lastOffset + (offset - lastOffset >>> 1);\n\n if (compare(value, array[start + m]) > 0) {\n lastOffset = m + 1;\n } else {\n offset = m;\n }\n }\n return offset;\n }\n\n function gallopRight(value, array, start, length, hint, compare) {\n var lastOffset = 0;\n var maxOffset = 0;\n var offset = 1;\n\n if (compare(value, array[start + hint]) < 0) {\n maxOffset = hint + 1;\n\n while (offset < maxOffset && compare(value, array[start + hint - offset]) < 0) {\n lastOffset = offset;\n offset = (offset << 1) + 1;\n\n if (offset <= 0) {\n offset = maxOffset;\n }\n }\n\n if (offset > maxOffset) {\n offset = maxOffset;\n }\n\n var tmp = lastOffset;\n lastOffset = hint - offset;\n offset = hint - tmp;\n } else {\n maxOffset = length - hint;\n\n while (offset < maxOffset && compare(value, array[start + hint + offset]) >= 0) {\n lastOffset = offset;\n offset = (offset << 1) + 1;\n\n if (offset <= 0) {\n offset = maxOffset;\n }\n }\n\n if (offset > maxOffset) {\n offset = maxOffset;\n }\n\n lastOffset += hint;\n offset += hint;\n }\n\n lastOffset++;\n\n while (lastOffset < offset) {\n var m = lastOffset + (offset - lastOffset >>> 1);\n\n if (compare(value, array[start + m]) < 0) {\n offset = m;\n } else {\n lastOffset = m + 1;\n }\n }\n\n return offset;\n }\n\n var TimSort = (function () {\n function TimSort(array, compare) {\n _classCallCheck(this, TimSort);\n\n this.array = null;\n this.compare = null;\n this.minGallop = DEFAULT_MIN_GALLOPING;\n this.length = 0;\n this.tmpStorageLength = DEFAULT_TMP_STORAGE_LENGTH;\n this.stackLength = 0;\n this.runStart = null;\n this.runLength = null;\n this.stackSize = 0;\n\n this.array = array;\n this.compare = compare;\n\n this.length = array.length;\n\n if (this.length < 2 * DEFAULT_TMP_STORAGE_LENGTH) {\n this.tmpStorageLength = this.length >>> 1;\n }\n\n this.tmp = new Array(this.tmpStorageLength);\n\n this.stackLength = this.length < 120 ? 5 : this.length < 1542 ? 10 : this.length < 119151 ? 19 : 40;\n\n this.runStart = new Array(this.stackLength);\n this.runLength = new Array(this.stackLength);\n }\n\n TimSort.prototype.pushRun = function pushRun(runStart, runLength) {\n this.runStart[this.stackSize] = runStart;\n this.runLength[this.stackSize] = runLength;\n this.stackSize += 1;\n };\n\n TimSort.prototype.mergeRuns = function mergeRuns() {\n while (this.stackSize > 1) {\n var n = this.stackSize - 2;\n\n if (n >= 1 && this.runLength[n - 1] <= this.runLength[n] + this.runLength[n + 1] || n >= 2 && this.runLength[n - 2] <= this.runLength[n] + this.runLength[n - 1]) {\n\n if (this.runLength[n - 1] < this.runLength[n + 1]) {\n n--;\n }\n } else if (this.runLength[n] > this.runLength[n + 1]) {\n break;\n }\n this.mergeAt(n);\n }\n };\n\n TimSort.prototype.forceMergeRuns = function forceMergeRuns() {\n while (this.stackSize > 1) {\n var n = this.stackSize - 2;\n\n if (n > 0 && this.runLength[n - 1] < this.runLength[n + 1]) {\n n--;\n }\n\n this.mergeAt(n);\n }\n };\n\n TimSort.prototype.mergeAt = function mergeAt(i) {\n var compare = this.compare;\n var array = this.array;\n\n var start1 = this.runStart[i];\n var length1 = this.runLength[i];\n var start2 = this.runStart[i + 1];\n var length2 = this.runLength[i + 1];\n\n this.runLength[i] = length1 + length2;\n\n if (i === this.stackSize - 3) {\n this.runStart[i + 1] = this.runStart[i + 2];\n this.runLength[i + 1] = this.runLength[i + 2];\n }\n\n this.stackSize--;\n\n var k = gallopRight(array[start2], array, start1, length1, 0, compare);\n start1 += k;\n length1 -= k;\n\n if (length1 === 0) {\n return;\n }\n\n length2 = gallopLeft(array[start1 + length1 - 1], array, start2, length2, length2 - 1, compare);\n\n if (length2 === 0) {\n return;\n }\n\n if (length1 <= length2) {\n this.mergeLow(start1, length1, start2, length2);\n } else {\n this.mergeHigh(start1, length1, start2, length2);\n }\n };\n\n TimSort.prototype.mergeLow = function mergeLow(start1, length1, start2, length2) {\n\n var compare = this.compare;\n var array = this.array;\n var tmp = this.tmp;\n var i = 0;\n\n for (i = 0; i < length1; i++) {\n tmp[i] = array[start1 + i];\n }\n\n var cursor1 = 0;\n var cursor2 = start2;\n var dest = start1;\n\n array[dest++] = array[cursor2++];\n\n if (--length2 === 0) {\n for (i = 0; i < length1; i++) {\n array[dest + i] = tmp[cursor1 + i];\n }\n return;\n }\n\n if (length1 === 1) {\n for (i = 0; i < length2; i++) {\n array[dest + i] = array[cursor2 + i];\n }\n array[dest + length2] = tmp[cursor1];\n return;\n }\n\n var minGallop = this.minGallop;\n\n while (true) {\n var count1 = 0;\n var count2 = 0;\n var exit = false;\n\n do {\n if (compare(array[cursor2], tmp[cursor1]) < 0) {\n array[dest++] = array[cursor2++];\n count2++;\n count1 = 0;\n\n if (--length2 === 0) {\n exit = true;\n break;\n }\n } else {\n array[dest++] = tmp[cursor1++];\n count1++;\n count2 = 0;\n if (--length1 === 1) {\n exit = true;\n break;\n }\n }\n } while ((count1 | count2) < minGallop);\n\n if (exit) {\n break;\n }\n\n do {\n count1 = gallopRight(array[cursor2], tmp, cursor1, length1, 0, compare);\n\n if (count1 !== 0) {\n for (i = 0; i < count1; i++) {\n array[dest + i] = tmp[cursor1 + i];\n }\n\n dest += count1;\n cursor1 += count1;\n length1 -= count1;\n if (length1 <= 1) {\n exit = true;\n break;\n }\n }\n\n array[dest++] = array[cursor2++];\n\n if (--length2 === 0) {\n exit = true;\n break;\n }\n\n count2 = gallopLeft(tmp[cursor1], array, cursor2, length2, 0, compare);\n\n if (count2 !== 0) {\n for (i = 0; i < count2; i++) {\n array[dest + i] = array[cursor2 + i];\n }\n\n dest += count2;\n cursor2 += count2;\n length2 -= count2;\n\n if (length2 === 0) {\n exit = true;\n break;\n }\n }\n array[dest++] = tmp[cursor1++];\n\n if (--length1 === 1) {\n exit = true;\n break;\n }\n\n minGallop--;\n } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING);\n\n if (exit) {\n break;\n }\n\n if (minGallop < 0) {\n minGallop = 0;\n }\n\n minGallop += 2;\n }\n\n this.minGallop = minGallop;\n\n if (minGallop < 1) {\n this.minGallop = 1;\n }\n\n if (length1 === 1) {\n for (i = 0; i < length2; i++) {\n array[dest + i] = array[cursor2 + i];\n }\n array[dest + length2] = tmp[cursor1];\n } else if (length1 === 0) {\n throw new Error('mergeLow preconditions were not respected');\n } else {\n for (i = 0; i < length1; i++) {\n array[dest + i] = tmp[cursor1 + i];\n }\n }\n };\n\n TimSort.prototype.mergeHigh = function mergeHigh(start1, length1, start2, length2) {\n var compare = this.compare;\n var array = this.array;\n var tmp = this.tmp;\n var i = 0;\n\n for (i = 0; i < length2; i++) {\n tmp[i] = array[start2 + i];\n }\n\n var cursor1 = start1 + length1 - 1;\n var cursor2 = length2 - 1;\n var dest = start2 + length2 - 1;\n var customCursor = 0;\n var customDest = 0;\n\n array[dest--] = array[cursor1--];\n\n if (--length1 === 0) {\n customCursor = dest - (length2 - 1);\n\n for (i = 0; i < length2; i++) {\n array[customCursor + i] = tmp[i];\n }\n\n return;\n }\n\n if (length2 === 1) {\n dest -= length1;\n cursor1 -= length1;\n customDest = dest + 1;\n customCursor = cursor1 + 1;\n\n for (i = length1 - 1; i >= 0; i--) {\n array[customDest + i] = array[customCursor + i];\n }\n\n array[dest] = tmp[cursor2];\n return;\n }\n\n var minGallop = this.minGallop;\n\n while (true) {\n var count1 = 0;\n var count2 = 0;\n var exit = false;\n\n do {\n if (compare(tmp[cursor2], array[cursor1]) < 0) {\n array[dest--] = array[cursor1--];\n count1++;\n count2 = 0;\n if (--length1 === 0) {\n exit = true;\n break;\n }\n } else {\n array[dest--] = tmp[cursor2--];\n count2++;\n count1 = 0;\n if (--length2 === 1) {\n exit = true;\n break;\n }\n }\n } while ((count1 | count2) < minGallop);\n\n if (exit) {\n break;\n }\n\n do {\n count1 = length1 - gallopRight(tmp[cursor2], array, start1, length1, length1 - 1, compare);\n\n if (count1 !== 0) {\n dest -= count1;\n cursor1 -= count1;\n length1 -= count1;\n customDest = dest + 1;\n customCursor = cursor1 + 1;\n\n for (i = count1 - 1; i >= 0; i--) {\n array[customDest + i] = array[customCursor + i];\n }\n\n if (length1 === 0) {\n exit = true;\n break;\n }\n }\n\n array[dest--] = tmp[cursor2--];\n\n if (--length2 === 1) {\n exit = true;\n break;\n }\n\n count2 = length2 - gallopLeft(array[cursor1], tmp, 0, length2, length2 - 1, compare);\n\n if (count2 !== 0) {\n dest -= count2;\n cursor2 -= count2;\n length2 -= count2;\n customDest = dest + 1;\n customCursor = cursor2 + 1;\n\n for (i = 0; i < count2; i++) {\n array[customDest + i] = tmp[customCursor + i];\n }\n\n if (length2 <= 1) {\n exit = true;\n break;\n }\n }\n\n array[dest--] = array[cursor1--];\n\n if (--length1 === 0) {\n exit = true;\n break;\n }\n\n minGallop--;\n } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING);\n\n if (exit) {\n break;\n }\n\n if (minGallop < 0) {\n minGallop = 0;\n }\n\n minGallop += 2;\n }\n\n this.minGallop = minGallop;\n\n if (minGallop < 1) {\n this.minGallop = 1;\n }\n\n if (length2 === 1) {\n dest -= length1;\n cursor1 -= length1;\n customDest = dest + 1;\n customCursor = cursor1 + 1;\n\n for (i = length1 - 1; i >= 0; i--) {\n array[customDest + i] = array[customCursor + i];\n }\n\n array[dest] = tmp[cursor2];\n } else if (length2 === 0) {\n throw new Error('mergeHigh preconditions were not respected');\n } else {\n customCursor = dest - (length2 - 1);\n for (i = 0; i < length2; i++) {\n array[customCursor + i] = tmp[i];\n }\n }\n };\n\n return TimSort;\n })();\n\n function sort(array, compare, lo, hi) {\n if (!Array.isArray(array)) {\n throw new TypeError('Can only sort arrays');\n }\n\n if (!compare) {\n compare = alphabeticalCompare;\n } else if (typeof compare !== 'function') {\n hi = lo;\n lo = compare;\n compare = alphabeticalCompare;\n }\n\n if (!lo) {\n lo = 0;\n }\n if (!hi) {\n hi = array.length;\n }\n\n var remaining = hi - lo;\n\n if (remaining < 2) {\n return;\n }\n\n var runLength = 0;\n\n if (remaining < DEFAULT_MIN_MERGE) {\n runLength = makeAscendingRun(array, lo, hi, compare);\n binaryInsertionSort(array, lo, hi, lo + runLength, compare);\n return;\n }\n\n var ts = new TimSort(array, compare);\n\n var minRun = minRunLength(remaining);\n\n do {\n runLength = makeAscendingRun(array, lo, hi, compare);\n if (runLength < minRun) {\n var force = remaining;\n if (force > minRun) {\n force = minRun;\n }\n\n binaryInsertionSort(array, lo, lo + force, lo + runLength, compare);\n runLength = force;\n }\n\n ts.pushRun(lo, runLength);\n ts.mergeRuns();\n\n remaining -= runLength;\n lo += runLength;\n } while (remaining !== 0);\n\n ts.forceMergeRuns();\n }\n});\n","module.exports = require('./build/timsort.js');","/**\n @typedef {(Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array | Uint8ClampedArray | Float32Array | Float64Array)} TypedArray\n */\n\n/**\n * Error message for a case when percentile is less than 0.\n *\n * @param {Number} p\n *\n * @return {String}\n */\nfunction lessThanZeroError(p) {\n return 'Expect percentile to be >= 0 but given \"' + p + '\" and its type is \"' + (typeof p) + '\".';\n}\n\n/**\n * Error message for a case when percentile is greater than 100.\n *\n * @param {Number} p\n *\n * @return {String}\n */\nfunction greaterThanHundredError(p) {\n return 'Expect percentile to be <= 100 but given \"' + p + '\" and its type is \"' + (typeof p) + '\".';\n}\n\n/**\n * Error message for a case when percentile is not a number (NaN).\n *\n * @param {Number} p\n *\n * @return {String}\n */\nfunction nanError(p) {\n return 'Expect percentile to be a number but given \"' + p + '\" and its type is \"' + (typeof p) + '\".';\n}\n\n/**\n * Checks that a list of percentiles are all numbers and they lie in range 0..100.\n *\n * @param {Array<Number>} ps - percentiles to calculate\n *\n * @return {Array} List of errors\n */\nfunction validateInput(ps) {\n return ps.reduce(function (errors, p) {\n if (isNaN(Number(p))) {\n errors.push(nanError(p));\n } else if (p < 0) {\n errors.push(lessThanZeroError(p));\n } else if (p > 100) {\n errors.push(greaterThanHundredError(p));\n }\n return errors;\n }, []);\n}\n\n/**\n * Get percentile value from an array.\n *\n * @param {Number} p - percentile\n * @param {Array|TypedArray} list - list of values\n *\n * @return {*}\n */\nfunction getPsValue(p, list) {\n if (p === 0) return list[0];\n var kIndex = Math.ceil(list.length * (p / 100)) - 1;\n return list[kIndex];\n}\n\n/**\n * Calculate percentile for given array of values.\n *\n * @template T\n * @param {Number|Array<Number>} pOrPs - percentile or a list of percentiles\n * @param {Array<T>|Array<Number>|TypedArray} list - array of values\n * @param {function(T): Number} [fn] - optional function to extract a value from an array item\n *\n * @return {Number|T|Array<Number>|Array<T>}\n */\nfunction percentile(pOrPs, list, fn) {\n var ps = Array.isArray(pOrPs) ? pOrPs : [pOrPs];\n var validationErrors = validateInput(ps);\n\n if (validationErrors.length) {\n throw new Error(validationErrors.join(' '));\n }\n\n list = list.slice().sort(function (a, b) {\n if (fn) {\n a = fn(a);\n b = fn(b);\n }\n\n a = Number.isNaN(a) ? Number.NEGATIVE_INFINITY : a;\n b = Number.isNaN(b) ? Number.NEGATIVE_INFINITY : b;\n\n if (a > b) return 1;\n if (a < b) return -1;\n\n return 0;\n });\n\n if (ps.length === 1) {\n return getPsValue(ps[0], list);\n }\n\n return ps.map(function (p) {\n return getPsValue(p, list);\n });\n}\n\nmodule.exports = percentile;\n","import * as timSort from 'timsort' // Required as this is a UMD library\n// https://www.typescriptlang.org/docs/handbook/declaration-files/library-structures.html\nimport percentile from 'percentile'\nimport _cloneDeep from 'lodash.clonedeep'\n\nimport { InstrumentBase, InstrumentBaseOptions, InstrumentBaseTelemetry } from './instrumentBase.js'\nimport { GaugeTypes } from '../instrumentDefs.js'\nimport { JSONObject } from '@nsshunt/stsutils'\nimport isNode from 'detect-node'\n\nexport type QuantileDataElement = [\n label: string,\n val: number,\n];\n\nexport interface gaugeReportValue extends JSONObject {\n\tval: number\n\tvalue: string\n\tvf: string\n\tmin?: string\n\tmax?: string\n\tavg?: string\n\tpercentile?: number[]\n\tpercentileFormatted?: string\n}\n\nexport class InstrumentGaugeOptions extends InstrumentBaseOptions {\n interval?: number\n sampleSize?: number\n fromJSON?: InstrumentGauge\n initValue?: number\n}\n\nexport class InstrumentGaugeTelemetry extends InstrumentBaseTelemetry {\n val?: number\n Inc?: number\n Dec?: number\n}\n\n//@@ Create a GaugeEx that also includes min, max, average\nexport class InstrumentGauge extends InstrumentBase\n{\n #val = 0;\n #maxval: number | null = null;\n #lastObservedValue = 0;\n #timeSeriesList: number[] = [ ];\n #maxSampleSize = 0;\n #timerInterval = 0;\n #observer: NodeJS.Timeout | null = null;\n\n //@@ extras\n #min: number | null = null;\n #max = 0; \n #observations = 0;\n #total = 0;\n #copy = false;\n\n constructor(options: InstrumentGaugeOptions = { }) {\n super(options);\n\n if (!options.label) {\n this.label = 'InstrumentGauge';\n } else {\n this.label = options.label;\n }\n\n if (typeof options.interval === 'undefined') {\n this.#timerInterval = 0;\n } else {\n this.#timerInterval = options.interval;\n }\n\n if (typeof options.sampleSize === 'undefined') {\n this.#maxSampleSize = 600;\n } else {\n this.#maxSampleSize = options.sampleSize;\n }\n\n if (typeof options.fromJSON === 'undefined') {\n this.#copy = false;\n } else {\n this.#copy = true;\n }\n\n Object.defineProperty(this, GaugeTypes.GAUGE_TYPE, {\n enumerable: true,\n get: () => GaugeTypes.INSTRUMENT_GAUGE\n });\n\n if (this.#copy) {\n this.DefineCopyProperties([\n 'val', 'min', 'max', 'avg', 'percentile'\n ]);\n } else {\n Object.defineProperty(this, 'val', {\n enumerable: true,\n get: () => this.#GetVal(),\n set: (value) => { this.#SetVal(value); }\n });\n if (this.#timerInterval > 0) {\n Object.defineProperty(this, 'percentile', {\n enumerable: true,\n get: () => this.#GetPercentileData()\n });\n\t\n this._StartTimer();\n }\n }\n\n if (typeof options.initValue !== 'undefined') {\n this.val = options.initValue;\n }\n\n // Set copy values now that we have defined our properties\n if (typeof options.fromJSON !== 'undefined') {\n const result = _cloneDeep(options.fromJSON);\n this.val = result.val;\n if (result.percentile) {\n this.percentile = result.percentile;\n }\n if (result.min) {\n this.min = result.min;\n }\n if (result.max) {\n this.max = result.max;\n }\n if (result.avg) {\n this.avg = result.avg;\n }\n }\n }\n\n public readonly percentile?: number[];\n public readonly min?: number;\n public readonly max?: number;\n public readonly avg?: number;\n public val = 0;\n\n WithInitVal(initVal: number): InstrumentGauge {\n this.val = initVal;\n return this;\n }\n\n WithMin(): InstrumentGauge {\n Object.defineProperty(this, 'min', {\n enumerable: true,\n get: () => this.#GetMin()\n });\n return this;\n }\n\n WithMax(): InstrumentGauge {\n Object.defineProperty(this, 'max', {\n enumerable: true,\n get: () => this.#GetMax()\n });\n return this;\n }\n\n WithAverage(): InstrumentGauge {\n Object.defineProperty(this, 'avg', {\n enumerable: true,\n get: () => this.#GetAverage()\n });\n return this;\n }\n\n private _StartTimer(): void {\n if (this.#timerInterval > 0) {\n this.#timeSeriesList = [ ];\n\n this.#observer = setInterval(() => {\n if (this.#timeSeriesList.length > this.#maxSampleSize) {\n this.#timeSeriesList.shift();\n }\n const maxval = this.#GetAndResetMaxVal();\n this.#timeSeriesList.push(maxval);\n }, this.#timerInterval);\n\n // If running in node ...\n if (isNode) {\n this.#observer.unref();\n }\n\n // https://httptoolkit.tech/blog/unblocking-node-with-unref/\n } else {\n throw new Error(`Unable to StartTimer for this instrument. The interval is set to <= 0.`);\n }\n }\n\n override StopTimer(): void {\n if (this.#observer) {\n clearTimeout(this.#observer);\n this.#observer = null;\n this.#timeSeriesList = [ ];\n }\n }\n\n /**\n\t * If the gauge is being monitored as part of a time series, get the most recent recorded value (max value) from within the time interval\n\t * otherwise, just return the current instant value.\n\t */\n #GetVal(): number {\n if (this.#timerInterval > 0 && this.#observer !== null) {\n if (this.#maxval === null) {\n return this.GetNumber(this.#lastObservedValue);\n } else {\n return this.GetNumber(this.#maxval);\n }\n }\n return this.GetNumber(this.#val);\n }\n\n #SetVal(updatedValue: number): void {\n this.#val = updatedValue;\n this.#observations++;\n this.#total += updatedValue;\n\n if (this.#val > this.#max) {\n this.#max = this.#val;\n }\n\n if (this.#min !== null) {\n if (this.#val < this.#min) {\n this.#min = this.#val;\n }\n } else {\n // Set the min value to the value of the first observation\n this.#min = this.#val;\n }\n\n if (this.#timerInterval > 0) {\n this.#lastObservedValue = updatedValue;\n if (this.#maxval === null) {\n this.#maxval = this.#val;\n } else if (this.#val > this.#maxval) {\n this.#maxval = this.#val;\n }\n }\n }\n\n #GetMin(): number {\n if (this.#min !== null) {\n return this.#min;\n }\n return 0;\n }\n\n #GetMax(): number {\n return this.#max;\n }\n\n #GetAverage(): number {\n if (this.#observations > 0) {\n return this.#total / this.#observations\n }\n return 0;\n }\n\n Reset(): void {\n this.StopTimer();\n\n this.#maxval = 0;\n this.#lastObservedValue = 0;\n this.#val = 0;\n\n this.#min = null;\n this.#max = 0;\n this.#observations = 0;\n this.#total = 0;\n\n if (this.#timerInterval > 0) {\n this._StartTimer();\n }\n }\n\n #GetAndResetMaxVal(): number {\n if (this.#maxval === null) {\n return this.#lastObservedValue;\n }\n const retVal = this.#maxval;\n this.#maxval = null;\n return retVal;\n }\n\n Inc(incVal = 1): void {\n this.#SetVal(this.#val + incVal);\n }\n\n Dec(decVal = 1): void {\n this.#SetVal(this.#val - decVal);\n }\n\n #NumberCompare(a: number, b: number): number {\n return a - b;\n }\n\n #GetPercentileData(): number[] {\n const sortedList = this.#timeSeriesList.slice(0);\n timSort.sort(sortedList, this.#NumberCompare);\n return percentile([50, 80, 90, 95, 99, 99.95], sortedList) as number[];\n }\n\n override ProcessTelemetry(telemetry: InstrumentGaugeTelemetry): void {\n if (telemetry.Inc !== undefined) {\n this.Inc(telemetry.Inc);\n }\n if (telemetry.Dec !== undefined) {\n this.Dec(telemetry.Dec);\n }\n if (telemetry.val !== undefined) {\n this.val = telemetry.val;\n }\n }\n}\n","import _cloneDeep from 'lodash.clonedeep'\n\nimport { InstrumentBase, InstrumentBaseOptions, InstrumentBaseTelemetry } from './instrumentBase.js'\nimport { GaugeTypes } from '../instrumentDefs.js'\n\nimport { JSONObject } from '@nsshunt/stsutils'\n\nexport interface ObjectReportValue extends JSONObject {\n\tval: JSONObject\n}\n\nexport class InstrumentObjectOptions extends InstrumentBaseOptions {\n fromJSON?: InstrumentObject\n initValue?: JSONObject\n}\n\nexport class InstrumentObjectTelemetry extends InstrumentBaseTelemetry {\n val?: JSONObject\n}\n\nexport class InstrumentObject extends InstrumentBase\n{\n #val: JSONObject = { };\n #copy = false;\n\n constructor(options: InstrumentObjectOptions = { }) {\n super(options);\n\n if (typeof options.label === 'undefined') {\n this.label = 'InstrumentObject';\n } else {\n this.label = options.label;\n }\n\n if (typeof options.fromJSON === 'undefined') {\n this.#copy = false;\n } else {\n this.#copy = true;\n }\n\n Object.defineProperty(this, GaugeTypes.GAUGE_TYPE, {\n enumerable: true,\n get: () => GaugeTypes.INSTRUMENT_OBJECT\n });\n\n if (this.#copy) {\n this.DefineCopyProperties([\n 'val'\n ]);\n } else {\n Object.defineProperty(this, 'val', {\n enumerable: true,\n get: () => this.#GetVal(),\n set: (value) => { this.#SetVal(value); }\n });\n }\n\n if (typeof options.initValue !== 'undefined') {\n this.val = options.initValue;\n } else {\n this.val = { };\n }\n\n // Set copy values now that we have defined our properties\n if (typeof options.fromJSON !== 'undefined') {\n const result = _cloneDeep(options.fromJSON);\n this.val = result.val;\n }\n }\n\t\n public val: JSONObject;\n\n WithInitVal(initVal: JSONObject) {\n this.val = initVal;\n return this;\n }\n\n #GetVal(): JSONObject {\n return this.#val;\n }\n\n #SetVal(updatedValue: JSONObject) {\n this.#val = updatedValue;\n }\n\n override ProcessTelemetry(telemetry: InstrumentObjectTelemetry): void {\n if (telemetry.val !== undefined) {\n this.val = telemetry.val;\n }\n }\n}\n","import { Gauge, GaugeTypes } from './instrumentDefs.js'\n\nimport { InstrumentBase, Instruments } from './instruments/instrumentBase.js'\nimport { InstrumentVelocity } from './instruments/instrumentVelocity.js'\nimport { InstrumentHistogram } from './instruments/instrumentHistogram.js'\nimport { InstrumentLog } from './instruments/instrumentLog.js'\nimport { InstrumentTimerGauge } from './instruments/instrumentTimerGauge.js'\nimport { InstrumentGauge } from './instruments/instrumentGauge.js'\nimport { InstrumentObject } from './instruments/instrumentObject.js'\n\nexport function CreateInstrument(sourceInstrument: InstrumentBase): InstrumentBase {\n switch (sourceInstrument[GaugeTypes.GAUGE_TYPE]) {\n case GaugeTypes.INSTRUMENT_GAUGE :\n return new InstrumentGauge({fromJSON:sourceInstrument as InstrumentGauge});\n case GaugeTypes.INSTRUMENT_VELOCITY :\n return new InstrumentVelocity({fromJSON:sourceInstrument as InstrumentVelocity});\n case GaugeTypes.INSTRUMENT_HISTOGRAM :\n return new InstrumentHistogram({fromJSON:sourceInstrument as InstrumentHistogram});\n case GaugeTypes.INSTRUMENT_LOG :\n return new InstrumentLog({fromJSON:sourceInstrument as InstrumentLog});\n case GaugeTypes.INSTRUMENT_TIMER :\n return new InstrumentTimerGauge({fromJSON:sourceInstrument as InstrumentTimerGauge});\n case GaugeTypes.INSTRUMENT_OBJECT :\n return new InstrumentObject({fromJSON:sourceInstrument as InstrumentObject});\n }\n throw new Error(`Cannot create instrument from type: [${sourceInstrument[GaugeTypes.GAUGE_TYPE]}]`)\n}\n\nexport function GetInstrumentName(gauge: Gauge): string {\n switch (gauge) {\n case Gauge.ACTIVE_REQUEST_GAUGE :\n return \"Active Requests\";\n case Gauge.AUTHENTICATION_COUNT_GAUGE :\n return \"Authentication Count\";\n case Gauge.AUTHENTICATION_ERROR_COUNT_GAUGE :\n return \"Authentication Error Count\";\n case Gauge.AUTHENTICATION_RETRY_COUNT_GAUGE :\n return \"Authentication Retry Count\";\n case Gauge.CONNECTION_POOL_IDLE_GAUGE :\n return \"Connection Pool Idle\";\n case Gauge.CONNECTION_POOL_TOTAL_GAUGE :\n return \"Connection Pool Total\";\n case Gauge.CONNECTION_POOL_WAITING_GAUGE :\n return \"Connection Pool Waiting\";\n case Gauge.CPU_LOAD_GAUGE :\n return \"CPU Load\";\n case Gauge.CPU_SYSTEM_LOAD_GAUGE :\n return \"CPU SYstem Load\";\n case Gauge.DURATION_GAUGE :\n return \"Duration\";\n case Gauge.DURATION_HISTOGRAM_GAUGE :\n return \"Diration Histogram\";\n case Gauge.ERROR_COUNT_GAUGE :\n return \"Errors\";\n case Gauge.LATENCY_GAUGE :\n return \"Latency\";\n case Gauge.LATENCY_HISTOGRAM_GAUGE :\n return \"Latency Histogram\";\n case Gauge.LOGGER :\n return \"Logger\";\n case Gauge.LOGGER_COPY :\n return \"_Logger\";\n case Gauge.NETWORK_RX_GAUGE :\n return \"Network Receive\";\n case Gauge.NETWORK_TX_GAUGE :\n return \"Network Transmit\";\n case Gauge.REQUEST_COUNT_GAUGE :\n return \"Requests\";\n case Gauge.RETRY_COUNT_GAUGE :\n return \"Retries\";\n case Gauge.TIMER_GAUGE :\n return \"Timer\";\n case Gauge.VELOCITY_GAUGE :\n return \"Velocity\";\n case Gauge.CONNECTION_COUNT_GAUGE :\n return \"TCP Connection\";\n case Gauge.OBJECT_GAUGE :\n return \"Object\";\n case Gauge.CORE_COUNT_GAUGE :\n return \"Core Count\";\n default:\n return \"Unknown\";\n }\n}\n\nexport function StopInstruments(instruments: InstrumentBase[] | Instruments): void {\n if (instruments) {\n if (Array.isArray(instruments)) {\n instruments.forEach((instrument) => {\n if (instrument.StopTimer) {\n instrument.StopTimer();\n }\n });\n } else {\n for (const [, value] of Object.entries(instruments)) {\n if (value.StopTimer) {\n value.StopTimer();\n }\n }\n }\n }\n}\n"],"x_google_ignoreList":[6,7,8],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["#options","#label","#data","#timerInterval","#valStackMaxLength","#copy","#autoComputeVelocity","#maxAverageValStack","#maxAverageIterations","#velocityTimeDiff","#vaTimeDiff","#autoComputeVelocityTimeout","#maxTimeDiff","#minTimeForReporting","#GetVal","#SetVal","#GetMaxVelocity","#GetDelta","#GetVelocity","#GetVelocityStackAverage","#GetTimeStamp","#GetCountDiff","#GetTimeDiff","#GetDeltaCountDiff","#GetDeltaTimeDif","#GetAverageVelocity","#valStack","#interval","#ComputeVelocity","#velocity","#averageValStack","#averageVelocity","#timeStamp","#velocityVal","#ComputeVelocityByTimeDiff","#valStackAverage","#delta","#countDiff","#timeDiff","#deltaCountDiff","#deltaTimeDif","#lastVelocity","#maxVelocity","#timeoutComputeVelocity","#SetupAutoComputeVelocity","#copy","#histogramData","#GetVal","#SetVal","#GetHistogramData","#SetHistogramData","#val","#maxSize","#copy","#useLatestMessages","#consoleLogging","#instrumentLogging","#winstonLogging","#GetVal","#SetVal","#DumpToConsole","#stsLogger","#messages","#readPos","#copy","#GetVal","#SetVal","#pauseVal","#start","#timerInterval","#maxSampleSize","#copy","#GetVal","#SetVal","#GetPercentileData","#GetMin","#GetMax","#GetAverage","#timeSeriesList","#observer","#GetAndResetMaxVal","#maxval","#lastObservedValue","#val","#observations","#total","#max","#min","#NumberCompare","#copy","#GetVal","#SetVal","#val"],"sources":["../src/instrumentation/instrumentDefs.ts","../src/instrumentation/instruments/instrumentBase.ts","../src/instrumentation/instruments/instrumentVelocity.ts","../src/instrumentation/instruments/instrumentHistogram.ts","../src/instrumentation/instruments/instrumentLog.ts","../src/instrumentation/instruments/instrumentTimerGauge.ts","../node_modules/timsort/build/timsort.js","../node_modules/timsort/index.js","../node_modules/percentile/lib/index.js","../src/instrumentation/instruments/instrumentGauge.ts","../src/instrumentation/instruments/instrumentObject.ts","../src/instrumentation/instrumentUtils.ts"],"sourcesContent":["export enum Gauge {\n\tACTIVE_REQUEST_GAUGE = 'a',\n\tAUTHENTICATION_COUNT_GAUGE = 'b',\n\tAUTHENTICATION_ERROR_COUNT_GAUGE = 'aa',\n\tAUTHENTICATION_RETRY_COUNT_GAUGE = 'ab',\n\tCONNECTION_POOL_IDLE_GAUGE = 'c',\n\tCONNECTION_POOL_TOTAL_GAUGE = 'd',\n\tCONNECTION_POOL_WAITING_GAUGE = 'e',\n\tCPU_LOAD_GAUGE = 'f',\n\tCPU_SYSTEM_LOAD_GAUGE = 'g',\n\tDURATION_GAUGE = 'h',\n\tDURATION_HISTOGRAM_GAUGE = 'i',\n\tERROR_COUNT_GAUGE = 'j',\n\tLATENCY_GAUGE = 'k',\n\tLATENCY_HISTOGRAM_GAUGE = 'l',\n\tLOGGER = 'm',\n\tLOGGER_COPY = 'n',\n\tNETWORK_RX_GAUGE = 'o',\n\tNETWORK_TX_GAUGE = 'p',\n\tREQUEST_COUNT_GAUGE = 'q',\n\tRETRY_COUNT_GAUGE = 'r',\n\tTIMER_GAUGE = 's',\n\tVELOCITY_GAUGE = 't',\n\tCONNECTION_COUNT_GAUGE = 'u',\n\tOBJECT_GAUGE = 'v',\n\tPAYLOAD_SIZE = 'w',\n\tCORE_COUNT_GAUGE = 'x',\n\tCHILD_COUNT = 'y',\n\tUNKNOWN = 'z'\n}\n\nexport enum GaugeTypes {\n\tGAUGE_TYPE = '_',\n\tINSTRUMENT_GAUGE = 'a',\n\tINSTRUMENT_VELOCITY = 'b',\n\tINSTRUMENT_HISTOGRAM = 'c',\n\tINSTRUMENT_LOG = 'd',\n\tINSTRUMENT_TIMER = 'e',\n\tINSTRUMENT_OBJECT = 'f'\n}\n","import { JSONObject } from '@nsshunt/stsutils'\nimport { Gauge, GaugeTypes } from '../instrumentDefs.js'\n\nexport class InstrumentBaseOptions {\n fixedSize?: number\n padLength?: number\n label?: string\n}\n\nexport class InstrumentBaseTelemetry {\n\n}\n\nexport abstract class InstrumentBase {\n #label = '';\n #options: InstrumentBaseOptions | null = null;\n #data: Record<string, unknown> = { };\n\n // Use for copy objects only.\n //protected _data: Record<string, any> = { };\n\n constructor(options: InstrumentBaseOptions = { })\n {\n if (typeof options === 'string' || options instanceof String) {\n throw new Error('Instrument parameter must be an options object.');\n }\n\n this.#options = options;\n\n if (options.label) {\n this.#label = options.label;\n } else {\n this.#label = 'InstrumentGauge';\n }\n\n // Create an object to store all props\n //Object.defineProperty(this, '_data', { value: { } });\n\n //@@ change all properties to use this pattern\n\n /*\n\t\t// https://github.com/Asymmetrik/node-fhir-server-core/blob/master/packages/node-fhir-server-core/src/server/resources/4_0_1/schemas/account.js\n\n\t\t// Create an object to store all props\n\t\tObject.defineProperty(this, '__data', { value: {} });\n\n\t\tObject.defineProperty(this, '_value', {\n\t\t\tenumerable: true,\n\t\t\tget: () => this.__data._value,\n\t\t\tset: (value) => {\n\t\t\tif (value === undefined || value === null) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.__data._value = value;\n\t\t\t}\n\t\t});\n\t\t*/\n\n // Define a default non-writable resourceType property\n /*\n\t\tObject.defineProperty(this, '_reportValue', {\n\t\t\tenumerable: true,\n\t\t\tget: () => this.GetFormatted()\n\t\t});\n\n\t\tObject.defineProperty(this, '_serialValue', {\n\t\t\tenumerable: true,\n\t\t\tget: () => this.GetSerialValue(),\n\t\t\tset: (value) => { this.SetSerialValue(value); }\n\t\t});\n\t\t*/\n }\n\n public [GaugeTypes.GAUGE_TYPE]: GaugeTypes = GaugeTypes.INSTRUMENT_OBJECT // Default Gauge type\n val?: number | string[] | JSONObject\n\n WithLabel(label: string) {\n this.label = label;\n return this;\n }\n\n DefineCopyProperties(propertyNames: string[]): void {\n propertyNames.forEach(propertyName => {\n Object.defineProperty(this, propertyName, {\n enumerable: true,\n get: () => this.#data[propertyName],\n set: (value) => {\n if (value === undefined) {\n return;\n }\n this.#data[propertyName] = value;\n }\n });\n });\n }\n\t\n GetNumber(val: number): number {\n if (Number.isInteger(val)) {\n return val;\n } else {\n return Math.round((val + Number.EPSILON) * 100) / 100;\n }\n }\n\n get options(): InstrumentBaseOptions | null {\n return this.#options;\n }\n\n set options(optionsValue: InstrumentBaseOptions | null) {\n this.#options = optionsValue;\n }\n\n get label(): string {\n return this.#label;\n }\n\n set label(labelValue: string) {\n this.#label = labelValue;\n }\n\n StopTimer(): void\n {\n //\tOverride in sub class if timers are used ...\n }\n\n ProcessTelemetry(telemetry: InstrumentBaseTelemetry): void {\n throw new Error(`Must override in extended class: [ProcessTelemetry]: [${telemetry}].`);\n }\n\n /*\n\ttoJSON()\n\t{\n\t\treturn this._serialValue;\n\t}\n\t*/\n\n /*\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols\n\t[Symbol.iterator]() {\n\t\t// Use a new index for each iterator. This makes multiple\n\t\t// iterations over the iterable safe for non-trivial cases,\n\t\t// such as use of break or nested looping over the same iterable.\n\t\tlet index = 0;\n\t\n\t\treturn {\n\t\t\tnext: () => {\n\t\t\t\tif (index < 1) {\n\t\t\t\t\treturn {value: this.GetFormatted(), done: false}\n\t\t\t\t} else {\n\t\t\t\t\treturn {done: true}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t*/\n}\n\nexport type Instruments = Partial<Record<Gauge, InstrumentBase>>\n","import _cloneDeep from 'lodash.clonedeep'\n\nimport { InstrumentBase, InstrumentBaseOptions, InstrumentBaseTelemetry } from './instrumentBase.js'\nimport { GaugeTypes } from '../instrumentDefs.js'\nimport { JSONObject, isNode } from '@nsshunt/stsutils'\n\nexport interface VelocityReportValue extends JSONObject {\n\tval: number\n\tvalue: string\n\tvf: string\n\tdelta: number\n\tmaxVelocity: number\n\tvelocity: number\n\tva: number\n}\n\nexport class InstrumentVelocityOptions extends InstrumentBaseOptions {\n interval?: number\n valStackMaxLength?: number\n maxAverageValStack?: number\n maxAverageIterations?: number\n fromJSON?: InstrumentVelocity\n initValue?: number\n autoComputeVelocity?: boolean\n velocityTimeDiff?: number\n vaTimeDiff?: number\n autoComputeVelocityTimeout?: number\n}\n\nexport class InstrumentVelocityTelemetry extends InstrumentBaseTelemetry {\n val?: number\n Inc?: number\n}\n\ndeclare interface IDataPoint {\n\ttimeStamp: number\n\tcount: number\n}\n\ndeclare interface IVelocityDataPoint {\n\tval: number\n\tcountDiff: number\n\ttimeDiff: number\n\tdeltaVal: number\n\tdeltaCountDiff: number\n\tdeltaTimeDiff: number\n}\n\nexport class InstrumentVelocity extends InstrumentBase\n{\n // eslint-disable-next-line @/no-unused-private-class-members\n #val = 0;\n #interval: NodeJS.Timeout | null = null;\n #timeoutComputeVelocity: NodeJS.Timeout | null = null;\n // eslint-disable-next-line @/no-unused-private-class-members\n #lastVelocity = 0;\n #delta = 0;\n #maxVelocity = 0;\n #timerInterval = 0;\n #copy = false;\n #velocity = 0;\n #velocityVal = 0;\n #valStack: IDataPoint[] = [ ];\n #averageValStack: number[][] = [];\n #maxAverageValStack = 0;\n #maxAverageIterations = 0;\n // eslint-disable-next-line @/no-unused-private-class-members\n #valStackMaxLength = 0;\n #valStackAverage = 0.0;\n #timeStamp = 0;\n #maxTimeDiff = 0;\n #vaTimeDiff = 0;\n #velocityTimeDiff = 0;\n #autoComputeVelocity = false;\n #autoComputeVelocityTimeout = 0; // 50ms to auto computer after an update when not in auto compute mode.\n #countDiff = 0;\n #timeDiff = 0;\n #deltaCountDiff = 0;\n #deltaTimeDif = 0;\n #minTimeForReporting = 0;\n #averageVelocity: number[] = []\n\n // timeWindow = Number of intervals to use as the sliding time window same size. Uses average value within the time window. Larger window produces a smooth (more laggy) curve. Shorter time\n // window may be \"spikey\" depending on the volatility of the data being recorded.\n constructor(options: InstrumentVelocityOptions = { }) {\n super(options);\n\n if (typeof options.label === 'undefined') {\n this.label = 'InstrumentVelocity';\n } else {\n this.label = options.label;\n }\n\n if (typeof options.interval === 'undefined') {\n this.#timerInterval = 1000;\n } else {\n this.#timerInterval = options.interval;\n }\n\n if (typeof options.valStackMaxLength === 'undefined') {\n this.#valStackMaxLength = 100;\n } else {\n this.#valStackMaxLength = options.valStackMaxLength;\n }\n\n if (typeof options.fromJSON === 'undefined') {\n this.#copy = false;\n } else {\n this.#copy = true;\n }\n\n if (typeof options.autoComputeVelocity === 'undefined') {\n this.#autoComputeVelocity = false;\n } else {\n this.#autoComputeVelocity = options.autoComputeVelocity;\n }\n\n if (typeof options.maxAverageValStack === 'undefined') {\n this.#maxAverageValStack = 5;\n } else {\n this.#maxAverageValStack = options.maxAverageValStack;\n }\n\n if (typeof options.maxAverageIterations === 'undefined') {\n this.#maxAverageIterations = 3;\n } else {\n this.#maxAverageIterations = options.maxAverageIterations;\n }\n\n if (typeof options.velocityTimeDiff === 'undefined') {\n this.#velocityTimeDiff = 5000;\n } else {\n this.#velocityTimeDiff = options.velocityTimeDiff;\n }\n\n if (typeof options.vaTimeDiff === 'undefined') {\n this.#vaTimeDiff = 10000;\n } else {\n this.#vaTimeDiff = options.vaTimeDiff;\n }\n\n if (typeof options.autoComputeVelocityTimeout === 'undefined') {\n this.#autoComputeVelocityTimeout = 50;\n } else {\n this.#autoComputeVelocityTimeout = options.autoComputeVelocityTimeout;\n }\n\n this.#maxTimeDiff = this.#vaTimeDiff * 2;\n this.#minTimeForReporting = this.#vaTimeDiff + 2000;\n\n\n Object.defineProperty(this, GaugeTypes.GAUGE_TYPE, {\n enumerable: true,\n get: () => GaugeTypes.INSTRUMENT_VELOCITY\n });\n\n if (this.#copy) {\n this.DefineCopyProperties([\n 'val', 'maxVelocity', 'delta', 'velocity', 'va', 'timeStamp',\n 'deltaTimeDif', 'deltaCountDiff', 'timeDiff', 'countDiff', 'averageVelocity'\n ]);\n } else {\n Object.defineProperty(this, 'val', {\n enumerable: true,\n get: () => this.#GetVal(),\n set: (value) => { this.#SetVal(value); }\n });\n\n Object.defineProperty(this, 'maxVelocity', {\n enumerable: true,\n get: () => this.#GetMaxVelocity()\n });\n\n Object.defineProperty(this, 'delta', {\n enumerable: true,\n get: () => this.#GetDelta()\n });\n\n Object.defineProperty(this, 'velocity', {\n enumerable: true,\n get: () => this.#GetVelocity()\n });\n\n Object.defineProperty(this, 'va', {\n enumerable: true,\n get: () => this.#GetVelocityStackAverage()\n });\n\n Object.defineProperty(this, 'timeStamp', {\n enumerable: true,\n get: () => this.#GetTimeStamp()\n });\n\n Object.defineProperty(this, 'countDiff', {\n enumerable: true,\n get: () => this.#GetCountDiff()\n });\n\n Object.defineProperty(this, 'timeDiff', {\n enumerable: true,\n get: () => this.#GetTimeDiff()\n });\n\n Object.defineProperty(this, 'deltaCountDiff', {\n enumerable: true,\n get: () => this.#GetDeltaCountDiff()\n });\n\n Object.defineProperty(this, 'deltaTimeDif', {\n enumerable: true,\n get: () => this.#GetDeltaTimeDif()\n });\n\n Object.defineProperty(this, 'averageVelocity', {\n enumerable: true,\n get: () => this.#GetAverageVelocity()\n });\n\n if (this.#timerInterval > 0 && this.#autoComputeVelocity === false) {\n this._StartTimer();\n }\n }\n\n if (typeof options.initValue !== 'undefined') {\n this.val = options.initValue;\n }\n\n // Set copy values now that we have defined our properties\n if (typeof options.fromJSON !== 'undefined') {\n const result = _cloneDeep(options.fromJSON);\n this.val = result.val;\n this.velocity = result.velocity;\n this.maxVelocity = result.maxVelocity;\n this.delta = result.delta;\n this.va = result.va;\n this.timeStamp = result.timeStamp;\n this.countDiff = result.countDiff;\n this.timeDiff = result.timeDiff;\n this.deltaCountDiff = result.deltaCountDiff;\n this.deltaTimeDif = result.deltaTimeDif;\n this.averageVelocity = _cloneDeep(result.averageVelocity);\n }\n }\n\n public readonly maxVelocity: number = 0;\n public readonly delta: number = 0;\n public readonly velocity: number = 0;\n public readonly va: number = 0;\n public readonly timeStamp: number = 0;\n public readonly countDiff: number = 0;\n public readonly timeDiff: number = 0;\n public readonly deltaCountDiff: number = 0;\n public readonly deltaTimeDif: number = 0;\n public readonly averageVelocity: number[] = [];\n public val = 0;\n\n WithValStackMaxLength(valStackMaxLength: number): InstrumentVelocity {\n this.#valStackMaxLength = valStackMaxLength;\n this.#valStack = [ ];\n return this;\n }\n\n private _StartTimer(): void\n {\n this.#interval = setInterval(() => {\n this.#ComputeVelocity();\n\n let pushVal = this.#velocity;\n for (let i=0; i < this.#maxAverageIterations; i++) {\n if (!this.#averageValStack[i]) {\n this.#averageValStack[i] = [ ];\n }\n this.#averageValStack[i].push(pushVal);\n if (this.#averageValStack[i].length > this.#maxAverageValStack) {\n this.#averageValStack[i].shift();\n }\n pushVal = this.#averageValStack[i].reduce((prev, current) => prev + current) / this.#averageValStack[i].length;\n this.#averageVelocity[i] = pushVal;\n }\n }, this.#timerInterval);\n\n // If running in node ...\n if (isNode) {\n this.#interval.unref();\n }\n // https://httptoolkit.tech/blog/unblocking-node-with-unref/\n }\n\n #ComputeVelocityByTimeDiff(checkTimeDiff: number, checkDeltaTimeDiff: number): IVelocityDataPoint {\n // As long as we have at least two data points ...\n let val = 0.0;\n let deltaVal = 0.0;\n let countDiff = 0;\n let timeDiff = 0;\n let deltaCountDiff = 0;\n let deltaTimeDiff = 0;\n\n if (this.#valStack.length > 1 && (this.#valStack[this.#valStack.length-1].timeStamp - this.#valStack[0].timeStamp) > this.#minTimeForReporting) {\n // Get the current data point\n const dp: IDataPoint = this.#valStack[this.#valStack.length-1];\n // Compute the stack position for the first entry where the diff is >= timeDiff\n let timeDiffPos = -1;\n let deltaDiffPos = -1;\n for (let i = this.#valStack.length-2; i > -1; i--) {\n if (timeDiffPos === -1 && (this.#timeStamp - this.#valStack[i].timeStamp) >= checkTimeDiff) {\n timeDiffPos = i;\n if (checkDeltaTimeDiff === 0) {\n break;\n }\n }\n if (deltaDiffPos === -1 && (this.#timeStamp - this.#valStack[i].timeStamp) >= checkDeltaTimeDiff) {\n deltaDiffPos = i;\n }\n if (timeDiffPos !== -1 && deltaDiffPos !== -1) {\n break;\n }\n }\n if (timeDiffPos > -1) {\n countDiff = dp.count - this.#valStack[timeDiffPos].count;\n if (countDiff > 0) {\n timeDiff = dp.timeStamp - this.#valStack[timeDiffPos].timeStamp;\n if (timeDiff > 0.0) {\n // Get velocity per second\n val = (1000.0 / timeDiff) * countDiff;\n } else {\n val = 0;\n }\n } else {\n val = 0; // We have the same count for the desired timeDiff time span.\n }\n } else {\n val = 0; // We don't yet have a value for the desired timeDiff time span.\n }\n\n if (deltaDiffPos > -1) {\n deltaCountDiff = this.#valStack[timeDiffPos].count - this.#valStack[deltaDiffPos].count;\n if (deltaCountDiff > 0) {\n deltaTimeDiff = this.#valStack[timeDiffPos].timeStamp - this.#valStack[deltaDiffPos].timeStamp\n if (deltaTimeDiff > 0.0) {\n // Get velocity per second\n deltaVal = (1000.0 / deltaTimeDiff) * deltaTimeDiff;\n } else {\n deltaVal = 0;\n }\n } else {\n deltaVal = 0; // We have the same count for the desired deltaTimeDiff time span.\n }\n } else {\n deltaVal = 0; // We don't yet have a value for the desired deltaTimeDiff time span.\n }\n }\n return {\n val,\n countDiff,\n timeDiff,\n deltaVal,\n deltaCountDiff,\n deltaTimeDiff\n }\n }\n\n #ComputeVelocity(): void {\n const dp: IDataPoint = {\n timeStamp: performance.now(),\n count: this.#velocityVal\n }\n this.#valStack.push(dp);\n\n this.#timeStamp = dp.timeStamp;\n\n while (this.#valStack.length > 0 && ((this.#timeStamp - this.#valStack[0].timeStamp) > this.#maxTimeDiff)) {\n this.#valStack.shift();\n }\n\n const valStackAverageDataPoint = this.#ComputeVelocityByTimeDiff(this.#vaTimeDiff, 0);\n this.#valStackAverage = valStackAverageDataPoint.val;\n\n const velocityDataPoint = this.#ComputeVelocityByTimeDiff(this.#velocityTimeDiff, this.#velocityTimeDiff * 2);\n this.#velocity = velocityDataPoint.val;\n this.#delta = velocityDataPoint.val - velocityDataPoint.deltaVal;\n\n this.#countDiff = velocityDataPoint.countDiff\n this.#timeDiff = velocityDataPoint.timeDiff\n this.#deltaCountDiff = velocityDataPoint.deltaCountDiff\n this.#deltaTimeDif = velocityDataPoint.deltaTimeDiff\n\n this.#lastVelocity = this.#velocity;\n if (this.#velocity > this.#maxVelocity) {\n this.#maxVelocity = this.#velocity;\n }\n }\n\n #SetupAutoComputeVelocity(): void {\n if (this.#timeoutComputeVelocity) {\n clearTimeout(this.#timeoutComputeVelocity);\n }\n this.#timeoutComputeVelocity = setTimeout(() => {\n this.#ComputeVelocity();\n }, this.#autoComputeVelocityTimeout);\n\n // Note: We do not check if running in node for an unref() because unref() is expensive and this is being\n // called for each change in val. The value of autoComputeVelocityTimeout (around 50ms) is very small and should not prevent application\n // termination issues.\n }\n\n #GetVelocityStackAverage(): number {\n return this.GetNumber(this.#valStackAverage);\n }\n\n Inc(incVal = 1): void {\n this.#velocityVal += incVal;\n if (this.#autoComputeVelocity) {\n this.#ComputeVelocity();\n } else {\n this.#SetupAutoComputeVelocity();\n }\n }\n\n #GetVal(): number {\n return this.GetNumber(this.#velocityVal);\n }\n\n #SetVal(updatedValue: number): void {\n this.#velocityVal = updatedValue;\n if (this.#autoComputeVelocity) {\n this.#ComputeVelocity();\n } else {\n this.#SetupAutoComputeVelocity();\n }\n }\n\n #GetVelocity(): number {\n return this.GetNumber(this.#velocity);\n }\n\n #GetMaxVelocity(): number {\n return this.GetNumber(this.#maxVelocity);\n }\n\n #GetDelta(): number {\n return this.GetNumber(this.#delta);\n }\n\n #GetTimeStamp(): number {\n return this.GetNumber(this.#timeStamp);\n }\n\n #GetCountDiff(): number {\n return this.GetNumber(this.#countDiff);\n }\n\n #GetTimeDiff(): number {\n return this.GetNumber(this.#timeDiff);\n }\n\n #GetDeltaCountDiff(): number {\n return this.GetNumber(this.#deltaCountDiff);\n }\n\n #GetDeltaTimeDif(): number {\n return this.GetNumber(this.#deltaTimeDif);\n }\n\n #GetAverageVelocity(): number[] {\n return this.#averageVelocity;\n }\n\n override StopTimer(): void {\n if (this.#interval !== null) {\n clearTimeout(this.#interval);\n this.#interval = null;\n }\n }\n\n override ProcessTelemetry(telemetry: InstrumentVelocityTelemetry): void {\n if (telemetry.Inc !== undefined) {\n this.Inc(telemetry.Inc);\n }\n if (telemetry.val !== undefined) {\n this.val = telemetry.val;\n }\n }\n}\n","import _cloneDeep from 'lodash.clonedeep'\n\nimport { InstrumentBase, InstrumentBaseOptions, InstrumentBaseTelemetry } from './instrumentBase.js'\nimport { GaugeTypes } from '../instrumentDefs.js'\n\nimport { JSONObject } from '@nsshunt/stsutils'\n\nexport interface HistogramReportValue extends JSONObject {\n\tval: number\n\thist: HistogramDataElement[]\n\tvf: string\n}\n\nexport enum HistogramDataElementPos {\n\tval = 0,\n\tlabel = 1,\n\tbreakPoint = 2\n}\n\nexport type HistogramDataElement = [\n\tval: number,\n\tlabel: string,\n\tbreakPoint: number\n]\n\nexport class InstrumentHistogramOptions extends InstrumentBaseOptions {\n histogramData?: number[]\n initValue?: number\n fromJSON?: InstrumentHistogram\n}\n\nexport class InstrumentHistogramTelemetry extends InstrumentBaseTelemetry {\n val?: number\n}\n\nexport class InstrumentHistogram extends InstrumentBase\n{\n #histogramData: HistogramDataElement[] = [ ];\n #val = 0;\n #copy = false;\n\t\n constructor(options: InstrumentHistogramOptions = { }) {\n super(options);\n\n if (typeof options.label === 'undefined') {\n this.label = 'InstrumentHistogram';\n } else {\n this.label = options.label;\n }\n\n let histogramData: number[] | null = null;\n if (typeof options.histogramData === 'undefined') {\n histogramData = null;\n } else {\n histogramData = options.histogramData;\n }\n\n if (typeof options.fromJSON === 'undefined') {\n this.#copy = false;\n } else {\n this.#copy = true;\n }\n\n if (histogramData === null) {\n this.#histogramData = [\n [ 0, \"10\", 10 ],\n [ 0, \"20\", 20 ],\n [ 0, \"50\", 50 ],\n [ 0, \"100\", 100 ],\n [ 0, \"1000\", 1000 ],\n [ 0, \"5000\", 5000 ],\n [ 0, \"EE\", 0 ]\n ]\n } else if (Array.isArray(histogramData)) {\n this.#histogramData = [ ];\n for (let i=0; i < histogramData.length; i++) {\n this.#histogramData.push([0, '' + histogramData[i], parseFloat(histogramData[i].toString())]);\n }\n this.#histogramData.push([ 0, \"EE\", 0 ]);\n } else {\n throw new Error(`Passed [${histogramData}] must be an array.`);\n }\n\n Object.defineProperty(this, GaugeTypes.GAUGE_TYPE, {\n enumerable: true,\n get: () => GaugeTypes.INSTRUMENT_HISTOGRAM\n });\n\n if (this.#copy) {\n this.DefineCopyProperties([\n 'val', 'hist' \n ]);\n } else {\n Object.defineProperty(this, 'val', {\n enumerable: true,\n get: () => this.#GetVal(),\n set: (value) => { this.#SetVal(value); }\n });\n Object.defineProperty(this, 'hist', {\n enumerable: true,\n get: () => this.#GetHistogramData(),\n set: (value) => { this.#SetHistogramData(value); }\n });\n }\n\n if (typeof options.initValue !== 'undefined') {\n this.#val = options.initValue;\n }\n\n // Set copy values now that we have defined our properties\n if (typeof options.fromJSON !== 'undefined') {\n const result = _cloneDeep(options.fromJSON);\n this.#val = result.val as number;\n this.hist = result.hist;\n }\n }\n\n public hist: HistogramDataElement[] = [ ];\n public val = 0;\n\n WithInitVal(initVal: number): InstrumentHistogram {\n this.#val = initVal;\n return this;\n }\n\n ResetHistogramData(): void {\n for (let i=0; i < this.hist.length; i++) {\n this.hist[i][0] = 0;\n }\n }\n\n AddObservation(updateValue: number): void {\n if (this.#copy) {\n throw new Error('Cannot add observations from the copy version of this class.');\n }\n let i = 0;\n for (; i < this.#histogramData.length-1; i++)\n {\n if (updateValue <= this.#histogramData[i][HistogramDataElementPos.breakPoint])\n {\n this.#histogramData[i][HistogramDataElementPos.val]++;\n return;\n }\n }\n this.#histogramData[i][HistogramDataElementPos.val]++;\n }\n\n #GetVal(): number {\n return this.GetNumber(this.#val);\n }\n\n #SetVal(value: number) {\n this.#val = value;\n this.AddObservation(value);\n }\n\n get\tformattedHistogramData(): string {\n let retVal = '';\n let sep = '';\n for (let i=0; i < this.hist.length; i++) {\n retVal += sep + '[' + (this.hist[i][HistogramDataElementPos.val] + '/' + this.hist[i][HistogramDataElementPos.label]).padStart(10, ' ') + ']';\n sep = ' ';\n }\n return retVal;\n }\n\n #GetHistogramData(): HistogramDataElement[] {\n return this.#histogramData;\n }\n\n #SetHistogramData(value: HistogramDataElement[]) {\n this.#histogramData = value;\n }\n\n static AddHistogramDataEx(histoA: InstrumentHistogram | null, histoB: InstrumentHistogram): InstrumentHistogram {\n if (histoA === null) {\n return _cloneDeep(histoB);\n }\n\n const result = _cloneDeep(histoA);\n const histogramAData = result.hist;\n const histogramBData = histoB.hist;\n\n if (histogramAData.length !== histogramBData.length) {\n throw new Error('Invalid HistogramData. HistogramData bucket lengths must be the same.')\n }\n for (let i=0; i < histogramAData.length; i++)\n {\n if (histogramAData[i][HistogramDataElementPos.breakPoint] !== histogramBData[i][HistogramDataElementPos.breakPoint]) {\n throw new Error(`Invalid HistogramData. HistogramData bucket break-point at index [${i}] must be the same.`)\n }\n if (histogramAData[i][HistogramDataElementPos.label] !== histogramBData[i][HistogramDataElementPos.label]) {\n throw new Error(`Invalid HistogramData. HistogramData bucket label at index [${i}] must be the same.`)\n }\n histogramAData[i][HistogramDataElementPos.val] += histogramBData[i][HistogramDataElementPos.val];\n }\n\n return result;\n }\n\n /**\n\t * Adds a value object (from GetFormatted()) to this instance.\n\t * @param {*} value \n\t */\n AddHistogramData(histogramData: InstrumentHistogram): void {\n if (histogramData === null) {\n return;\n }\n\n if (this.hist.length !== histogramData.hist.length) {\n throw new Error('Invalid HistogramData. HistogramData bucket lengths must be the same.')\n }\n for (let i=0; i < histogramData.hist.length; i++)\n {\n if (this.hist[i][HistogramDataElementPos.breakPoint] !== histogramData.hist[i][HistogramDataElementPos.breakPoint]) {\n throw new Error(`Invalid HistogramData. HistogramData bucket break-point at index [${i}] must be the same.`)\n }\n if (this.hist[i][HistogramDataElementPos.label] !== histogramData.hist[i][HistogramDataElementPos.label]) {\n throw new Error(`Invalid HistogramData. HistogramData bucket label at index [${i}] must be the same.`)\n }\n this.hist[i][HistogramDataElementPos.val] += histogramData.hist[i][HistogramDataElementPos.val];\n }\n }\n\t\n override ProcessTelemetry(telemetry: InstrumentHistogramTelemetry): void {\n if (telemetry.val !== undefined) {\n this.val = telemetry.val;\n }\n }\n}\n","/* eslint @typescript-eslint/no-explicit-any: 0 */ // --> OFF\nimport _cloneDeep from 'lodash.clonedeep'\n\nimport { InstrumentBase, InstrumentBaseOptions, InstrumentBaseTelemetry } from './instrumentBase.js'\nimport { GaugeTypes } from '../instrumentDefs.js'\n\nimport { JSONObject, ISTSLogger } from '@nsshunt/stsutils'\n\nexport interface LogReportValue extends JSONObject {\n\tval: string[]\n}\n\nexport class InstrumentLogOptions extends InstrumentBaseOptions {\n maxSize?: number\n useLatestMessages?: boolean\n consoleLogging?: boolean\n instrumentLogging?: boolean\n winstonLogging?: boolean\n fromJSON?: InstrumentLog\n initValue?: string[]\n logger?: ISTSLogger\n}\n\nexport class InstrumentLogTelemetry extends InstrumentBaseTelemetry {\n Append?: string[]\n LogMessage?: string\n val?: string[]\n ResetLog?: boolean\n}\n\nexport class InstrumentLog extends InstrumentBase implements ISTSLogger\n{\n #messages: string[] = [ ];\n #readPos = 0;\n #maxSize = 200; // Max length of cached log messages\n #copy = false;\n #useLatestMessages = false;\n #consoleLogging = false;\n #instrumentLogging = true;\n #winstonLogging = false;\n #stsLogger: ISTSLogger | undefined;\n\n constructor(options: InstrumentLogOptions = { })\n {\n super(options);\n\n if (typeof options.label === 'undefined') {\n this.label = 'InstrumentLog';\n } else {\n this.label = options.label;\n }\n\n if (typeof options.maxSize === 'undefined') {\n this.#maxSize = 200;\n } else {\n this.#maxSize = options.maxSize;\n }\n\n if (typeof options.fromJSON === 'undefined') {\n this.#copy = false;\n } else {\n this.#copy = true;\n }\n\n if (typeof options.useLatestMessages === 'undefined') {\n this.#useLatestMessages = false;\n } else {\n this.#useLatestMessages = options.useLatestMessages;\n }\n\n if (typeof options.consoleLogging === 'undefined') {\n this.#consoleLogging = false;\n } else {\n this.#consoleLogging = options.consoleLogging;\n }\n\n if (typeof options.instrumentLogging === 'undefined') {\n this.#instrumentLogging = true;\n } else {\n this.#instrumentLogging = options.instrumentLogging;\n }\n\n if (typeof options.winstonLogging === 'undefined') {\n this.#winstonLogging = false;\n } else {\n this.#winstonLogging = options.winstonLogging;\n }\n\n Object.defineProperty(this, GaugeTypes.GAUGE_TYPE, {\n enumerable: true,\n get: () => GaugeTypes.INSTRUMENT_LOG\n });\n\n if (this.#copy) {\n this.DefineCopyProperties([\n 'val' \n ]);\n } else {\n Object.defineProperty(this, 'val', {\n enumerable: true,\n get: () => _cloneDeep(this.#GetVal()),\n set: (value) => { this.#SetVal(value); }\n });\n }\n\n if (typeof options.initValue !== 'undefined') {\n this.val = options.initValue;\n }\n\n // Set copy values now that we have defined our properties\n if (typeof options.fromJSON !== 'undefined') {\n const result = _cloneDeep(options.fromJSON);\n this.val = result.val;\n }\n }\n\n public val: string[] = [];\n\n WithMaxSize(maxSize: number): InstrumentLog {\n this.#maxSize = maxSize;\n return this;\n }\n\n WithUseLatestMessages(useLatestMessages: boolean): InstrumentLog {\n this.#useLatestMessages = useLatestMessages;\n return this;\n }\n\n WithConsoleLogging(consoleLogging: boolean): InstrumentLog {\n this.#consoleLogging = consoleLogging;\n return this;\n }\n\n WithInstrumentLogging(instrumentLogging: boolean): InstrumentLog {\n this.#instrumentLogging = instrumentLogging;\n return this;\n }\n\n get MaxSize(): number {\n return this.#maxSize;\n }\n\n set MaxSize(maxSize: number) {\n this.#maxSize = maxSize;\n }\n\n #DumpToConsole(): void\n {\n const logReport = this.GetMessagesSinceLastRead();\n for (let i=0; i < logReport.length; i++) {\n console.log(logReport[i]);\n }\n }\n\n get consoleLogging(): boolean {\n return this.#consoleLogging;\n }\n\n set consoleLogging(value: boolean) {\n this.#consoleLogging = value;\n if (value === true) {\n this.#DumpToConsole();\n }\n }\n\n get instrumentLogging(): boolean {\n return this.#instrumentLogging;\n }\n\n set instrumentLogging(value: boolean) {\n this.#instrumentLogging = value;\n }\n\n Append(messageArray: string[]): void {\n for (let i=0; i < messageArray.length; i++) {\n this.LogMessage(messageArray[i]);\n }\n }\n\n error(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.error(message);\n }\n\n warn(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.warn(message);\n }\n\n info(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.info(message);\n }\n\n http(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.http(message);\n }\n\n verbose(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.verbose(message);\n }\n\n debug(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.debug(message);\n }\n\n silly(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.silly(message);\n }\n\n LogMessage(message: string): void {\n if (this.#copy) {\n throw new Error('Cannot add log messages from the copy version of this class.');\n }\n if (this.#consoleLogging === true) {\n console.log(message);\n }\n\n if (this.#instrumentLogging === false) {\n return;\n }\n\n this.#messages.push(message);\n if (this.#messages.length > this.#maxSize) {\n this.#messages.shift();\n this.#readPos = (this.#readPos > 0 ? this.#readPos-1 : 0);\n }\n }\n\n #GetVal(): string[]\n {\n if (this.#useLatestMessages) {\n return this.GetMessagesSinceLastRead();\n } else {\n return this.#messages;\n }\n }\n\n #SetVal(updatedValue: string[]): void\n {\n this.#messages = updatedValue;\n this.#readPos = 0;\n }\n\n GetMessagesNoUpdate(): string[] {\n return this.#messages.slice(this.#readPos);\n }\n\n // This will return only those messages that have been added since the last read\n GetMessagesSinceLastRead(): string[]\n {\n const retVal = this.#messages.slice(this.#readPos);\n this.#readPos = this.#messages.length;\n return retVal;\n }\n\n ResetLog(): void\n {\n this.#messages = [ ];\n this.#readPos = 0;\n }\n\n override ProcessTelemetry(telemetry: InstrumentLogTelemetry): void {\n if (telemetry.val !== undefined) {\n this.val = telemetry.val;\n }\n if (telemetry.Append !== undefined) {\n this.Append(telemetry.Append);\n }\n if (telemetry.LogMessage !== undefined) {\n this.LogMessage(telemetry.LogMessage);\n }\n if (telemetry.ResetLog !== undefined && telemetry.ResetLog === true) {\n this.ResetLog();\n }\n }\n}\n","//import * as ph from 'node:perf_hooks'; //@@ need to test - may not work in browser\n\nimport _cloneDeep from 'lodash.clonedeep'\n\nimport { InstrumentBase, InstrumentBaseOptions, InstrumentBaseTelemetry } from './instrumentBase.js'\nimport { GaugeTypes } from '../instrumentDefs.js'\n\nimport { JSONObject } from '@nsshunt/stsutils'\n\n// Potentially, look @ this module...\n// https://www.npmjs.com/package/performance-now\n\nexport interface TimerReportValue extends JSONObject {\n\tval: number\n\tvalue: string\n\tvf: string\n\ts: string\n}\n\nexport class InstrumentTimerOptions extends InstrumentBaseOptions {\n fromJSON?: InstrumentTimerGauge\n initValue?: number\n}\n\nexport class InstrumentTimerTelemetry extends InstrumentBaseTelemetry {\n val?: number\n Pause?: boolean\n Resume?: boolean\n Reset?: boolean\n}\n\nexport class InstrumentTimerGauge extends InstrumentBase\n{\n #start = 0;\n #copy = false;\n #pauseVal = 0;\n\n constructor(options: InstrumentTimerOptions = { }) {\n super(options)\n\n if (typeof options.label === 'undefined') {\n this.label = 'InstrumentTimerGauge';\n } else {\n this.label = options.label;\n }\n\n if (typeof options.fromJSON === 'undefined') {\n this.#copy = false;\n } else {\n this.#copy = true;\n }\n\n Object.defineProperty(this, GaugeTypes.GAUGE_TYPE, {\n enumerable: true,\n get: () => GaugeTypes.INSTRUMENT_TIMER\n });\n\n if (this.#copy) {\n this.DefineCopyProperties([\n 'val' \n ]);\n } else {\n Object.defineProperty(this, 'val', {\n enumerable: true,\n get: () => this.#GetVal(),\n set: (value) => { this.#SetVal(value); }\n });\n }\n\n if (typeof options.initValue !== 'undefined') {\n this.val = options.initValue;\n }\n\n // Set copy values now that we have defined our properties\n if (typeof options.fromJSON !== 'undefined') {\n const result = _cloneDeep(options.fromJSON);\n this.val = result.val;\n }\n\n this.Reset();\n }\n\n public val = 0;\n\n // Take a snap shot of the current elapsed time. The 'clock' will still keep running.\n Pause(): void {\n this.#pauseVal = this.val;\n }\n\n Resume(): void {\n this.#pauseVal = 0;\n }\n\n Reset(): void {\n this.#start = performance.now();\n }\n\n #GetVal(): number {\n if (this.#pauseVal !== 0) {\n return this.GetNumber(this.#pauseVal);\n }\n return this.GetNumber(performance.now() - this.#start);\n }\n\t\n #SetVal(updatedValue: number): void {\n // Reset the start time based on the supplied duration\n this.#start = performance.now() - updatedValue;\n }\n\n get start(): number {\n return this.#start;\n }\n\n /*\n #convertMS(ms: number): string {\n //let d, h, m, s;\n let s = Math.floor(ms / 1000);\n let m = Math.floor(s / 60);\n s = s % 60;\n let h = Math.floor(m / 60);\n m = m % 60;\n const d = Math.floor(h / 24);\n h = h % 24;\n\t\n const pad: (n: number) => string = function(n: number) { return n < 10 ? '0' + n : n.toString(); };\n\t\n return (d + '.' + pad(h) + ':' + pad(m) + ':' + pad(s)).padStart(12);\n }\n */ \n\n override ProcessTelemetry(telemetry: InstrumentTimerTelemetry): void {\n if (telemetry.val !== undefined) {\n this.val = telemetry.val;\n }\n if (telemetry.Pause !== undefined && telemetry.Pause === true) {\n this.Pause();\n }\n if (telemetry.Resume !== undefined && telemetry.Resume === true) {\n this.Resume();\n }\n if (telemetry.Reset !== undefined && telemetry.Reset === true) {\n this.Reset();\n }\n }\n}\n","/****\n * The MIT License\n *\n * Copyright (c) 2015 Marco Ziccardi\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n ****/\n(function (global, factory) {\n if (typeof define === 'function' && define.amd) {\n define('timsort', ['exports'], factory);\n } else if (typeof exports !== 'undefined') {\n factory(exports);\n } else {\n var mod = {\n exports: {}\n };\n factory(mod.exports);\n global.timsort = mod.exports;\n }\n})(this, function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n exports.sort = sort;\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError('Cannot call a class as a function');\n }\n }\n\n var DEFAULT_MIN_MERGE = 32;\n\n var DEFAULT_MIN_GALLOPING = 7;\n\n var DEFAULT_TMP_STORAGE_LENGTH = 256;\n\n var POWERS_OF_TEN = [1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9];\n\n function log10(x) {\n if (x < 1e5) {\n if (x < 1e2) {\n return x < 1e1 ? 0 : 1;\n }\n\n if (x < 1e4) {\n return x < 1e3 ? 2 : 3;\n }\n\n return 4;\n }\n\n if (x < 1e7) {\n return x < 1e6 ? 5 : 6;\n }\n\n if (x < 1e9) {\n return x < 1e8 ? 7 : 8;\n }\n\n return 9;\n }\n\n function alphabeticalCompare(a, b) {\n if (a === b) {\n return 0;\n }\n\n if (~ ~a === a && ~ ~b === b) {\n if (a === 0 || b === 0) {\n return a < b ? -1 : 1;\n }\n\n if (a < 0 || b < 0) {\n if (b >= 0) {\n return -1;\n }\n\n if (a >= 0) {\n return 1;\n }\n\n a = -a;\n b = -b;\n }\n\n var al = log10(a);\n var bl = log10(b);\n\n var t = 0;\n\n if (al < bl) {\n a *= POWERS_OF_TEN[bl - al - 1];\n b /= 10;\n t = -1;\n } else if (al > bl) {\n b *= POWERS_OF_TEN[al - bl - 1];\n a /= 10;\n t = 1;\n }\n\n if (a === b) {\n return t;\n }\n\n return a < b ? -1 : 1;\n }\n\n var aStr = String(a);\n var bStr = String(b);\n\n if (aStr === bStr) {\n return 0;\n }\n\n return aStr < bStr ? -1 : 1;\n }\n\n function minRunLength(n) {\n var r = 0;\n\n while (n >= DEFAULT_MIN_MERGE) {\n r |= n & 1;\n n >>= 1;\n }\n\n return n + r;\n }\n\n function makeAscendingRun(array, lo, hi, compare) {\n var runHi = lo + 1;\n\n if (runHi === hi) {\n return 1;\n }\n\n if (compare(array[runHi++], array[lo]) < 0) {\n while (runHi < hi && compare(array[runHi], array[runHi - 1]) < 0) {\n runHi++;\n }\n\n reverseRun(array, lo, runHi);\n } else {\n while (runHi < hi && compare(array[runHi], array[runHi - 1]) >= 0) {\n runHi++;\n }\n }\n\n return runHi - lo;\n }\n\n function reverseRun(array, lo, hi) {\n hi--;\n\n while (lo < hi) {\n var t = array[lo];\n array[lo++] = array[hi];\n array[hi--] = t;\n }\n }\n\n function binaryInsertionSort(array, lo, hi, start, compare) {\n if (start === lo) {\n start++;\n }\n\n for (; start < hi; start++) {\n var pivot = array[start];\n\n var left = lo;\n var right = start;\n\n while (left < right) {\n var mid = left + right >>> 1;\n\n if (compare(pivot, array[mid]) < 0) {\n right = mid;\n } else {\n left = mid + 1;\n }\n }\n\n var n = start - left;\n\n switch (n) {\n case 3:\n array[left + 3] = array[left + 2];\n\n case 2:\n array[left + 2] = array[left + 1];\n\n case 1:\n array[left + 1] = array[left];\n break;\n default:\n while (n > 0) {\n array[left + n] = array[left + n - 1];\n n--;\n }\n }\n\n array[left] = pivot;\n }\n }\n\n function gallopLeft(value, array, start, length, hint, compare) {\n var lastOffset = 0;\n var maxOffset = 0;\n var offset = 1;\n\n if (compare(value, array[start + hint]) > 0) {\n maxOffset = length - hint;\n\n while (offset < maxOffset && compare(value, array[start + hint + offset]) > 0) {\n lastOffset = offset;\n offset = (offset << 1) + 1;\n\n if (offset <= 0) {\n offset = maxOffset;\n }\n }\n\n if (offset > maxOffset) {\n offset = maxOffset;\n }\n\n lastOffset += hint;\n offset += hint;\n } else {\n maxOffset = hint + 1;\n while (offset < maxOffset && compare(value, array[start + hint - offset]) <= 0) {\n lastOffset = offset;\n offset = (offset << 1) + 1;\n\n if (offset <= 0) {\n offset = maxOffset;\n }\n }\n if (offset > maxOffset) {\n offset = maxOffset;\n }\n\n var tmp = lastOffset;\n lastOffset = hint - offset;\n offset = hint - tmp;\n }\n\n lastOffset++;\n while (lastOffset < offset) {\n var m = lastOffset + (offset - lastOffset >>> 1);\n\n if (compare(value, array[start + m]) > 0) {\n lastOffset = m + 1;\n } else {\n offset = m;\n }\n }\n return offset;\n }\n\n function gallopRight(value, array, start, length, hint, compare) {\n var lastOffset = 0;\n var maxOffset = 0;\n var offset = 1;\n\n if (compare(value, array[start + hint]) < 0) {\n maxOffset = hint + 1;\n\n while (offset < maxOffset && compare(value, array[start + hint - offset]) < 0) {\n lastOffset = offset;\n offset = (offset << 1) + 1;\n\n if (offset <= 0) {\n offset = maxOffset;\n }\n }\n\n if (offset > maxOffset) {\n offset = maxOffset;\n }\n\n var tmp = lastOffset;\n lastOffset = hint - offset;\n offset = hint - tmp;\n } else {\n maxOffset = length - hint;\n\n while (offset < maxOffset && compare(value, array[start + hint + offset]) >= 0) {\n lastOffset = offset;\n offset = (offset << 1) + 1;\n\n if (offset <= 0) {\n offset = maxOffset;\n }\n }\n\n if (offset > maxOffset) {\n offset = maxOffset;\n }\n\n lastOffset += hint;\n offset += hint;\n }\n\n lastOffset++;\n\n while (lastOffset < offset) {\n var m = lastOffset + (offset - lastOffset >>> 1);\n\n if (compare(value, array[start + m]) < 0) {\n offset = m;\n } else {\n lastOffset = m + 1;\n }\n }\n\n return offset;\n }\n\n var TimSort = (function () {\n function TimSort(array, compare) {\n _classCallCheck(this, TimSort);\n\n this.array = null;\n this.compare = null;\n this.minGallop = DEFAULT_MIN_GALLOPING;\n this.length = 0;\n this.tmpStorageLength = DEFAULT_TMP_STORAGE_LENGTH;\n this.stackLength = 0;\n this.runStart = null;\n this.runLength = null;\n this.stackSize = 0;\n\n this.array = array;\n this.compare = compare;\n\n this.length = array.length;\n\n if (this.length < 2 * DEFAULT_TMP_STORAGE_LENGTH) {\n this.tmpStorageLength = this.length >>> 1;\n }\n\n this.tmp = new Array(this.tmpStorageLength);\n\n this.stackLength = this.length < 120 ? 5 : this.length < 1542 ? 10 : this.length < 119151 ? 19 : 40;\n\n this.runStart = new Array(this.stackLength);\n this.runLength = new Array(this.stackLength);\n }\n\n TimSort.prototype.pushRun = function pushRun(runStart, runLength) {\n this.runStart[this.stackSize] = runStart;\n this.runLength[this.stackSize] = runLength;\n this.stackSize += 1;\n };\n\n TimSort.prototype.mergeRuns = function mergeRuns() {\n while (this.stackSize > 1) {\n var n = this.stackSize - 2;\n\n if (n >= 1 && this.runLength[n - 1] <= this.runLength[n] + this.runLength[n + 1] || n >= 2 && this.runLength[n - 2] <= this.runLength[n] + this.runLength[n - 1]) {\n\n if (this.runLength[n - 1] < this.runLength[n + 1]) {\n n--;\n }\n } else if (this.runLength[n] > this.runLength[n + 1]) {\n break;\n }\n this.mergeAt(n);\n }\n };\n\n TimSort.prototype.forceMergeRuns = function forceMergeRuns() {\n while (this.stackSize > 1) {\n var n = this.stackSize - 2;\n\n if (n > 0 && this.runLength[n - 1] < this.runLength[n + 1]) {\n n--;\n }\n\n this.mergeAt(n);\n }\n };\n\n TimSort.prototype.mergeAt = function mergeAt(i) {\n var compare = this.compare;\n var array = this.array;\n\n var start1 = this.runStart[i];\n var length1 = this.runLength[i];\n var start2 = this.runStart[i + 1];\n var length2 = this.runLength[i + 1];\n\n this.runLength[i] = length1 + length2;\n\n if (i === this.stackSize - 3) {\n this.runStart[i + 1] = this.runStart[i + 2];\n this.runLength[i + 1] = this.runLength[i + 2];\n }\n\n this.stackSize--;\n\n var k = gallopRight(array[start2], array, start1, length1, 0, compare);\n start1 += k;\n length1 -= k;\n\n if (length1 === 0) {\n return;\n }\n\n length2 = gallopLeft(array[start1 + length1 - 1], array, start2, length2, length2 - 1, compare);\n\n if (length2 === 0) {\n return;\n }\n\n if (length1 <= length2) {\n this.mergeLow(start1, length1, start2, length2);\n } else {\n this.mergeHigh(start1, length1, start2, length2);\n }\n };\n\n TimSort.prototype.mergeLow = function mergeLow(start1, length1, start2, length2) {\n\n var compare = this.compare;\n var array = this.array;\n var tmp = this.tmp;\n var i = 0;\n\n for (i = 0; i < length1; i++) {\n tmp[i] = array[start1 + i];\n }\n\n var cursor1 = 0;\n var cursor2 = start2;\n var dest = start1;\n\n array[dest++] = array[cursor2++];\n\n if (--length2 === 0) {\n for (i = 0; i < length1; i++) {\n array[dest + i] = tmp[cursor1 + i];\n }\n return;\n }\n\n if (length1 === 1) {\n for (i = 0; i < length2; i++) {\n array[dest + i] = array[cursor2 + i];\n }\n array[dest + length2] = tmp[cursor1];\n return;\n }\n\n var minGallop = this.minGallop;\n\n while (true) {\n var count1 = 0;\n var count2 = 0;\n var exit = false;\n\n do {\n if (compare(array[cursor2], tmp[cursor1]) < 0) {\n array[dest++] = array[cursor2++];\n count2++;\n count1 = 0;\n\n if (--length2 === 0) {\n exit = true;\n break;\n }\n } else {\n array[dest++] = tmp[cursor1++];\n count1++;\n count2 = 0;\n if (--length1 === 1) {\n exit = true;\n break;\n }\n }\n } while ((count1 | count2) < minGallop);\n\n if (exit) {\n break;\n }\n\n do {\n count1 = gallopRight(array[cursor2], tmp, cursor1, length1, 0, compare);\n\n if (count1 !== 0) {\n for (i = 0; i < count1; i++) {\n array[dest + i] = tmp[cursor1 + i];\n }\n\n dest += count1;\n cursor1 += count1;\n length1 -= count1;\n if (length1 <= 1) {\n exit = true;\n break;\n }\n }\n\n array[dest++] = array[cursor2++];\n\n if (--length2 === 0) {\n exit = true;\n break;\n }\n\n count2 = gallopLeft(tmp[cursor1], array, cursor2, length2, 0, compare);\n\n if (count2 !== 0) {\n for (i = 0; i < count2; i++) {\n array[dest + i] = array[cursor2 + i];\n }\n\n dest += count2;\n cursor2 += count2;\n length2 -= count2;\n\n if (length2 === 0) {\n exit = true;\n break;\n }\n }\n array[dest++] = tmp[cursor1++];\n\n if (--length1 === 1) {\n exit = true;\n break;\n }\n\n minGallop--;\n } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING);\n\n if (exit) {\n break;\n }\n\n if (minGallop < 0) {\n minGallop = 0;\n }\n\n minGallop += 2;\n }\n\n this.minGallop = minGallop;\n\n if (minGallop < 1) {\n this.minGallop = 1;\n }\n\n if (length1 === 1) {\n for (i = 0; i < length2; i++) {\n array[dest + i] = array[cursor2 + i];\n }\n array[dest + length2] = tmp[cursor1];\n } else if (length1 === 0) {\n throw new Error('mergeLow preconditions were not respected');\n } else {\n for (i = 0; i < length1; i++) {\n array[dest + i] = tmp[cursor1 + i];\n }\n }\n };\n\n TimSort.prototype.mergeHigh = function mergeHigh(start1, length1, start2, length2) {\n var compare = this.compare;\n var array = this.array;\n var tmp = this.tmp;\n var i = 0;\n\n for (i = 0; i < length2; i++) {\n tmp[i] = array[start2 + i];\n }\n\n var cursor1 = start1 + length1 - 1;\n var cursor2 = length2 - 1;\n var dest = start2 + length2 - 1;\n var customCursor = 0;\n var customDest = 0;\n\n array[dest--] = array[cursor1--];\n\n if (--length1 === 0) {\n customCursor = dest - (length2 - 1);\n\n for (i = 0; i < length2; i++) {\n array[customCursor + i] = tmp[i];\n }\n\n return;\n }\n\n if (length2 === 1) {\n dest -= length1;\n cursor1 -= length1;\n customDest = dest + 1;\n customCursor = cursor1 + 1;\n\n for (i = length1 - 1; i >= 0; i--) {\n array[customDest + i] = array[customCursor + i];\n }\n\n array[dest] = tmp[cursor2];\n return;\n }\n\n var minGallop = this.minGallop;\n\n while (true) {\n var count1 = 0;\n var count2 = 0;\n var exit = false;\n\n do {\n if (compare(tmp[cursor2], array[cursor1]) < 0) {\n array[dest--] = array[cursor1--];\n count1++;\n count2 = 0;\n if (--length1 === 0) {\n exit = true;\n break;\n }\n } else {\n array[dest--] = tmp[cursor2--];\n count2++;\n count1 = 0;\n if (--length2 === 1) {\n exit = true;\n break;\n }\n }\n } while ((count1 | count2) < minGallop);\n\n if (exit) {\n break;\n }\n\n do {\n count1 = length1 - gallopRight(tmp[cursor2], array, start1, length1, length1 - 1, compare);\n\n if (count1 !== 0) {\n dest -= count1;\n cursor1 -= count1;\n length1 -= count1;\n customDest = dest + 1;\n customCursor = cursor1 + 1;\n\n for (i = count1 - 1; i >= 0; i--) {\n array[customDest + i] = array[customCursor + i];\n }\n\n if (length1 === 0) {\n exit = true;\n break;\n }\n }\n\n array[dest--] = tmp[cursor2--];\n\n if (--length2 === 1) {\n exit = true;\n break;\n }\n\n count2 = length2 - gallopLeft(array[cursor1], tmp, 0, length2, length2 - 1, compare);\n\n if (count2 !== 0) {\n dest -= count2;\n cursor2 -= count2;\n length2 -= count2;\n customDest = dest + 1;\n customCursor = cursor2 + 1;\n\n for (i = 0; i < count2; i++) {\n array[customDest + i] = tmp[customCursor + i];\n }\n\n if (length2 <= 1) {\n exit = true;\n break;\n }\n }\n\n array[dest--] = array[cursor1--];\n\n if (--length1 === 0) {\n exit = true;\n break;\n }\n\n minGallop--;\n } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING);\n\n if (exit) {\n break;\n }\n\n if (minGallop < 0) {\n minGallop = 0;\n }\n\n minGallop += 2;\n }\n\n this.minGallop = minGallop;\n\n if (minGallop < 1) {\n this.minGallop = 1;\n }\n\n if (length2 === 1) {\n dest -= length1;\n cursor1 -= length1;\n customDest = dest + 1;\n customCursor = cursor1 + 1;\n\n for (i = length1 - 1; i >= 0; i--) {\n array[customDest + i] = array[customCursor + i];\n }\n\n array[dest] = tmp[cursor2];\n } else if (length2 === 0) {\n throw new Error('mergeHigh preconditions were not respected');\n } else {\n customCursor = dest - (length2 - 1);\n for (i = 0; i < length2; i++) {\n array[customCursor + i] = tmp[i];\n }\n }\n };\n\n return TimSort;\n })();\n\n function sort(array, compare, lo, hi) {\n if (!Array.isArray(array)) {\n throw new TypeError('Can only sort arrays');\n }\n\n if (!compare) {\n compare = alphabeticalCompare;\n } else if (typeof compare !== 'function') {\n hi = lo;\n lo = compare;\n compare = alphabeticalCompare;\n }\n\n if (!lo) {\n lo = 0;\n }\n if (!hi) {\n hi = array.length;\n }\n\n var remaining = hi - lo;\n\n if (remaining < 2) {\n return;\n }\n\n var runLength = 0;\n\n if (remaining < DEFAULT_MIN_MERGE) {\n runLength = makeAscendingRun(array, lo, hi, compare);\n binaryInsertionSort(array, lo, hi, lo + runLength, compare);\n return;\n }\n\n var ts = new TimSort(array, compare);\n\n var minRun = minRunLength(remaining);\n\n do {\n runLength = makeAscendingRun(array, lo, hi, compare);\n if (runLength < minRun) {\n var force = remaining;\n if (force > minRun) {\n force = minRun;\n }\n\n binaryInsertionSort(array, lo, lo + force, lo + runLength, compare);\n runLength = force;\n }\n\n ts.pushRun(lo, runLength);\n ts.mergeRuns();\n\n remaining -= runLength;\n lo += runLength;\n } while (remaining !== 0);\n\n ts.forceMergeRuns();\n }\n});\n","module.exports = require('./build/timsort.js');","/**\n @typedef {(Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array | Uint8ClampedArray | Float32Array | Float64Array)} TypedArray\n */\n\n/**\n * Error message for a case when percentile is less than 0.\n *\n * @param {Number} p\n *\n * @return {String}\n */\nfunction lessThanZeroError(p) {\n return 'Expect percentile to be >= 0 but given \"' + p + '\" and its type is \"' + (typeof p) + '\".';\n}\n\n/**\n * Error message for a case when percentile is greater than 100.\n *\n * @param {Number} p\n *\n * @return {String}\n */\nfunction greaterThanHundredError(p) {\n return 'Expect percentile to be <= 100 but given \"' + p + '\" and its type is \"' + (typeof p) + '\".';\n}\n\n/**\n * Error message for a case when percentile is not a number (NaN).\n *\n * @param {Number} p\n *\n * @return {String}\n */\nfunction nanError(p) {\n return 'Expect percentile to be a number but given \"' + p + '\" and its type is \"' + (typeof p) + '\".';\n}\n\n/**\n * Checks that a list of percentiles are all numbers and they lie in range 0..100.\n *\n * @param {Array<Number>} ps - percentiles to calculate\n *\n * @return {Array} List of errors\n */\nfunction validateInput(ps) {\n return ps.reduce(function (errors, p) {\n if (isNaN(Number(p))) {\n errors.push(nanError(p));\n } else if (p < 0) {\n errors.push(lessThanZeroError(p));\n } else if (p > 100) {\n errors.push(greaterThanHundredError(p));\n }\n return errors;\n }, []);\n}\n\n/**\n * Get percentile value from an array.\n *\n * @param {Number} p - percentile\n * @param {Array|TypedArray} list - list of values\n *\n * @return {*}\n */\nfunction getPsValue(p, list) {\n if (p === 0) return list[0];\n var kIndex = Math.ceil(list.length * (p / 100)) - 1;\n return list[kIndex];\n}\n\n/**\n * Calculate percentile for given array of values.\n *\n * @template T\n * @param {Number|Array<Number>} pOrPs - percentile or a list of percentiles\n * @param {Array<T>|Array<Number>|TypedArray} list - array of values\n * @param {function(T): Number} [fn] - optional function to extract a value from an array item\n *\n * @return {Number|T|Array<Number>|Array<T>}\n */\nfunction percentile(pOrPs, list, fn) {\n var ps = Array.isArray(pOrPs) ? pOrPs : [pOrPs];\n var validationErrors = validateInput(ps);\n\n if (validationErrors.length) {\n throw new Error(validationErrors.join(' '));\n }\n\n list = list.slice().sort(function (a, b) {\n if (fn) {\n a = fn(a);\n b = fn(b);\n }\n\n a = Number.isNaN(a) ? Number.NEGATIVE_INFINITY : a;\n b = Number.isNaN(b) ? Number.NEGATIVE_INFINITY : b;\n\n if (a > b) return 1;\n if (a < b) return -1;\n\n return 0;\n });\n\n if (ps.length === 1) {\n return getPsValue(ps[0], list);\n }\n\n return ps.map(function (p) {\n return getPsValue(p, list);\n });\n}\n\nmodule.exports = percentile;\n","import * as timSort from 'timsort' // Required as this is a UMD library\n// https://www.typescriptlang.org/docs/handbook/declaration-files/library-structures.html\nimport percentile from 'percentile'\nimport _cloneDeep from 'lodash.clonedeep'\n\nimport { InstrumentBase, InstrumentBaseOptions, InstrumentBaseTelemetry } from './instrumentBase.js'\nimport { GaugeTypes } from '../instrumentDefs.js'\nimport { JSONObject, isNode } from '@nsshunt/stsutils'\n\nexport type QuantileDataElement = [\n label: string,\n val: number,\n];\n\nexport interface gaugeReportValue extends JSONObject {\n\tval: number\n\tvalue: string\n\tvf: string\n\tmin?: string\n\tmax?: string\n\tavg?: string\n\tpercentile?: number[]\n\tpercentileFormatted?: string\n}\n\nexport class InstrumentGaugeOptions extends InstrumentBaseOptions {\n interval?: number\n sampleSize?: number\n fromJSON?: InstrumentGauge\n initValue?: number\n}\n\nexport class InstrumentGaugeTelemetry extends InstrumentBaseTelemetry {\n val?: number\n Inc?: number\n Dec?: number\n}\n\n//@@ Create a GaugeEx that also includes min, max, average\nexport class InstrumentGauge extends InstrumentBase\n{\n #val = 0;\n #maxval: number | null = null;\n #lastObservedValue = 0;\n #timeSeriesList: number[] = [ ];\n #maxSampleSize = 0;\n #timerInterval = 0;\n #observer: NodeJS.Timeout | null = null;\n\n //@@ extras\n #min: number | null = null;\n #max = 0; \n #observations = 0;\n #total = 0;\n #copy = false;\n\n constructor(options: InstrumentGaugeOptions = { }) {\n super(options);\n\n if (!options.label) {\n this.label = 'InstrumentGauge';\n } else {\n this.label = options.label;\n }\n\n if (typeof options.interval === 'undefined') {\n this.#timerInterval = 0;\n } else {\n this.#timerInterval = options.interval;\n }\n\n if (typeof options.sampleSize === 'undefined') {\n this.#maxSampleSize = 600;\n } else {\n this.#maxSampleSize = options.sampleSize;\n }\n\n if (typeof options.fromJSON === 'undefined') {\n this.#copy = false;\n } else {\n this.#copy = true;\n }\n\n Object.defineProperty(this, GaugeTypes.GAUGE_TYPE, {\n enumerable: true,\n get: () => GaugeTypes.INSTRUMENT_GAUGE\n });\n\n if (this.#copy) {\n this.DefineCopyProperties([\n 'val', 'min', 'max', 'avg', 'percentile'\n ]);\n } else {\n Object.defineProperty(this, 'val', {\n enumerable: true,\n get: () => this.#GetVal(),\n set: (value) => { this.#SetVal(value); }\n });\n if (this.#timerInterval > 0) {\n Object.defineProperty(this, 'percentile', {\n enumerable: true,\n get: () => this.#GetPercentileData()\n });\n\t\n this._StartTimer();\n }\n }\n\n if (typeof options.initValue !== 'undefined') {\n this.val = options.initValue;\n }\n\n // Set copy values now that we have defined our properties\n if (typeof options.fromJSON !== 'undefined') {\n const result = _cloneDeep(options.fromJSON);\n this.val = result.val;\n if (result.percentile) {\n this.percentile = result.percentile;\n }\n if (result.min) {\n this.min = result.min;\n }\n if (result.max) {\n this.max = result.max;\n }\n if (result.avg) {\n this.avg = result.avg;\n }\n }\n }\n\n public readonly percentile?: number[];\n public readonly min?: number;\n public readonly max?: number;\n public readonly avg?: number;\n public val = 0;\n\n WithInitVal(initVal: number): InstrumentGauge {\n this.val = initVal;\n return this;\n }\n\n WithMin(): InstrumentGauge {\n Object.defineProperty(this, 'min', {\n enumerable: true,\n get: () => this.#GetMin()\n });\n return this;\n }\n\n WithMax(): InstrumentGauge {\n Object.defineProperty(this, 'max', {\n enumerable: true,\n get: () => this.#GetMax()\n });\n return this;\n }\n\n WithAverage(): InstrumentGauge {\n Object.defineProperty(this, 'avg', {\n enumerable: true,\n get: () => this.#GetAverage()\n });\n return this;\n }\n\n private _StartTimer(): void {\n if (this.#timerInterval > 0) {\n this.#timeSeriesList = [ ];\n\n this.#observer = setInterval(() => {\n if (this.#timeSeriesList.length > this.#maxSampleSize) {\n this.#timeSeriesList.shift();\n }\n const maxval = this.#GetAndResetMaxVal();\n this.#timeSeriesList.push(maxval);\n }, this.#timerInterval);\n\n // If running in node ...\n if (isNode) {\n this.#observer.unref();\n }\n\n // https://httptoolkit.tech/blog/unblocking-node-with-unref/\n } else {\n throw new Error(`Unable to StartTimer for this instrument. The interval is set to <= 0.`);\n }\n }\n\n override StopTimer(): void {\n if (this.#observer) {\n clearTimeout(this.#observer);\n this.#observer = null;\n this.#timeSeriesList = [ ];\n }\n }\n\n /**\n\t * If the gauge is being monitored as part of a time series, get the most recent recorded value (max value) from within the time interval\n\t * otherwise, just return the current instant value.\n\t */\n #GetVal(): number {\n if (this.#timerInterval > 0 && this.#observer !== null) {\n if (this.#maxval === null) {\n return this.GetNumber(this.#lastObservedValue);\n } else {\n return this.GetNumber(this.#maxval);\n }\n }\n return this.GetNumber(this.#val);\n }\n\n #SetVal(updatedValue: number): void {\n this.#val = updatedValue;\n this.#observations++;\n this.#total += updatedValue;\n\n if (this.#val > this.#max) {\n this.#max = this.#val;\n }\n\n if (this.#min !== null) {\n if (this.#val < this.#min) {\n this.#min = this.#val;\n }\n } else {\n // Set the min value to the value of the first observation\n this.#min = this.#val;\n }\n\n if (this.#timerInterval > 0) {\n this.#lastObservedValue = updatedValue;\n if (this.#maxval === null) {\n this.#maxval = this.#val;\n } else if (this.#val > this.#maxval) {\n this.#maxval = this.#val;\n }\n }\n }\n\n #GetMin(): number {\n if (this.#min !== null) {\n return this.#min;\n }\n return 0;\n }\n\n #GetMax(): number {\n return this.#max;\n }\n\n #GetAverage(): number {\n if (this.#observations > 0) {\n return this.#total / this.#observations\n }\n return 0;\n }\n\n Reset(): void {\n this.StopTimer();\n\n this.#maxval = 0;\n this.#lastObservedValue = 0;\n this.#val = 0;\n\n this.#min = null;\n this.#max = 0;\n this.#observations = 0;\n this.#total = 0;\n\n if (this.#timerInterval > 0) {\n this._StartTimer();\n }\n }\n\n #GetAndResetMaxVal(): number {\n if (this.#maxval === null) {\n return this.#lastObservedValue;\n }\n const retVal = this.#maxval;\n this.#maxval = null;\n return retVal;\n }\n\n Inc(incVal = 1): void {\n this.#SetVal(this.#val + incVal);\n }\n\n Dec(decVal = 1): void {\n this.#SetVal(this.#val - decVal);\n }\n\n #NumberCompare(a: number, b: number): number {\n return a - b;\n }\n\n #GetPercentileData(): number[] {\n const sortedList = this.#timeSeriesList.slice(0);\n timSort.sort(sortedList, this.#NumberCompare);\n return percentile([50, 80, 90, 95, 99, 99.95], sortedList) as number[];\n }\n\n override ProcessTelemetry(telemetry: InstrumentGaugeTelemetry): void {\n if (telemetry.Inc !== undefined) {\n this.Inc(telemetry.Inc);\n }\n if (telemetry.Dec !== undefined) {\n this.Dec(telemetry.Dec);\n }\n if (telemetry.val !== undefined) {\n this.val = telemetry.val;\n }\n }\n}\n","import _cloneDeep from 'lodash.clonedeep'\n\nimport { InstrumentBase, InstrumentBaseOptions, InstrumentBaseTelemetry } from './instrumentBase.js'\nimport { GaugeTypes } from '../instrumentDefs.js'\n\nimport { JSONObject } from '@nsshunt/stsutils'\n\nexport interface ObjectReportValue extends JSONObject {\n\tval: JSONObject\n}\n\nexport class InstrumentObjectOptions extends InstrumentBaseOptions {\n fromJSON?: InstrumentObject\n initValue?: JSONObject\n}\n\nexport class InstrumentObjectTelemetry extends InstrumentBaseTelemetry {\n val?: JSONObject\n}\n\nexport class InstrumentObject extends InstrumentBase\n{\n #val: JSONObject = { };\n #copy = false;\n\n constructor(options: InstrumentObjectOptions = { }) {\n super(options);\n\n if (typeof options.label === 'undefined') {\n this.label = 'InstrumentObject';\n } else {\n this.label = options.label;\n }\n\n if (typeof options.fromJSON === 'undefined') {\n this.#copy = false;\n } else {\n this.#copy = true;\n }\n\n Object.defineProperty(this, GaugeTypes.GAUGE_TYPE, {\n enumerable: true,\n get: () => GaugeTypes.INSTRUMENT_OBJECT\n });\n\n if (this.#copy) {\n this.DefineCopyProperties([\n 'val'\n ]);\n } else {\n Object.defineProperty(this, 'val', {\n enumerable: true,\n get: () => this.#GetVal(),\n set: (value) => { this.#SetVal(value); }\n });\n }\n\n if (typeof options.initValue !== 'undefined') {\n this.val = options.initValue;\n } else {\n this.val = { };\n }\n\n // Set copy values now that we have defined our properties\n if (typeof options.fromJSON !== 'undefined') {\n const result = _cloneDeep(options.fromJSON);\n this.val = result.val;\n }\n }\n\t\n public val: JSONObject;\n\n WithInitVal(initVal: JSONObject) {\n this.val = initVal;\n return this;\n }\n\n #GetVal(): JSONObject {\n return this.#val;\n }\n\n #SetVal(updatedValue: JSONObject) {\n this.#val = updatedValue;\n }\n\n override ProcessTelemetry(telemetry: InstrumentObjectTelemetry): void {\n if (telemetry.val !== undefined) {\n this.val = telemetry.val;\n }\n }\n}\n","import { Gauge, GaugeTypes } from './instrumentDefs.js'\n\nimport { InstrumentBase, Instruments } from './instruments/instrumentBase.js'\nimport { InstrumentVelocity } from './instruments/instrumentVelocity.js'\nimport { InstrumentHistogram } from './instruments/instrumentHistogram.js'\nimport { InstrumentLog } from './instruments/instrumentLog.js'\nimport { InstrumentTimerGauge } from './instruments/instrumentTimerGauge.js'\nimport { InstrumentGauge } from './instruments/instrumentGauge.js'\nimport { InstrumentObject } from './instruments/instrumentObject.js'\n\nexport function CreateInstrument(sourceInstrument: InstrumentBase): InstrumentBase {\n switch (sourceInstrument[GaugeTypes.GAUGE_TYPE]) {\n case GaugeTypes.INSTRUMENT_GAUGE :\n return new InstrumentGauge({fromJSON:sourceInstrument as InstrumentGauge});\n case GaugeTypes.INSTRUMENT_VELOCITY :\n return new InstrumentVelocity({fromJSON:sourceInstrument as InstrumentVelocity});\n case GaugeTypes.INSTRUMENT_HISTOGRAM :\n return new InstrumentHistogram({fromJSON:sourceInstrument as InstrumentHistogram});\n case GaugeTypes.INSTRUMENT_LOG :\n return new InstrumentLog({fromJSON:sourceInstrument as InstrumentLog});\n case GaugeTypes.INSTRUMENT_TIMER :\n return new InstrumentTimerGauge({fromJSON:sourceInstrument as InstrumentTimerGauge});\n case GaugeTypes.INSTRUMENT_OBJECT :\n return new InstrumentObject({fromJSON:sourceInstrument as InstrumentObject});\n }\n throw new Error(`Cannot create instrument from type: [${sourceInstrument[GaugeTypes.GAUGE_TYPE]}]`)\n}\n\nexport function GetInstrumentName(gauge: Gauge): string {\n switch (gauge) {\n case Gauge.ACTIVE_REQUEST_GAUGE :\n return \"Active Requests\";\n case Gauge.AUTHENTICATION_COUNT_GAUGE :\n return \"Authentication Count\";\n case Gauge.AUTHENTICATION_ERROR_COUNT_GAUGE :\n return \"Authentication Error Count\";\n case Gauge.AUTHENTICATION_RETRY_COUNT_GAUGE :\n return \"Authentication Retry Count\";\n case Gauge.CONNECTION_POOL_IDLE_GAUGE :\n return \"Connection Pool Idle\";\n case Gauge.CONNECTION_POOL_TOTAL_GAUGE :\n return \"Connection Pool Total\";\n case Gauge.CONNECTION_POOL_WAITING_GAUGE :\n return \"Connection Pool Waiting\";\n case Gauge.CPU_LOAD_GAUGE :\n return \"CPU Load\";\n case Gauge.CPU_SYSTEM_LOAD_GAUGE :\n return \"CPU SYstem Load\";\n case Gauge.DURATION_GAUGE :\n return \"Duration\";\n case Gauge.DURATION_HISTOGRAM_GAUGE :\n return \"Diration Histogram\";\n case Gauge.ERROR_COUNT_GAUGE :\n return \"Errors\";\n case Gauge.LATENCY_GAUGE :\n return \"Latency\";\n case Gauge.LATENCY_HISTOGRAM_GAUGE :\n return \"Latency Histogram\";\n case Gauge.LOGGER :\n return \"Logger\";\n case Gauge.LOGGER_COPY :\n return \"_Logger\";\n case Gauge.NETWORK_RX_GAUGE :\n return \"Network Receive\";\n case Gauge.NETWORK_TX_GAUGE :\n return \"Network Transmit\";\n case Gauge.REQUEST_COUNT_GAUGE :\n return \"Requests\";\n case Gauge.RETRY_COUNT_GAUGE :\n return \"Retries\";\n case Gauge.TIMER_GAUGE :\n return \"Timer\";\n case Gauge.VELOCITY_GAUGE :\n return \"Velocity\";\n case Gauge.CONNECTION_COUNT_GAUGE :\n return \"TCP Connection\";\n case Gauge.OBJECT_GAUGE :\n return \"Object\";\n case Gauge.CORE_COUNT_GAUGE :\n return \"Core Count\";\n default:\n return \"Unknown\";\n }\n}\n\nexport function StopInstruments(instruments: InstrumentBase[] | Instruments): void {\n if (instruments) {\n if (Array.isArray(instruments)) {\n instruments.forEach((instrument) => {\n if (instrument.StopTimer) {\n instrument.StopTimer();\n }\n });\n } else {\n for (const [, value] of Object.entries(instruments)) {\n if (value.StopTimer) {\n value.StopTimer();\n }\n }\n }\n }\n}\n"],"x_google_ignoreList":[6,7,8],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["#options","#label","#data","#timerInterval","#valStackMaxLength","#copy","#autoComputeVelocity","#maxAverageValStack","#maxAverageIterations","#velocityTimeDiff","#vaTimeDiff","#autoComputeVelocityTimeout","#maxTimeDiff","#minTimeForReporting","#GetVal","#SetVal","#GetMaxVelocity","#GetDelta","#GetVelocity","#GetVelocityStackAverage","#GetTimeStamp","#GetCountDiff","#GetTimeDiff","#GetDeltaCountDiff","#GetDeltaTimeDif","#GetAverageVelocity","#valStack","#interval","#ComputeVelocity","#velocity","#averageValStack","#averageVelocity","#timeStamp","#velocityVal","#ComputeVelocityByTimeDiff","#valStackAverage","#delta","#countDiff","#timeDiff","#deltaCountDiff","#deltaTimeDif","#lastVelocity","#maxVelocity","#timeoutComputeVelocity","#SetupAutoComputeVelocity","#copy","#histogramData","#GetVal","#SetVal","#GetHistogramData","#SetHistogramData","#val","#maxSize","#copy","#useLatestMessages","#consoleLogging","#instrumentLogging","#winstonLogging","#GetVal","#SetVal","#DumpToConsole","#stsLogger","#messages","#readPos","#copy","#GetVal","#SetVal","#pauseVal","#start","#timerInterval","#maxSampleSize","#copy","#GetVal","#SetVal","#GetPercentileData","#GetMin","#GetMax","#GetAverage","#timeSeriesList","#observer","#GetAndResetMaxVal","#maxval","#lastObservedValue","#val","#observations","#total","#max","#min","#NumberCompare","#copy","#GetVal","#SetVal","#val"],"sources":["../src/instrumentation/instrumentDefs.ts","../src/instrumentation/instruments/instrumentBase.ts","../src/instrumentation/instruments/instrumentVelocity.ts","../src/instrumentation/instruments/instrumentHistogram.ts","../src/instrumentation/instruments/instrumentLog.ts","../src/instrumentation/instruments/instrumentTimerGauge.ts","../node_modules/timsort/build/timsort.js","../node_modules/timsort/index.js","../node_modules/percentile/lib/index.js","../src/instrumentation/instruments/instrumentGauge.ts","../src/instrumentation/instruments/instrumentObject.ts","../src/instrumentation/instrumentUtils.ts"],"sourcesContent":["export enum Gauge {\n\tACTIVE_REQUEST_GAUGE = 'a',\n\tAUTHENTICATION_COUNT_GAUGE = 'b',\n\tAUTHENTICATION_ERROR_COUNT_GAUGE = 'aa',\n\tAUTHENTICATION_RETRY_COUNT_GAUGE = 'ab',\n\tCONNECTION_POOL_IDLE_GAUGE = 'c',\n\tCONNECTION_POOL_TOTAL_GAUGE = 'd',\n\tCONNECTION_POOL_WAITING_GAUGE = 'e',\n\tCPU_LOAD_GAUGE = 'f',\n\tCPU_SYSTEM_LOAD_GAUGE = 'g',\n\tDURATION_GAUGE = 'h',\n\tDURATION_HISTOGRAM_GAUGE = 'i',\n\tERROR_COUNT_GAUGE = 'j',\n\tLATENCY_GAUGE = 'k',\n\tLATENCY_HISTOGRAM_GAUGE = 'l',\n\tLOGGER = 'm',\n\tLOGGER_COPY = 'n',\n\tNETWORK_RX_GAUGE = 'o',\n\tNETWORK_TX_GAUGE = 'p',\n\tREQUEST_COUNT_GAUGE = 'q',\n\tRETRY_COUNT_GAUGE = 'r',\n\tTIMER_GAUGE = 's',\n\tVELOCITY_GAUGE = 't',\n\tCONNECTION_COUNT_GAUGE = 'u',\n\tOBJECT_GAUGE = 'v',\n\tPAYLOAD_SIZE = 'w',\n\tCORE_COUNT_GAUGE = 'x',\n\tCHILD_COUNT = 'y',\n\tUNKNOWN = 'z'\n}\n\nexport enum GaugeTypes {\n\tGAUGE_TYPE = '_',\n\tINSTRUMENT_GAUGE = 'a',\n\tINSTRUMENT_VELOCITY = 'b',\n\tINSTRUMENT_HISTOGRAM = 'c',\n\tINSTRUMENT_LOG = 'd',\n\tINSTRUMENT_TIMER = 'e',\n\tINSTRUMENT_OBJECT = 'f'\n}\n","import { JSONObject } from '@nsshunt/stsutils'\nimport { Gauge, GaugeTypes } from '../instrumentDefs.js'\n\nexport class InstrumentBaseOptions {\n fixedSize?: number\n padLength?: number\n label?: string\n}\n\nexport class InstrumentBaseTelemetry {\n\n}\n\nexport abstract class InstrumentBase {\n #label = '';\n #options: InstrumentBaseOptions | null = null;\n #data: Record<string, unknown> = { };\n\n // Use for copy objects only.\n //protected _data: Record<string, any> = { };\n\n constructor(options: InstrumentBaseOptions = { })\n {\n if (typeof options === 'string' || options instanceof String) {\n throw new Error('Instrument parameter must be an options object.');\n }\n\n this.#options = options;\n\n if (options.label) {\n this.#label = options.label;\n } else {\n this.#label = 'InstrumentGauge';\n }\n\n // Create an object to store all props\n //Object.defineProperty(this, '_data', { value: { } });\n\n //@@ change all properties to use this pattern\n\n /*\n\t\t// https://github.com/Asymmetrik/node-fhir-server-core/blob/master/packages/node-fhir-server-core/src/server/resources/4_0_1/schemas/account.js\n\n\t\t// Create an object to store all props\n\t\tObject.defineProperty(this, '__data', { value: {} });\n\n\t\tObject.defineProperty(this, '_value', {\n\t\t\tenumerable: true,\n\t\t\tget: () => this.__data._value,\n\t\t\tset: (value) => {\n\t\t\tif (value === undefined || value === null) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.__data._value = value;\n\t\t\t}\n\t\t});\n\t\t*/\n\n // Define a default non-writable resourceType property\n /*\n\t\tObject.defineProperty(this, '_reportValue', {\n\t\t\tenumerable: true,\n\t\t\tget: () => this.GetFormatted()\n\t\t});\n\n\t\tObject.defineProperty(this, '_serialValue', {\n\t\t\tenumerable: true,\n\t\t\tget: () => this.GetSerialValue(),\n\t\t\tset: (value) => { this.SetSerialValue(value); }\n\t\t});\n\t\t*/\n }\n\n public [GaugeTypes.GAUGE_TYPE]: GaugeTypes = GaugeTypes.INSTRUMENT_OBJECT // Default Gauge type\n val?: number | string[] | JSONObject\n\n WithLabel(label: string) {\n this.label = label;\n return this;\n }\n\n DefineCopyProperties(propertyNames: string[]): void {\n propertyNames.forEach(propertyName => {\n Object.defineProperty(this, propertyName, {\n enumerable: true,\n get: () => this.#data[propertyName],\n set: (value) => {\n if (value === undefined) {\n return;\n }\n this.#data[propertyName] = value;\n }\n });\n });\n }\n\t\n GetNumber(val: number): number {\n if (Number.isInteger(val)) {\n return val;\n } else {\n return Math.round((val + Number.EPSILON) * 100) / 100;\n }\n }\n\n get options(): InstrumentBaseOptions | null {\n return this.#options;\n }\n\n set options(optionsValue: InstrumentBaseOptions | null) {\n this.#options = optionsValue;\n }\n\n get label(): string {\n return this.#label;\n }\n\n set label(labelValue: string) {\n this.#label = labelValue;\n }\n\n StopTimer(): void\n {\n //\tOverride in sub class if timers are used ...\n }\n\n ProcessTelemetry(telemetry: InstrumentBaseTelemetry): void {\n throw new Error(`Must override in extended class: [ProcessTelemetry]: [${telemetry}].`);\n }\n\n /*\n\ttoJSON()\n\t{\n\t\treturn this._serialValue;\n\t}\n\t*/\n\n /*\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols\n\t[Symbol.iterator]() {\n\t\t// Use a new index for each iterator. This makes multiple\n\t\t// iterations over the iterable safe for non-trivial cases,\n\t\t// such as use of break or nested looping over the same iterable.\n\t\tlet index = 0;\n\t\n\t\treturn {\n\t\t\tnext: () => {\n\t\t\t\tif (index < 1) {\n\t\t\t\t\treturn {value: this.GetFormatted(), done: false}\n\t\t\t\t} else {\n\t\t\t\t\treturn {done: true}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t*/\n}\n\nexport type Instruments = Partial<Record<Gauge, InstrumentBase>>\n","import _cloneDeep from 'lodash.clonedeep'\n\nimport { InstrumentBase, InstrumentBaseOptions, InstrumentBaseTelemetry } from './instrumentBase.js'\nimport { GaugeTypes } from '../instrumentDefs.js'\nimport { JSONObject } from '@nsshunt/stsutils'\nimport isNode from 'detect-node'\n\nexport interface VelocityReportValue extends JSONObject {\n\tval: number\n\tvalue: string\n\tvf: string\n\tdelta: number\n\tmaxVelocity: number\n\tvelocity: number\n\tva: number\n}\n\nexport class InstrumentVelocityOptions extends InstrumentBaseOptions {\n interval?: number\n valStackMaxLength?: number\n maxAverageValStack?: number\n maxAverageIterations?: number\n fromJSON?: InstrumentVelocity\n initValue?: number\n autoComputeVelocity?: boolean\n velocityTimeDiff?: number\n vaTimeDiff?: number\n autoComputeVelocityTimeout?: number\n}\n\nexport class InstrumentVelocityTelemetry extends InstrumentBaseTelemetry {\n val?: number\n Inc?: number\n}\n\ndeclare interface IDataPoint {\n\ttimeStamp: number\n\tcount: number\n}\n\ndeclare interface IVelocityDataPoint {\n\tval: number\n\tcountDiff: number\n\ttimeDiff: number\n\tdeltaVal: number\n\tdeltaCountDiff: number\n\tdeltaTimeDiff: number\n}\n\nexport class InstrumentVelocity extends InstrumentBase\n{\n // eslint-disable-next-line @/no-unused-private-class-members\n #val = 0;\n #interval: NodeJS.Timeout | null = null;\n #timeoutComputeVelocity: NodeJS.Timeout | null = null;\n // eslint-disable-next-line @/no-unused-private-class-members\n #lastVelocity = 0;\n #delta = 0;\n #maxVelocity = 0;\n #timerInterval = 0;\n #copy = false;\n #velocity = 0;\n #velocityVal = 0;\n #valStack: IDataPoint[] = [ ];\n #averageValStack: number[][] = [];\n #maxAverageValStack = 0;\n #maxAverageIterations = 0;\n // eslint-disable-next-line @/no-unused-private-class-members\n #valStackMaxLength = 0;\n #valStackAverage = 0.0;\n #timeStamp = 0;\n #maxTimeDiff = 0;\n #vaTimeDiff = 0;\n #velocityTimeDiff = 0;\n #autoComputeVelocity = false;\n #autoComputeVelocityTimeout = 0; // 50ms to auto computer after an update when not in auto compute mode.\n #countDiff = 0;\n #timeDiff = 0;\n #deltaCountDiff = 0;\n #deltaTimeDif = 0;\n #minTimeForReporting = 0;\n #averageVelocity: number[] = []\n\n // timeWindow = Number of intervals to use as the sliding time window same size. Uses average value within the time window. Larger window produces a smooth (more laggy) curve. Shorter time\n // window may be \"spikey\" depending on the volatility of the data being recorded.\n constructor(options: InstrumentVelocityOptions = { }) {\n super(options);\n\n if (typeof options.label === 'undefined') {\n this.label = 'InstrumentVelocity';\n } else {\n this.label = options.label;\n }\n\n if (typeof options.interval === 'undefined') {\n this.#timerInterval = 1000;\n } else {\n this.#timerInterval = options.interval;\n }\n\n if (typeof options.valStackMaxLength === 'undefined') {\n this.#valStackMaxLength = 100;\n } else {\n this.#valStackMaxLength = options.valStackMaxLength;\n }\n\n if (typeof options.fromJSON === 'undefined') {\n this.#copy = false;\n } else {\n this.#copy = true;\n }\n\n if (typeof options.autoComputeVelocity === 'undefined') {\n this.#autoComputeVelocity = false;\n } else {\n this.#autoComputeVelocity = options.autoComputeVelocity;\n }\n\n if (typeof options.maxAverageValStack === 'undefined') {\n this.#maxAverageValStack = 5;\n } else {\n this.#maxAverageValStack = options.maxAverageValStack;\n }\n\n if (typeof options.maxAverageIterations === 'undefined') {\n this.#maxAverageIterations = 3;\n } else {\n this.#maxAverageIterations = options.maxAverageIterations;\n }\n\n if (typeof options.velocityTimeDiff === 'undefined') {\n this.#velocityTimeDiff = 5000;\n } else {\n this.#velocityTimeDiff = options.velocityTimeDiff;\n }\n\n if (typeof options.vaTimeDiff === 'undefined') {\n this.#vaTimeDiff = 10000;\n } else {\n this.#vaTimeDiff = options.vaTimeDiff;\n }\n\n if (typeof options.autoComputeVelocityTimeout === 'undefined') {\n this.#autoComputeVelocityTimeout = 50;\n } else {\n this.#autoComputeVelocityTimeout = options.autoComputeVelocityTimeout;\n }\n\n this.#maxTimeDiff = this.#vaTimeDiff * 2;\n this.#minTimeForReporting = this.#vaTimeDiff + 2000;\n\n\n Object.defineProperty(this, GaugeTypes.GAUGE_TYPE, {\n enumerable: true,\n get: () => GaugeTypes.INSTRUMENT_VELOCITY\n });\n\n if (this.#copy) {\n this.DefineCopyProperties([\n 'val', 'maxVelocity', 'delta', 'velocity', 'va', 'timeStamp',\n 'deltaTimeDif', 'deltaCountDiff', 'timeDiff', 'countDiff', 'averageVelocity'\n ]);\n } else {\n Object.defineProperty(this, 'val', {\n enumerable: true,\n get: () => this.#GetVal(),\n set: (value) => { this.#SetVal(value); }\n });\n\n Object.defineProperty(this, 'maxVelocity', {\n enumerable: true,\n get: () => this.#GetMaxVelocity()\n });\n\n Object.defineProperty(this, 'delta', {\n enumerable: true,\n get: () => this.#GetDelta()\n });\n\n Object.defineProperty(this, 'velocity', {\n enumerable: true,\n get: () => this.#GetVelocity()\n });\n\n Object.defineProperty(this, 'va', {\n enumerable: true,\n get: () => this.#GetVelocityStackAverage()\n });\n\n Object.defineProperty(this, 'timeStamp', {\n enumerable: true,\n get: () => this.#GetTimeStamp()\n });\n\n Object.defineProperty(this, 'countDiff', {\n enumerable: true,\n get: () => this.#GetCountDiff()\n });\n\n Object.defineProperty(this, 'timeDiff', {\n enumerable: true,\n get: () => this.#GetTimeDiff()\n });\n\n Object.defineProperty(this, 'deltaCountDiff', {\n enumerable: true,\n get: () => this.#GetDeltaCountDiff()\n });\n\n Object.defineProperty(this, 'deltaTimeDif', {\n enumerable: true,\n get: () => this.#GetDeltaTimeDif()\n });\n\n Object.defineProperty(this, 'averageVelocity', {\n enumerable: true,\n get: () => this.#GetAverageVelocity()\n });\n\n if (this.#timerInterval > 0 && this.#autoComputeVelocity === false) {\n this._StartTimer();\n }\n }\n\n if (typeof options.initValue !== 'undefined') {\n this.val = options.initValue;\n }\n\n // Set copy values now that we have defined our properties\n if (typeof options.fromJSON !== 'undefined') {\n const result = _cloneDeep(options.fromJSON);\n this.val = result.val;\n this.velocity = result.velocity;\n this.maxVelocity = result.maxVelocity;\n this.delta = result.delta;\n this.va = result.va;\n this.timeStamp = result.timeStamp;\n this.countDiff = result.countDiff;\n this.timeDiff = result.timeDiff;\n this.deltaCountDiff = result.deltaCountDiff;\n this.deltaTimeDif = result.deltaTimeDif;\n this.averageVelocity = _cloneDeep(result.averageVelocity);\n }\n }\n\n public readonly maxVelocity: number = 0;\n public readonly delta: number = 0;\n public readonly velocity: number = 0;\n public readonly va: number = 0;\n public readonly timeStamp: number = 0;\n public readonly countDiff: number = 0;\n public readonly timeDiff: number = 0;\n public readonly deltaCountDiff: number = 0;\n public readonly deltaTimeDif: number = 0;\n public readonly averageVelocity: number[] = [];\n public val = 0;\n\n WithValStackMaxLength(valStackMaxLength: number): InstrumentVelocity {\n this.#valStackMaxLength = valStackMaxLength;\n this.#valStack = [ ];\n return this;\n }\n\n private _StartTimer(): void\n {\n this.#interval = setInterval(() => {\n this.#ComputeVelocity();\n\n let pushVal = this.#velocity;\n for (let i=0; i < this.#maxAverageIterations; i++) {\n if (!this.#averageValStack[i]) {\n this.#averageValStack[i] = [ ];\n }\n this.#averageValStack[i].push(pushVal);\n if (this.#averageValStack[i].length > this.#maxAverageValStack) {\n this.#averageValStack[i].shift();\n }\n pushVal = this.#averageValStack[i].reduce((prev, current) => prev + current) / this.#averageValStack[i].length;\n this.#averageVelocity[i] = pushVal;\n }\n }, this.#timerInterval);\n\n // If running in node ...\n if (isNode) {\n this.#interval.unref();\n }\n // https://httptoolkit.tech/blog/unblocking-node-with-unref/\n }\n\n #ComputeVelocityByTimeDiff(checkTimeDiff: number, checkDeltaTimeDiff: number): IVelocityDataPoint {\n // As long as we have at least two data points ...\n let val = 0.0;\n let deltaVal = 0.0;\n let countDiff = 0;\n let timeDiff = 0;\n let deltaCountDiff = 0;\n let deltaTimeDiff = 0;\n\n if (this.#valStack.length > 1 && (this.#valStack[this.#valStack.length-1].timeStamp - this.#valStack[0].timeStamp) > this.#minTimeForReporting) {\n // Get the current data point\n const dp: IDataPoint = this.#valStack[this.#valStack.length-1];\n // Compute the stack position for the first entry where the diff is >= timeDiff\n let timeDiffPos = -1;\n let deltaDiffPos = -1;\n for (let i = this.#valStack.length-2; i > -1; i--) {\n if (timeDiffPos === -1 && (this.#timeStamp - this.#valStack[i].timeStamp) >= checkTimeDiff) {\n timeDiffPos = i;\n if (checkDeltaTimeDiff === 0) {\n break;\n }\n }\n if (deltaDiffPos === -1 && (this.#timeStamp - this.#valStack[i].timeStamp) >= checkDeltaTimeDiff) {\n deltaDiffPos = i;\n }\n if (timeDiffPos !== -1 && deltaDiffPos !== -1) {\n break;\n }\n }\n if (timeDiffPos > -1) {\n countDiff = dp.count - this.#valStack[timeDiffPos].count;\n if (countDiff > 0) {\n timeDiff = dp.timeStamp - this.#valStack[timeDiffPos].timeStamp;\n if (timeDiff > 0.0) {\n // Get velocity per second\n val = (1000.0 / timeDiff) * countDiff;\n } else {\n val = 0;\n }\n } else {\n val = 0; // We have the same count for the desired timeDiff time span.\n }\n } else {\n val = 0; // We don't yet have a value for the desired timeDiff time span.\n }\n\n if (deltaDiffPos > -1) {\n deltaCountDiff = this.#valStack[timeDiffPos].count - this.#valStack[deltaDiffPos].count;\n if (deltaCountDiff > 0) {\n deltaTimeDiff = this.#valStack[timeDiffPos].timeStamp - this.#valStack[deltaDiffPos].timeStamp\n if (deltaTimeDiff > 0.0) {\n // Get velocity per second\n deltaVal = (1000.0 / deltaTimeDiff) * deltaTimeDiff;\n } else {\n deltaVal = 0;\n }\n } else {\n deltaVal = 0; // We have the same count for the desired deltaTimeDiff time span.\n }\n } else {\n deltaVal = 0; // We don't yet have a value for the desired deltaTimeDiff time span.\n }\n }\n return {\n val,\n countDiff,\n timeDiff,\n deltaVal,\n deltaCountDiff,\n deltaTimeDiff\n }\n }\n\n #ComputeVelocity(): void {\n const dp: IDataPoint = {\n timeStamp: performance.now(),\n count: this.#velocityVal\n }\n this.#valStack.push(dp);\n\n this.#timeStamp = dp.timeStamp;\n\n while (this.#valStack.length > 0 && ((this.#timeStamp - this.#valStack[0].timeStamp) > this.#maxTimeDiff)) {\n this.#valStack.shift();\n }\n\n const valStackAverageDataPoint = this.#ComputeVelocityByTimeDiff(this.#vaTimeDiff, 0);\n this.#valStackAverage = valStackAverageDataPoint.val;\n\n const velocityDataPoint = this.#ComputeVelocityByTimeDiff(this.#velocityTimeDiff, this.#velocityTimeDiff * 2);\n this.#velocity = velocityDataPoint.val;\n this.#delta = velocityDataPoint.val - velocityDataPoint.deltaVal;\n\n this.#countDiff = velocityDataPoint.countDiff\n this.#timeDiff = velocityDataPoint.timeDiff\n this.#deltaCountDiff = velocityDataPoint.deltaCountDiff\n this.#deltaTimeDif = velocityDataPoint.deltaTimeDiff\n\n this.#lastVelocity = this.#velocity;\n if (this.#velocity > this.#maxVelocity) {\n this.#maxVelocity = this.#velocity;\n }\n }\n\n #SetupAutoComputeVelocity(): void {\n if (this.#timeoutComputeVelocity) {\n clearTimeout(this.#timeoutComputeVelocity);\n }\n this.#timeoutComputeVelocity = setTimeout(() => {\n this.#ComputeVelocity();\n }, this.#autoComputeVelocityTimeout);\n\n // Note: We do not check if running in node for an unref() because unref() is expensive and this is being\n // called for each change in val. The value of autoComputeVelocityTimeout (around 50ms) is very small and should not prevent application\n // termination issues.\n }\n\n #GetVelocityStackAverage(): number {\n return this.GetNumber(this.#valStackAverage);\n }\n\n Inc(incVal = 1): void {\n this.#velocityVal += incVal;\n if (this.#autoComputeVelocity) {\n this.#ComputeVelocity();\n } else {\n this.#SetupAutoComputeVelocity();\n }\n }\n\n #GetVal(): number {\n return this.GetNumber(this.#velocityVal);\n }\n\n #SetVal(updatedValue: number): void {\n this.#velocityVal = updatedValue;\n if (this.#autoComputeVelocity) {\n this.#ComputeVelocity();\n } else {\n this.#SetupAutoComputeVelocity();\n }\n }\n\n #GetVelocity(): number {\n return this.GetNumber(this.#velocity);\n }\n\n #GetMaxVelocity(): number {\n return this.GetNumber(this.#maxVelocity);\n }\n\n #GetDelta(): number {\n return this.GetNumber(this.#delta);\n }\n\n #GetTimeStamp(): number {\n return this.GetNumber(this.#timeStamp);\n }\n\n #GetCountDiff(): number {\n return this.GetNumber(this.#countDiff);\n }\n\n #GetTimeDiff(): number {\n return this.GetNumber(this.#timeDiff);\n }\n\n #GetDeltaCountDiff(): number {\n return this.GetNumber(this.#deltaCountDiff);\n }\n\n #GetDeltaTimeDif(): number {\n return this.GetNumber(this.#deltaTimeDif);\n }\n\n #GetAverageVelocity(): number[] {\n return this.#averageVelocity;\n }\n\n override StopTimer(): void {\n if (this.#interval !== null) {\n clearTimeout(this.#interval);\n this.#interval = null;\n }\n }\n\n override ProcessTelemetry(telemetry: InstrumentVelocityTelemetry): void {\n if (telemetry.Inc !== undefined) {\n this.Inc(telemetry.Inc);\n }\n if (telemetry.val !== undefined) {\n this.val = telemetry.val;\n }\n }\n}\n","import _cloneDeep from 'lodash.clonedeep'\n\nimport { InstrumentBase, InstrumentBaseOptions, InstrumentBaseTelemetry } from './instrumentBase.js'\nimport { GaugeTypes } from '../instrumentDefs.js'\n\nimport { JSONObject } from '@nsshunt/stsutils'\n\nexport interface HistogramReportValue extends JSONObject {\n\tval: number\n\thist: HistogramDataElement[]\n\tvf: string\n}\n\nexport enum HistogramDataElementPos {\n\tval = 0,\n\tlabel = 1,\n\tbreakPoint = 2\n}\n\nexport type HistogramDataElement = [\n\tval: number,\n\tlabel: string,\n\tbreakPoint: number\n]\n\nexport class InstrumentHistogramOptions extends InstrumentBaseOptions {\n histogramData?: number[]\n initValue?: number\n fromJSON?: InstrumentHistogram\n}\n\nexport class InstrumentHistogramTelemetry extends InstrumentBaseTelemetry {\n val?: number\n}\n\nexport class InstrumentHistogram extends InstrumentBase\n{\n #histogramData: HistogramDataElement[] = [ ];\n #val = 0;\n #copy = false;\n\t\n constructor(options: InstrumentHistogramOptions = { }) {\n super(options);\n\n if (typeof options.label === 'undefined') {\n this.label = 'InstrumentHistogram';\n } else {\n this.label = options.label;\n }\n\n let histogramData: number[] | null = null;\n if (typeof options.histogramData === 'undefined') {\n histogramData = null;\n } else {\n histogramData = options.histogramData;\n }\n\n if (typeof options.fromJSON === 'undefined') {\n this.#copy = false;\n } else {\n this.#copy = true;\n }\n\n if (histogramData === null) {\n this.#histogramData = [\n [ 0, \"10\", 10 ],\n [ 0, \"20\", 20 ],\n [ 0, \"50\", 50 ],\n [ 0, \"100\", 100 ],\n [ 0, \"1000\", 1000 ],\n [ 0, \"5000\", 5000 ],\n [ 0, \"EE\", 0 ]\n ]\n } else if (Array.isArray(histogramData)) {\n this.#histogramData = [ ];\n for (let i=0; i < histogramData.length; i++) {\n this.#histogramData.push([0, '' + histogramData[i], parseFloat(histogramData[i].toString())]);\n }\n this.#histogramData.push([ 0, \"EE\", 0 ]);\n } else {\n throw new Error(`Passed [${histogramData}] must be an array.`);\n }\n\n Object.defineProperty(this, GaugeTypes.GAUGE_TYPE, {\n enumerable: true,\n get: () => GaugeTypes.INSTRUMENT_HISTOGRAM\n });\n\n if (this.#copy) {\n this.DefineCopyProperties([\n 'val', 'hist' \n ]);\n } else {\n Object.defineProperty(this, 'val', {\n enumerable: true,\n get: () => this.#GetVal(),\n set: (value) => { this.#SetVal(value); }\n });\n Object.defineProperty(this, 'hist', {\n enumerable: true,\n get: () => this.#GetHistogramData(),\n set: (value) => { this.#SetHistogramData(value); }\n });\n }\n\n if (typeof options.initValue !== 'undefined') {\n this.#val = options.initValue;\n }\n\n // Set copy values now that we have defined our properties\n if (typeof options.fromJSON !== 'undefined') {\n const result = _cloneDeep(options.fromJSON);\n this.#val = result.val as number;\n this.hist = result.hist;\n }\n }\n\n public hist: HistogramDataElement[] = [ ];\n public val = 0;\n\n WithInitVal(initVal: number): InstrumentHistogram {\n this.#val = initVal;\n return this;\n }\n\n ResetHistogramData(): void {\n for (let i=0; i < this.hist.length; i++) {\n this.hist[i][0] = 0;\n }\n }\n\n AddObservation(updateValue: number): void {\n if (this.#copy) {\n throw new Error('Cannot add observations from the copy version of this class.');\n }\n let i = 0;\n for (; i < this.#histogramData.length-1; i++)\n {\n if (updateValue <= this.#histogramData[i][HistogramDataElementPos.breakPoint])\n {\n this.#histogramData[i][HistogramDataElementPos.val]++;\n return;\n }\n }\n this.#histogramData[i][HistogramDataElementPos.val]++;\n }\n\n #GetVal(): number {\n return this.GetNumber(this.#val);\n }\n\n #SetVal(value: number) {\n this.#val = value;\n this.AddObservation(value);\n }\n\n get\tformattedHistogramData(): string {\n let retVal = '';\n let sep = '';\n for (let i=0; i < this.hist.length; i++) {\n retVal += sep + '[' + (this.hist[i][HistogramDataElementPos.val] + '/' + this.hist[i][HistogramDataElementPos.label]).padStart(10, ' ') + ']';\n sep = ' ';\n }\n return retVal;\n }\n\n #GetHistogramData(): HistogramDataElement[] {\n return this.#histogramData;\n }\n\n #SetHistogramData(value: HistogramDataElement[]) {\n this.#histogramData = value;\n }\n\n static AddHistogramDataEx(histoA: InstrumentHistogram | null, histoB: InstrumentHistogram): InstrumentHistogram {\n if (histoA === null) {\n return _cloneDeep(histoB);\n }\n\n const result = _cloneDeep(histoA);\n const histogramAData = result.hist;\n const histogramBData = histoB.hist;\n\n if (histogramAData.length !== histogramBData.length) {\n throw new Error('Invalid HistogramData. HistogramData bucket lengths must be the same.')\n }\n for (let i=0; i < histogramAData.length; i++)\n {\n if (histogramAData[i][HistogramDataElementPos.breakPoint] !== histogramBData[i][HistogramDataElementPos.breakPoint]) {\n throw new Error(`Invalid HistogramData. HistogramData bucket break-point at index [${i}] must be the same.`)\n }\n if (histogramAData[i][HistogramDataElementPos.label] !== histogramBData[i][HistogramDataElementPos.label]) {\n throw new Error(`Invalid HistogramData. HistogramData bucket label at index [${i}] must be the same.`)\n }\n histogramAData[i][HistogramDataElementPos.val] += histogramBData[i][HistogramDataElementPos.val];\n }\n\n return result;\n }\n\n /**\n\t * Adds a value object (from GetFormatted()) to this instance.\n\t * @param {*} value \n\t */\n AddHistogramData(histogramData: InstrumentHistogram): void {\n if (histogramData === null) {\n return;\n }\n\n if (this.hist.length !== histogramData.hist.length) {\n throw new Error('Invalid HistogramData. HistogramData bucket lengths must be the same.')\n }\n for (let i=0; i < histogramData.hist.length; i++)\n {\n if (this.hist[i][HistogramDataElementPos.breakPoint] !== histogramData.hist[i][HistogramDataElementPos.breakPoint]) {\n throw new Error(`Invalid HistogramData. HistogramData bucket break-point at index [${i}] must be the same.`)\n }\n if (this.hist[i][HistogramDataElementPos.label] !== histogramData.hist[i][HistogramDataElementPos.label]) {\n throw new Error(`Invalid HistogramData. HistogramData bucket label at index [${i}] must be the same.`)\n }\n this.hist[i][HistogramDataElementPos.val] += histogramData.hist[i][HistogramDataElementPos.val];\n }\n }\n\t\n override ProcessTelemetry(telemetry: InstrumentHistogramTelemetry): void {\n if (telemetry.val !== undefined) {\n this.val = telemetry.val;\n }\n }\n}\n","/* eslint @typescript-eslint/no-explicit-any: 0 */ // --> OFF\nimport _cloneDeep from 'lodash.clonedeep'\n\nimport { InstrumentBase, InstrumentBaseOptions, InstrumentBaseTelemetry } from './instrumentBase.js'\nimport { GaugeTypes } from '../instrumentDefs.js'\n\nimport { JSONObject, ISTSLogger } from '@nsshunt/stsutils'\n\nexport interface LogReportValue extends JSONObject {\n\tval: string[]\n}\n\nexport class InstrumentLogOptions extends InstrumentBaseOptions {\n maxSize?: number\n useLatestMessages?: boolean\n consoleLogging?: boolean\n instrumentLogging?: boolean\n winstonLogging?: boolean\n fromJSON?: InstrumentLog\n initValue?: string[]\n logger?: ISTSLogger\n}\n\nexport class InstrumentLogTelemetry extends InstrumentBaseTelemetry {\n Append?: string[]\n LogMessage?: string\n val?: string[]\n ResetLog?: boolean\n}\n\nexport class InstrumentLog extends InstrumentBase implements ISTSLogger\n{\n #messages: string[] = [ ];\n #readPos = 0;\n #maxSize = 200; // Max length of cached log messages\n #copy = false;\n #useLatestMessages = false;\n #consoleLogging = false;\n #instrumentLogging = true;\n #winstonLogging = false;\n #stsLogger: ISTSLogger | undefined;\n\n constructor(options: InstrumentLogOptions = { })\n {\n super(options);\n\n if (typeof options.label === 'undefined') {\n this.label = 'InstrumentLog';\n } else {\n this.label = options.label;\n }\n\n if (typeof options.maxSize === 'undefined') {\n this.#maxSize = 200;\n } else {\n this.#maxSize = options.maxSize;\n }\n\n if (typeof options.fromJSON === 'undefined') {\n this.#copy = false;\n } else {\n this.#copy = true;\n }\n\n if (typeof options.useLatestMessages === 'undefined') {\n this.#useLatestMessages = false;\n } else {\n this.#useLatestMessages = options.useLatestMessages;\n }\n\n if (typeof options.consoleLogging === 'undefined') {\n this.#consoleLogging = false;\n } else {\n this.#consoleLogging = options.consoleLogging;\n }\n\n if (typeof options.instrumentLogging === 'undefined') {\n this.#instrumentLogging = true;\n } else {\n this.#instrumentLogging = options.instrumentLogging;\n }\n\n if (typeof options.winstonLogging === 'undefined') {\n this.#winstonLogging = false;\n } else {\n this.#winstonLogging = options.winstonLogging;\n }\n\n Object.defineProperty(this, GaugeTypes.GAUGE_TYPE, {\n enumerable: true,\n get: () => GaugeTypes.INSTRUMENT_LOG\n });\n\n if (this.#copy) {\n this.DefineCopyProperties([\n 'val' \n ]);\n } else {\n Object.defineProperty(this, 'val', {\n enumerable: true,\n get: () => _cloneDeep(this.#GetVal()),\n set: (value) => { this.#SetVal(value); }\n });\n }\n\n if (typeof options.initValue !== 'undefined') {\n this.val = options.initValue;\n }\n\n // Set copy values now that we have defined our properties\n if (typeof options.fromJSON !== 'undefined') {\n const result = _cloneDeep(options.fromJSON);\n this.val = result.val;\n }\n }\n\n public val: string[] = [];\n\n WithMaxSize(maxSize: number): InstrumentLog {\n this.#maxSize = maxSize;\n return this;\n }\n\n WithUseLatestMessages(useLatestMessages: boolean): InstrumentLog {\n this.#useLatestMessages = useLatestMessages;\n return this;\n }\n\n WithConsoleLogging(consoleLogging: boolean): InstrumentLog {\n this.#consoleLogging = consoleLogging;\n return this;\n }\n\n WithInstrumentLogging(instrumentLogging: boolean): InstrumentLog {\n this.#instrumentLogging = instrumentLogging;\n return this;\n }\n\n get MaxSize(): number {\n return this.#maxSize;\n }\n\n set MaxSize(maxSize: number) {\n this.#maxSize = maxSize;\n }\n\n #DumpToConsole(): void\n {\n const logReport = this.GetMessagesSinceLastRead();\n for (let i=0; i < logReport.length; i++) {\n console.log(logReport[i]);\n }\n }\n\n get consoleLogging(): boolean {\n return this.#consoleLogging;\n }\n\n set consoleLogging(value: boolean) {\n this.#consoleLogging = value;\n if (value === true) {\n this.#DumpToConsole();\n }\n }\n\n get instrumentLogging(): boolean {\n return this.#instrumentLogging;\n }\n\n set instrumentLogging(value: boolean) {\n this.#instrumentLogging = value;\n }\n\n Append(messageArray: string[]): void {\n for (let i=0; i < messageArray.length; i++) {\n this.LogMessage(messageArray[i]);\n }\n }\n\n error(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.error(message);\n }\n\n warn(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.warn(message);\n }\n\n info(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.info(message);\n }\n\n http(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.http(message);\n }\n\n verbose(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.verbose(message);\n }\n\n debug(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.debug(message);\n }\n\n silly(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.silly(message);\n }\n\n LogMessage(message: string): void {\n if (this.#copy) {\n throw new Error('Cannot add log messages from the copy version of this class.');\n }\n if (this.#consoleLogging === true) {\n console.log(message);\n }\n\n if (this.#instrumentLogging === false) {\n return;\n }\n\n this.#messages.push(message);\n if (this.#messages.length > this.#maxSize) {\n this.#messages.shift();\n this.#readPos = (this.#readPos > 0 ? this.#readPos-1 : 0);\n }\n }\n\n #GetVal(): string[]\n {\n if (this.#useLatestMessages) {\n return this.GetMessagesSinceLastRead();\n } else {\n return this.#messages;\n }\n }\n\n #SetVal(updatedValue: string[]): void\n {\n this.#messages = updatedValue;\n this.#readPos = 0;\n }\n\n GetMessagesNoUpdate(): string[] {\n return this.#messages.slice(this.#readPos);\n }\n\n // This will return only those messages that have been added since the last read\n GetMessagesSinceLastRead(): string[]\n {\n const retVal = this.#messages.slice(this.#readPos);\n this.#readPos = this.#messages.length;\n return retVal;\n }\n\n ResetLog(): void\n {\n this.#messages = [ ];\n this.#readPos = 0;\n }\n\n override ProcessTelemetry(telemetry: InstrumentLogTelemetry): void {\n if (telemetry.val !== undefined) {\n this.val = telemetry.val;\n }\n if (telemetry.Append !== undefined) {\n this.Append(telemetry.Append);\n }\n if (telemetry.LogMessage !== undefined) {\n this.LogMessage(telemetry.LogMessage);\n }\n if (telemetry.ResetLog !== undefined && telemetry.ResetLog === true) {\n this.ResetLog();\n }\n }\n}\n","//import * as ph from 'node:perf_hooks'; //@@ need to test - may not work in browser\n\nimport _cloneDeep from 'lodash.clonedeep'\n\nimport { InstrumentBase, InstrumentBaseOptions, InstrumentBaseTelemetry } from './instrumentBase.js'\nimport { GaugeTypes } from '../instrumentDefs.js'\n\nimport { JSONObject } from '@nsshunt/stsutils'\n\n// Potentially, look @ this module...\n// https://www.npmjs.com/package/performance-now\n\nexport interface TimerReportValue extends JSONObject {\n\tval: number\n\tvalue: string\n\tvf: string\n\ts: string\n}\n\nexport class InstrumentTimerOptions extends InstrumentBaseOptions {\n fromJSON?: InstrumentTimerGauge\n initValue?: number\n}\n\nexport class InstrumentTimerTelemetry extends InstrumentBaseTelemetry {\n val?: number\n Pause?: boolean\n Resume?: boolean\n Reset?: boolean\n}\n\nexport class InstrumentTimerGauge extends InstrumentBase\n{\n #start = 0;\n #copy = false;\n #pauseVal = 0;\n\n constructor(options: InstrumentTimerOptions = { }) {\n super(options)\n\n if (typeof options.label === 'undefined') {\n this.label = 'InstrumentTimerGauge';\n } else {\n this.label = options.label;\n }\n\n if (typeof options.fromJSON === 'undefined') {\n this.#copy = false;\n } else {\n this.#copy = true;\n }\n\n Object.defineProperty(this, GaugeTypes.GAUGE_TYPE, {\n enumerable: true,\n get: () => GaugeTypes.INSTRUMENT_TIMER\n });\n\n if (this.#copy) {\n this.DefineCopyProperties([\n 'val' \n ]);\n } else {\n Object.defineProperty(this, 'val', {\n enumerable: true,\n get: () => this.#GetVal(),\n set: (value) => { this.#SetVal(value); }\n });\n }\n\n if (typeof options.initValue !== 'undefined') {\n this.val = options.initValue;\n }\n\n // Set copy values now that we have defined our properties\n if (typeof options.fromJSON !== 'undefined') {\n const result = _cloneDeep(options.fromJSON);\n this.val = result.val;\n }\n\n this.Reset();\n }\n\n public val = 0;\n\n // Take a snap shot of the current elapsed time. The 'clock' will still keep running.\n Pause(): void {\n this.#pauseVal = this.val;\n }\n\n Resume(): void {\n this.#pauseVal = 0;\n }\n\n Reset(): void {\n this.#start = performance.now();\n }\n\n #GetVal(): number {\n if (this.#pauseVal !== 0) {\n return this.GetNumber(this.#pauseVal);\n }\n return this.GetNumber(performance.now() - this.#start);\n }\n\t\n #SetVal(updatedValue: number): void {\n // Reset the start time based on the supplied duration\n this.#start = performance.now() - updatedValue;\n }\n\n get start(): number {\n return this.#start;\n }\n\n /*\n #convertMS(ms: number): string {\n //let d, h, m, s;\n let s = Math.floor(ms / 1000);\n let m = Math.floor(s / 60);\n s = s % 60;\n let h = Math.floor(m / 60);\n m = m % 60;\n const d = Math.floor(h / 24);\n h = h % 24;\n\t\n const pad: (n: number) => string = function(n: number) { return n < 10 ? '0' + n : n.toString(); };\n\t\n return (d + '.' + pad(h) + ':' + pad(m) + ':' + pad(s)).padStart(12);\n }\n */ \n\n override ProcessTelemetry(telemetry: InstrumentTimerTelemetry): void {\n if (telemetry.val !== undefined) {\n this.val = telemetry.val;\n }\n if (telemetry.Pause !== undefined && telemetry.Pause === true) {\n this.Pause();\n }\n if (telemetry.Resume !== undefined && telemetry.Resume === true) {\n this.Resume();\n }\n if (telemetry.Reset !== undefined && telemetry.Reset === true) {\n this.Reset();\n }\n }\n}\n","/****\n * The MIT License\n *\n * Copyright (c) 2015 Marco Ziccardi\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n ****/\n(function (global, factory) {\n if (typeof define === 'function' && define.amd) {\n define('timsort', ['exports'], factory);\n } else if (typeof exports !== 'undefined') {\n factory(exports);\n } else {\n var mod = {\n exports: {}\n };\n factory(mod.exports);\n global.timsort = mod.exports;\n }\n})(this, function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n exports.sort = sort;\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError('Cannot call a class as a function');\n }\n }\n\n var DEFAULT_MIN_MERGE = 32;\n\n var DEFAULT_MIN_GALLOPING = 7;\n\n var DEFAULT_TMP_STORAGE_LENGTH = 256;\n\n var POWERS_OF_TEN = [1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9];\n\n function log10(x) {\n if (x < 1e5) {\n if (x < 1e2) {\n return x < 1e1 ? 0 : 1;\n }\n\n if (x < 1e4) {\n return x < 1e3 ? 2 : 3;\n }\n\n return 4;\n }\n\n if (x < 1e7) {\n return x < 1e6 ? 5 : 6;\n }\n\n if (x < 1e9) {\n return x < 1e8 ? 7 : 8;\n }\n\n return 9;\n }\n\n function alphabeticalCompare(a, b) {\n if (a === b) {\n return 0;\n }\n\n if (~ ~a === a && ~ ~b === b) {\n if (a === 0 || b === 0) {\n return a < b ? -1 : 1;\n }\n\n if (a < 0 || b < 0) {\n if (b >= 0) {\n return -1;\n }\n\n if (a >= 0) {\n return 1;\n }\n\n a = -a;\n b = -b;\n }\n\n var al = log10(a);\n var bl = log10(b);\n\n var t = 0;\n\n if (al < bl) {\n a *= POWERS_OF_TEN[bl - al - 1];\n b /= 10;\n t = -1;\n } else if (al > bl) {\n b *= POWERS_OF_TEN[al - bl - 1];\n a /= 10;\n t = 1;\n }\n\n if (a === b) {\n return t;\n }\n\n return a < b ? -1 : 1;\n }\n\n var aStr = String(a);\n var bStr = String(b);\n\n if (aStr === bStr) {\n return 0;\n }\n\n return aStr < bStr ? -1 : 1;\n }\n\n function minRunLength(n) {\n var r = 0;\n\n while (n >= DEFAULT_MIN_MERGE) {\n r |= n & 1;\n n >>= 1;\n }\n\n return n + r;\n }\n\n function makeAscendingRun(array, lo, hi, compare) {\n var runHi = lo + 1;\n\n if (runHi === hi) {\n return 1;\n }\n\n if (compare(array[runHi++], array[lo]) < 0) {\n while (runHi < hi && compare(array[runHi], array[runHi - 1]) < 0) {\n runHi++;\n }\n\n reverseRun(array, lo, runHi);\n } else {\n while (runHi < hi && compare(array[runHi], array[runHi - 1]) >= 0) {\n runHi++;\n }\n }\n\n return runHi - lo;\n }\n\n function reverseRun(array, lo, hi) {\n hi--;\n\n while (lo < hi) {\n var t = array[lo];\n array[lo++] = array[hi];\n array[hi--] = t;\n }\n }\n\n function binaryInsertionSort(array, lo, hi, start, compare) {\n if (start === lo) {\n start++;\n }\n\n for (; start < hi; start++) {\n var pivot = array[start];\n\n var left = lo;\n var right = start;\n\n while (left < right) {\n var mid = left + right >>> 1;\n\n if (compare(pivot, array[mid]) < 0) {\n right = mid;\n } else {\n left = mid + 1;\n }\n }\n\n var n = start - left;\n\n switch (n) {\n case 3:\n array[left + 3] = array[left + 2];\n\n case 2:\n array[left + 2] = array[left + 1];\n\n case 1:\n array[left + 1] = array[left];\n break;\n default:\n while (n > 0) {\n array[left + n] = array[left + n - 1];\n n--;\n }\n }\n\n array[left] = pivot;\n }\n }\n\n function gallopLeft(value, array, start, length, hint, compare) {\n var lastOffset = 0;\n var maxOffset = 0;\n var offset = 1;\n\n if (compare(value, array[start + hint]) > 0) {\n maxOffset = length - hint;\n\n while (offset < maxOffset && compare(value, array[start + hint + offset]) > 0) {\n lastOffset = offset;\n offset = (offset << 1) + 1;\n\n if (offset <= 0) {\n offset = maxOffset;\n }\n }\n\n if (offset > maxOffset) {\n offset = maxOffset;\n }\n\n lastOffset += hint;\n offset += hint;\n } else {\n maxOffset = hint + 1;\n while (offset < maxOffset && compare(value, array[start + hint - offset]) <= 0) {\n lastOffset = offset;\n offset = (offset << 1) + 1;\n\n if (offset <= 0) {\n offset = maxOffset;\n }\n }\n if (offset > maxOffset) {\n offset = maxOffset;\n }\n\n var tmp = lastOffset;\n lastOffset = hint - offset;\n offset = hint - tmp;\n }\n\n lastOffset++;\n while (lastOffset < offset) {\n var m = lastOffset + (offset - lastOffset >>> 1);\n\n if (compare(value, array[start + m]) > 0) {\n lastOffset = m + 1;\n } else {\n offset = m;\n }\n }\n return offset;\n }\n\n function gallopRight(value, array, start, length, hint, compare) {\n var lastOffset = 0;\n var maxOffset = 0;\n var offset = 1;\n\n if (compare(value, array[start + hint]) < 0) {\n maxOffset = hint + 1;\n\n while (offset < maxOffset && compare(value, array[start + hint - offset]) < 0) {\n lastOffset = offset;\n offset = (offset << 1) + 1;\n\n if (offset <= 0) {\n offset = maxOffset;\n }\n }\n\n if (offset > maxOffset) {\n offset = maxOffset;\n }\n\n var tmp = lastOffset;\n lastOffset = hint - offset;\n offset = hint - tmp;\n } else {\n maxOffset = length - hint;\n\n while (offset < maxOffset && compare(value, array[start + hint + offset]) >= 0) {\n lastOffset = offset;\n offset = (offset << 1) + 1;\n\n if (offset <= 0) {\n offset = maxOffset;\n }\n }\n\n if (offset > maxOffset) {\n offset = maxOffset;\n }\n\n lastOffset += hint;\n offset += hint;\n }\n\n lastOffset++;\n\n while (lastOffset < offset) {\n var m = lastOffset + (offset - lastOffset >>> 1);\n\n if (compare(value, array[start + m]) < 0) {\n offset = m;\n } else {\n lastOffset = m + 1;\n }\n }\n\n return offset;\n }\n\n var TimSort = (function () {\n function TimSort(array, compare) {\n _classCallCheck(this, TimSort);\n\n this.array = null;\n this.compare = null;\n this.minGallop = DEFAULT_MIN_GALLOPING;\n this.length = 0;\n this.tmpStorageLength = DEFAULT_TMP_STORAGE_LENGTH;\n this.stackLength = 0;\n this.runStart = null;\n this.runLength = null;\n this.stackSize = 0;\n\n this.array = array;\n this.compare = compare;\n\n this.length = array.length;\n\n if (this.length < 2 * DEFAULT_TMP_STORAGE_LENGTH) {\n this.tmpStorageLength = this.length >>> 1;\n }\n\n this.tmp = new Array(this.tmpStorageLength);\n\n this.stackLength = this.length < 120 ? 5 : this.length < 1542 ? 10 : this.length < 119151 ? 19 : 40;\n\n this.runStart = new Array(this.stackLength);\n this.runLength = new Array(this.stackLength);\n }\n\n TimSort.prototype.pushRun = function pushRun(runStart, runLength) {\n this.runStart[this.stackSize] = runStart;\n this.runLength[this.stackSize] = runLength;\n this.stackSize += 1;\n };\n\n TimSort.prototype.mergeRuns = function mergeRuns() {\n while (this.stackSize > 1) {\n var n = this.stackSize - 2;\n\n if (n >= 1 && this.runLength[n - 1] <= this.runLength[n] + this.runLength[n + 1] || n >= 2 && this.runLength[n - 2] <= this.runLength[n] + this.runLength[n - 1]) {\n\n if (this.runLength[n - 1] < this.runLength[n + 1]) {\n n--;\n }\n } else if (this.runLength[n] > this.runLength[n + 1]) {\n break;\n }\n this.mergeAt(n);\n }\n };\n\n TimSort.prototype.forceMergeRuns = function forceMergeRuns() {\n while (this.stackSize > 1) {\n var n = this.stackSize - 2;\n\n if (n > 0 && this.runLength[n - 1] < this.runLength[n + 1]) {\n n--;\n }\n\n this.mergeAt(n);\n }\n };\n\n TimSort.prototype.mergeAt = function mergeAt(i) {\n var compare = this.compare;\n var array = this.array;\n\n var start1 = this.runStart[i];\n var length1 = this.runLength[i];\n var start2 = this.runStart[i + 1];\n var length2 = this.runLength[i + 1];\n\n this.runLength[i] = length1 + length2;\n\n if (i === this.stackSize - 3) {\n this.runStart[i + 1] = this.runStart[i + 2];\n this.runLength[i + 1] = this.runLength[i + 2];\n }\n\n this.stackSize--;\n\n var k = gallopRight(array[start2], array, start1, length1, 0, compare);\n start1 += k;\n length1 -= k;\n\n if (length1 === 0) {\n return;\n }\n\n length2 = gallopLeft(array[start1 + length1 - 1], array, start2, length2, length2 - 1, compare);\n\n if (length2 === 0) {\n return;\n }\n\n if (length1 <= length2) {\n this.mergeLow(start1, length1, start2, length2);\n } else {\n this.mergeHigh(start1, length1, start2, length2);\n }\n };\n\n TimSort.prototype.mergeLow = function mergeLow(start1, length1, start2, length2) {\n\n var compare = this.compare;\n var array = this.array;\n var tmp = this.tmp;\n var i = 0;\n\n for (i = 0; i < length1; i++) {\n tmp[i] = array[start1 + i];\n }\n\n var cursor1 = 0;\n var cursor2 = start2;\n var dest = start1;\n\n array[dest++] = array[cursor2++];\n\n if (--length2 === 0) {\n for (i = 0; i < length1; i++) {\n array[dest + i] = tmp[cursor1 + i];\n }\n return;\n }\n\n if (length1 === 1) {\n for (i = 0; i < length2; i++) {\n array[dest + i] = array[cursor2 + i];\n }\n array[dest + length2] = tmp[cursor1];\n return;\n }\n\n var minGallop = this.minGallop;\n\n while (true) {\n var count1 = 0;\n var count2 = 0;\n var exit = false;\n\n do {\n if (compare(array[cursor2], tmp[cursor1]) < 0) {\n array[dest++] = array[cursor2++];\n count2++;\n count1 = 0;\n\n if (--length2 === 0) {\n exit = true;\n break;\n }\n } else {\n array[dest++] = tmp[cursor1++];\n count1++;\n count2 = 0;\n if (--length1 === 1) {\n exit = true;\n break;\n }\n }\n } while ((count1 | count2) < minGallop);\n\n if (exit) {\n break;\n }\n\n do {\n count1 = gallopRight(array[cursor2], tmp, cursor1, length1, 0, compare);\n\n if (count1 !== 0) {\n for (i = 0; i < count1; i++) {\n array[dest + i] = tmp[cursor1 + i];\n }\n\n dest += count1;\n cursor1 += count1;\n length1 -= count1;\n if (length1 <= 1) {\n exit = true;\n break;\n }\n }\n\n array[dest++] = array[cursor2++];\n\n if (--length2 === 0) {\n exit = true;\n break;\n }\n\n count2 = gallopLeft(tmp[cursor1], array, cursor2, length2, 0, compare);\n\n if (count2 !== 0) {\n for (i = 0; i < count2; i++) {\n array[dest + i] = array[cursor2 + i];\n }\n\n dest += count2;\n cursor2 += count2;\n length2 -= count2;\n\n if (length2 === 0) {\n exit = true;\n break;\n }\n }\n array[dest++] = tmp[cursor1++];\n\n if (--length1 === 1) {\n exit = true;\n break;\n }\n\n minGallop--;\n } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING);\n\n if (exit) {\n break;\n }\n\n if (minGallop < 0) {\n minGallop = 0;\n }\n\n minGallop += 2;\n }\n\n this.minGallop = minGallop;\n\n if (minGallop < 1) {\n this.minGallop = 1;\n }\n\n if (length1 === 1) {\n for (i = 0; i < length2; i++) {\n array[dest + i] = array[cursor2 + i];\n }\n array[dest + length2] = tmp[cursor1];\n } else if (length1 === 0) {\n throw new Error('mergeLow preconditions were not respected');\n } else {\n for (i = 0; i < length1; i++) {\n array[dest + i] = tmp[cursor1 + i];\n }\n }\n };\n\n TimSort.prototype.mergeHigh = function mergeHigh(start1, length1, start2, length2) {\n var compare = this.compare;\n var array = this.array;\n var tmp = this.tmp;\n var i = 0;\n\n for (i = 0; i < length2; i++) {\n tmp[i] = array[start2 + i];\n }\n\n var cursor1 = start1 + length1 - 1;\n var cursor2 = length2 - 1;\n var dest = start2 + length2 - 1;\n var customCursor = 0;\n var customDest = 0;\n\n array[dest--] = array[cursor1--];\n\n if (--length1 === 0) {\n customCursor = dest - (length2 - 1);\n\n for (i = 0; i < length2; i++) {\n array[customCursor + i] = tmp[i];\n }\n\n return;\n }\n\n if (length2 === 1) {\n dest -= length1;\n cursor1 -= length1;\n customDest = dest + 1;\n customCursor = cursor1 + 1;\n\n for (i = length1 - 1; i >= 0; i--) {\n array[customDest + i] = array[customCursor + i];\n }\n\n array[dest] = tmp[cursor2];\n return;\n }\n\n var minGallop = this.minGallop;\n\n while (true) {\n var count1 = 0;\n var count2 = 0;\n var exit = false;\n\n do {\n if (compare(tmp[cursor2], array[cursor1]) < 0) {\n array[dest--] = array[cursor1--];\n count1++;\n count2 = 0;\n if (--length1 === 0) {\n exit = true;\n break;\n }\n } else {\n array[dest--] = tmp[cursor2--];\n count2++;\n count1 = 0;\n if (--length2 === 1) {\n exit = true;\n break;\n }\n }\n } while ((count1 | count2) < minGallop);\n\n if (exit) {\n break;\n }\n\n do {\n count1 = length1 - gallopRight(tmp[cursor2], array, start1, length1, length1 - 1, compare);\n\n if (count1 !== 0) {\n dest -= count1;\n cursor1 -= count1;\n length1 -= count1;\n customDest = dest + 1;\n customCursor = cursor1 + 1;\n\n for (i = count1 - 1; i >= 0; i--) {\n array[customDest + i] = array[customCursor + i];\n }\n\n if (length1 === 0) {\n exit = true;\n break;\n }\n }\n\n array[dest--] = tmp[cursor2--];\n\n if (--length2 === 1) {\n exit = true;\n break;\n }\n\n count2 = length2 - gallopLeft(array[cursor1], tmp, 0, length2, length2 - 1, compare);\n\n if (count2 !== 0) {\n dest -= count2;\n cursor2 -= count2;\n length2 -= count2;\n customDest = dest + 1;\n customCursor = cursor2 + 1;\n\n for (i = 0; i < count2; i++) {\n array[customDest + i] = tmp[customCursor + i];\n }\n\n if (length2 <= 1) {\n exit = true;\n break;\n }\n }\n\n array[dest--] = array[cursor1--];\n\n if (--length1 === 0) {\n exit = true;\n break;\n }\n\n minGallop--;\n } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING);\n\n if (exit) {\n break;\n }\n\n if (minGallop < 0) {\n minGallop = 0;\n }\n\n minGallop += 2;\n }\n\n this.minGallop = minGallop;\n\n if (minGallop < 1) {\n this.minGallop = 1;\n }\n\n if (length2 === 1) {\n dest -= length1;\n cursor1 -= length1;\n customDest = dest + 1;\n customCursor = cursor1 + 1;\n\n for (i = length1 - 1; i >= 0; i--) {\n array[customDest + i] = array[customCursor + i];\n }\n\n array[dest] = tmp[cursor2];\n } else if (length2 === 0) {\n throw new Error('mergeHigh preconditions were not respected');\n } else {\n customCursor = dest - (length2 - 1);\n for (i = 0; i < length2; i++) {\n array[customCursor + i] = tmp[i];\n }\n }\n };\n\n return TimSort;\n })();\n\n function sort(array, compare, lo, hi) {\n if (!Array.isArray(array)) {\n throw new TypeError('Can only sort arrays');\n }\n\n if (!compare) {\n compare = alphabeticalCompare;\n } else if (typeof compare !== 'function') {\n hi = lo;\n lo = compare;\n compare = alphabeticalCompare;\n }\n\n if (!lo) {\n lo = 0;\n }\n if (!hi) {\n hi = array.length;\n }\n\n var remaining = hi - lo;\n\n if (remaining < 2) {\n return;\n }\n\n var runLength = 0;\n\n if (remaining < DEFAULT_MIN_MERGE) {\n runLength = makeAscendingRun(array, lo, hi, compare);\n binaryInsertionSort(array, lo, hi, lo + runLength, compare);\n return;\n }\n\n var ts = new TimSort(array, compare);\n\n var minRun = minRunLength(remaining);\n\n do {\n runLength = makeAscendingRun(array, lo, hi, compare);\n if (runLength < minRun) {\n var force = remaining;\n if (force > minRun) {\n force = minRun;\n }\n\n binaryInsertionSort(array, lo, lo + force, lo + runLength, compare);\n runLength = force;\n }\n\n ts.pushRun(lo, runLength);\n ts.mergeRuns();\n\n remaining -= runLength;\n lo += runLength;\n } while (remaining !== 0);\n\n ts.forceMergeRuns();\n }\n});\n","module.exports = require('./build/timsort.js');","/**\n @typedef {(Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array | Uint8ClampedArray | Float32Array | Float64Array)} TypedArray\n */\n\n/**\n * Error message for a case when percentile is less than 0.\n *\n * @param {Number} p\n *\n * @return {String}\n */\nfunction lessThanZeroError(p) {\n return 'Expect percentile to be >= 0 but given \"' + p + '\" and its type is \"' + (typeof p) + '\".';\n}\n\n/**\n * Error message for a case when percentile is greater than 100.\n *\n * @param {Number} p\n *\n * @return {String}\n */\nfunction greaterThanHundredError(p) {\n return 'Expect percentile to be <= 100 but given \"' + p + '\" and its type is \"' + (typeof p) + '\".';\n}\n\n/**\n * Error message for a case when percentile is not a number (NaN).\n *\n * @param {Number} p\n *\n * @return {String}\n */\nfunction nanError(p) {\n return 'Expect percentile to be a number but given \"' + p + '\" and its type is \"' + (typeof p) + '\".';\n}\n\n/**\n * Checks that a list of percentiles are all numbers and they lie in range 0..100.\n *\n * @param {Array<Number>} ps - percentiles to calculate\n *\n * @return {Array} List of errors\n */\nfunction validateInput(ps) {\n return ps.reduce(function (errors, p) {\n if (isNaN(Number(p))) {\n errors.push(nanError(p));\n } else if (p < 0) {\n errors.push(lessThanZeroError(p));\n } else if (p > 100) {\n errors.push(greaterThanHundredError(p));\n }\n return errors;\n }, []);\n}\n\n/**\n * Get percentile value from an array.\n *\n * @param {Number} p - percentile\n * @param {Array|TypedArray} list - list of values\n *\n * @return {*}\n */\nfunction getPsValue(p, list) {\n if (p === 0) return list[0];\n var kIndex = Math.ceil(list.length * (p / 100)) - 1;\n return list[kIndex];\n}\n\n/**\n * Calculate percentile for given array of values.\n *\n * @template T\n * @param {Number|Array<Number>} pOrPs - percentile or a list of percentiles\n * @param {Array<T>|Array<Number>|TypedArray} list - array of values\n * @param {function(T): Number} [fn] - optional function to extract a value from an array item\n *\n * @return {Number|T|Array<Number>|Array<T>}\n */\nfunction percentile(pOrPs, list, fn) {\n var ps = Array.isArray(pOrPs) ? pOrPs : [pOrPs];\n var validationErrors = validateInput(ps);\n\n if (validationErrors.length) {\n throw new Error(validationErrors.join(' '));\n }\n\n list = list.slice().sort(function (a, b) {\n if (fn) {\n a = fn(a);\n b = fn(b);\n }\n\n a = Number.isNaN(a) ? Number.NEGATIVE_INFINITY : a;\n b = Number.isNaN(b) ? Number.NEGATIVE_INFINITY : b;\n\n if (a > b) return 1;\n if (a < b) return -1;\n\n return 0;\n });\n\n if (ps.length === 1) {\n return getPsValue(ps[0], list);\n }\n\n return ps.map(function (p) {\n return getPsValue(p, list);\n });\n}\n\nmodule.exports = percentile;\n","import * as timSort from 'timsort' // Required as this is a UMD library\n// https://www.typescriptlang.org/docs/handbook/declaration-files/library-structures.html\nimport percentile from 'percentile'\nimport _cloneDeep from 'lodash.clonedeep'\n\nimport { InstrumentBase, InstrumentBaseOptions, InstrumentBaseTelemetry } from './instrumentBase.js'\nimport { GaugeTypes } from '../instrumentDefs.js'\nimport { JSONObject } from '@nsshunt/stsutils'\nimport isNode from 'detect-node'\n\nexport type QuantileDataElement = [\n label: string,\n val: number,\n];\n\nexport interface gaugeReportValue extends JSONObject {\n\tval: number\n\tvalue: string\n\tvf: string\n\tmin?: string\n\tmax?: string\n\tavg?: string\n\tpercentile?: number[]\n\tpercentileFormatted?: string\n}\n\nexport class InstrumentGaugeOptions extends InstrumentBaseOptions {\n interval?: number\n sampleSize?: number\n fromJSON?: InstrumentGauge\n initValue?: number\n}\n\nexport class InstrumentGaugeTelemetry extends InstrumentBaseTelemetry {\n val?: number\n Inc?: number\n Dec?: number\n}\n\n//@@ Create a GaugeEx that also includes min, max, average\nexport class InstrumentGauge extends InstrumentBase\n{\n #val = 0;\n #maxval: number | null = null;\n #lastObservedValue = 0;\n #timeSeriesList: number[] = [ ];\n #maxSampleSize = 0;\n #timerInterval = 0;\n #observer: NodeJS.Timeout | null = null;\n\n //@@ extras\n #min: number | null = null;\n #max = 0; \n #observations = 0;\n #total = 0;\n #copy = false;\n\n constructor(options: InstrumentGaugeOptions = { }) {\n super(options);\n\n if (!options.label) {\n this.label = 'InstrumentGauge';\n } else {\n this.label = options.label;\n }\n\n if (typeof options.interval === 'undefined') {\n this.#timerInterval = 0;\n } else {\n this.#timerInterval = options.interval;\n }\n\n if (typeof options.sampleSize === 'undefined') {\n this.#maxSampleSize = 600;\n } else {\n this.#maxSampleSize = options.sampleSize;\n }\n\n if (typeof options.fromJSON === 'undefined') {\n this.#copy = false;\n } else {\n this.#copy = true;\n }\n\n Object.defineProperty(this, GaugeTypes.GAUGE_TYPE, {\n enumerable: true,\n get: () => GaugeTypes.INSTRUMENT_GAUGE\n });\n\n if (this.#copy) {\n this.DefineCopyProperties([\n 'val', 'min', 'max', 'avg', 'percentile'\n ]);\n } else {\n Object.defineProperty(this, 'val', {\n enumerable: true,\n get: () => this.#GetVal(),\n set: (value) => { this.#SetVal(value); }\n });\n if (this.#timerInterval > 0) {\n Object.defineProperty(this, 'percentile', {\n enumerable: true,\n get: () => this.#GetPercentileData()\n });\n\t\n this._StartTimer();\n }\n }\n\n if (typeof options.initValue !== 'undefined') {\n this.val = options.initValue;\n }\n\n // Set copy values now that we have defined our properties\n if (typeof options.fromJSON !== 'undefined') {\n const result = _cloneDeep(options.fromJSON);\n this.val = result.val;\n if (result.percentile) {\n this.percentile = result.percentile;\n }\n if (result.min) {\n this.min = result.min;\n }\n if (result.max) {\n this.max = result.max;\n }\n if (result.avg) {\n this.avg = result.avg;\n }\n }\n }\n\n public readonly percentile?: number[];\n public readonly min?: number;\n public readonly max?: number;\n public readonly avg?: number;\n public val = 0;\n\n WithInitVal(initVal: number): InstrumentGauge {\n this.val = initVal;\n return this;\n }\n\n WithMin(): InstrumentGauge {\n Object.defineProperty(this, 'min', {\n enumerable: true,\n get: () => this.#GetMin()\n });\n return this;\n }\n\n WithMax(): InstrumentGauge {\n Object.defineProperty(this, 'max', {\n enumerable: true,\n get: () => this.#GetMax()\n });\n return this;\n }\n\n WithAverage(): InstrumentGauge {\n Object.defineProperty(this, 'avg', {\n enumerable: true,\n get: () => this.#GetAverage()\n });\n return this;\n }\n\n private _StartTimer(): void {\n if (this.#timerInterval > 0) {\n this.#timeSeriesList = [ ];\n\n this.#observer = setInterval(() => {\n if (this.#timeSeriesList.length > this.#maxSampleSize) {\n this.#timeSeriesList.shift();\n }\n const maxval = this.#GetAndResetMaxVal();\n this.#timeSeriesList.push(maxval);\n }, this.#timerInterval);\n\n // If running in node ...\n if (isNode) {\n this.#observer.unref();\n }\n\n // https://httptoolkit.tech/blog/unblocking-node-with-unref/\n } else {\n throw new Error(`Unable to StartTimer for this instrument. The interval is set to <= 0.`);\n }\n }\n\n override StopTimer(): void {\n if (this.#observer) {\n clearTimeout(this.#observer);\n this.#observer = null;\n this.#timeSeriesList = [ ];\n }\n }\n\n /**\n\t * If the gauge is being monitored as part of a time series, get the most recent recorded value (max value) from within the time interval\n\t * otherwise, just return the current instant value.\n\t */\n #GetVal(): number {\n if (this.#timerInterval > 0 && this.#observer !== null) {\n if (this.#maxval === null) {\n return this.GetNumber(this.#lastObservedValue);\n } else {\n return this.GetNumber(this.#maxval);\n }\n }\n return this.GetNumber(this.#val);\n }\n\n #SetVal(updatedValue: number): void {\n this.#val = updatedValue;\n this.#observations++;\n this.#total += updatedValue;\n\n if (this.#val > this.#max) {\n this.#max = this.#val;\n }\n\n if (this.#min !== null) {\n if (this.#val < this.#min) {\n this.#min = this.#val;\n }\n } else {\n // Set the min value to the value of the first observation\n this.#min = this.#val;\n }\n\n if (this.#timerInterval > 0) {\n this.#lastObservedValue = updatedValue;\n if (this.#maxval === null) {\n this.#maxval = this.#val;\n } else if (this.#val > this.#maxval) {\n this.#maxval = this.#val;\n }\n }\n }\n\n #GetMin(): number {\n if (this.#min !== null) {\n return this.#min;\n }\n return 0;\n }\n\n #GetMax(): number {\n return this.#max;\n }\n\n #GetAverage(): number {\n if (this.#observations > 0) {\n return this.#total / this.#observations\n }\n return 0;\n }\n\n Reset(): void {\n this.StopTimer();\n\n this.#maxval = 0;\n this.#lastObservedValue = 0;\n this.#val = 0;\n\n this.#min = null;\n this.#max = 0;\n this.#observations = 0;\n this.#total = 0;\n\n if (this.#timerInterval > 0) {\n this._StartTimer();\n }\n }\n\n #GetAndResetMaxVal(): number {\n if (this.#maxval === null) {\n return this.#lastObservedValue;\n }\n const retVal = this.#maxval;\n this.#maxval = null;\n return retVal;\n }\n\n Inc(incVal = 1): void {\n this.#SetVal(this.#val + incVal);\n }\n\n Dec(decVal = 1): void {\n this.#SetVal(this.#val - decVal);\n }\n\n #NumberCompare(a: number, b: number): number {\n return a - b;\n }\n\n #GetPercentileData(): number[] {\n const sortedList = this.#timeSeriesList.slice(0);\n timSort.sort(sortedList, this.#NumberCompare);\n return percentile([50, 80, 90, 95, 99, 99.95], sortedList) as number[];\n }\n\n override ProcessTelemetry(telemetry: InstrumentGaugeTelemetry): void {\n if (telemetry.Inc !== undefined) {\n this.Inc(telemetry.Inc);\n }\n if (telemetry.Dec !== undefined) {\n this.Dec(telemetry.Dec);\n }\n if (telemetry.val !== undefined) {\n this.val = telemetry.val;\n }\n }\n}\n","import _cloneDeep from 'lodash.clonedeep'\n\nimport { InstrumentBase, InstrumentBaseOptions, InstrumentBaseTelemetry } from './instrumentBase.js'\nimport { GaugeTypes } from '../instrumentDefs.js'\n\nimport { JSONObject } from '@nsshunt/stsutils'\n\nexport interface ObjectReportValue extends JSONObject {\n\tval: JSONObject\n}\n\nexport class InstrumentObjectOptions extends InstrumentBaseOptions {\n fromJSON?: InstrumentObject\n initValue?: JSONObject\n}\n\nexport class InstrumentObjectTelemetry extends InstrumentBaseTelemetry {\n val?: JSONObject\n}\n\nexport class InstrumentObject extends InstrumentBase\n{\n #val: JSONObject = { };\n #copy = false;\n\n constructor(options: InstrumentObjectOptions = { }) {\n super(options);\n\n if (typeof options.label === 'undefined') {\n this.label = 'InstrumentObject';\n } else {\n this.label = options.label;\n }\n\n if (typeof options.fromJSON === 'undefined') {\n this.#copy = false;\n } else {\n this.#copy = true;\n }\n\n Object.defineProperty(this, GaugeTypes.GAUGE_TYPE, {\n enumerable: true,\n get: () => GaugeTypes.INSTRUMENT_OBJECT\n });\n\n if (this.#copy) {\n this.DefineCopyProperties([\n 'val'\n ]);\n } else {\n Object.defineProperty(this, 'val', {\n enumerable: true,\n get: () => this.#GetVal(),\n set: (value) => { this.#SetVal(value); }\n });\n }\n\n if (typeof options.initValue !== 'undefined') {\n this.val = options.initValue;\n } else {\n this.val = { };\n }\n\n // Set copy values now that we have defined our properties\n if (typeof options.fromJSON !== 'undefined') {\n const result = _cloneDeep(options.fromJSON);\n this.val = result.val;\n }\n }\n\t\n public val: JSONObject;\n\n WithInitVal(initVal: JSONObject) {\n this.val = initVal;\n return this;\n }\n\n #GetVal(): JSONObject {\n return this.#val;\n }\n\n #SetVal(updatedValue: JSONObject) {\n this.#val = updatedValue;\n }\n\n override ProcessTelemetry(telemetry: InstrumentObjectTelemetry): void {\n if (telemetry.val !== undefined) {\n this.val = telemetry.val;\n }\n }\n}\n","import { Gauge, GaugeTypes } from './instrumentDefs.js'\n\nimport { InstrumentBase, Instruments } from './instruments/instrumentBase.js'\nimport { InstrumentVelocity } from './instruments/instrumentVelocity.js'\nimport { InstrumentHistogram } from './instruments/instrumentHistogram.js'\nimport { InstrumentLog } from './instruments/instrumentLog.js'\nimport { InstrumentTimerGauge } from './instruments/instrumentTimerGauge.js'\nimport { InstrumentGauge } from './instruments/instrumentGauge.js'\nimport { InstrumentObject } from './instruments/instrumentObject.js'\n\nexport function CreateInstrument(sourceInstrument: InstrumentBase): InstrumentBase {\n switch (sourceInstrument[GaugeTypes.GAUGE_TYPE]) {\n case GaugeTypes.INSTRUMENT_GAUGE :\n return new InstrumentGauge({fromJSON:sourceInstrument as InstrumentGauge});\n case GaugeTypes.INSTRUMENT_VELOCITY :\n return new InstrumentVelocity({fromJSON:sourceInstrument as InstrumentVelocity});\n case GaugeTypes.INSTRUMENT_HISTOGRAM :\n return new InstrumentHistogram({fromJSON:sourceInstrument as InstrumentHistogram});\n case GaugeTypes.INSTRUMENT_LOG :\n return new InstrumentLog({fromJSON:sourceInstrument as InstrumentLog});\n case GaugeTypes.INSTRUMENT_TIMER :\n return new InstrumentTimerGauge({fromJSON:sourceInstrument as InstrumentTimerGauge});\n case GaugeTypes.INSTRUMENT_OBJECT :\n return new InstrumentObject({fromJSON:sourceInstrument as InstrumentObject});\n }\n throw new Error(`Cannot create instrument from type: [${sourceInstrument[GaugeTypes.GAUGE_TYPE]}]`)\n}\n\nexport function GetInstrumentName(gauge: Gauge): string {\n switch (gauge) {\n case Gauge.ACTIVE_REQUEST_GAUGE :\n return \"Active Requests\";\n case Gauge.AUTHENTICATION_COUNT_GAUGE :\n return \"Authentication Count\";\n case Gauge.AUTHENTICATION_ERROR_COUNT_GAUGE :\n return \"Authentication Error Count\";\n case Gauge.AUTHENTICATION_RETRY_COUNT_GAUGE :\n return \"Authentication Retry Count\";\n case Gauge.CONNECTION_POOL_IDLE_GAUGE :\n return \"Connection Pool Idle\";\n case Gauge.CONNECTION_POOL_TOTAL_GAUGE :\n return \"Connection Pool Total\";\n case Gauge.CONNECTION_POOL_WAITING_GAUGE :\n return \"Connection Pool Waiting\";\n case Gauge.CPU_LOAD_GAUGE :\n return \"CPU Load\";\n case Gauge.CPU_SYSTEM_LOAD_GAUGE :\n return \"CPU SYstem Load\";\n case Gauge.DURATION_GAUGE :\n return \"Duration\";\n case Gauge.DURATION_HISTOGRAM_GAUGE :\n return \"Diration Histogram\";\n case Gauge.ERROR_COUNT_GAUGE :\n return \"Errors\";\n case Gauge.LATENCY_GAUGE :\n return \"Latency\";\n case Gauge.LATENCY_HISTOGRAM_GAUGE :\n return \"Latency Histogram\";\n case Gauge.LOGGER :\n return \"Logger\";\n case Gauge.LOGGER_COPY :\n return \"_Logger\";\n case Gauge.NETWORK_RX_GAUGE :\n return \"Network Receive\";\n case Gauge.NETWORK_TX_GAUGE :\n return \"Network Transmit\";\n case Gauge.REQUEST_COUNT_GAUGE :\n return \"Requests\";\n case Gauge.RETRY_COUNT_GAUGE :\n return \"Retries\";\n case Gauge.TIMER_GAUGE :\n return \"Timer\";\n case Gauge.VELOCITY_GAUGE :\n return \"Velocity\";\n case Gauge.CONNECTION_COUNT_GAUGE :\n return \"TCP Connection\";\n case Gauge.OBJECT_GAUGE :\n return \"Object\";\n case Gauge.CORE_COUNT_GAUGE :\n return \"Core Count\";\n default:\n return \"Unknown\";\n }\n}\n\nexport function StopInstruments(instruments: InstrumentBase[] | Instruments): void {\n if (instruments) {\n if (Array.isArray(instruments)) {\n instruments.forEach((instrument) => {\n if (instrument.StopTimer) {\n instrument.StopTimer();\n }\n });\n } else {\n for (const [, value] of Object.entries(instruments)) {\n if (value.StopTimer) {\n value.StopTimer();\n }\n }\n }\n }\n}\n"],"x_google_ignoreList":[6,7,8],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["#options","#label","#data","#timerInterval","#valStackMaxLength","#copy","#autoComputeVelocity","#maxAverageValStack","#maxAverageIterations","#velocityTimeDiff","#vaTimeDiff","#autoComputeVelocityTimeout","#maxTimeDiff","#minTimeForReporting","#GetVal","#SetVal","#GetMaxVelocity","#GetDelta","#GetVelocity","#GetVelocityStackAverage","#GetTimeStamp","#GetCountDiff","#GetTimeDiff","#GetDeltaCountDiff","#GetDeltaTimeDif","#GetAverageVelocity","#valStack","#interval","#ComputeVelocity","#velocity","#averageValStack","#averageVelocity","#timeStamp","#velocityVal","#ComputeVelocityByTimeDiff","#valStackAverage","#delta","#countDiff","#timeDiff","#deltaCountDiff","#deltaTimeDif","#lastVelocity","#maxVelocity","#timeoutComputeVelocity","#SetupAutoComputeVelocity","#copy","#histogramData","#GetVal","#SetVal","#GetHistogramData","#SetHistogramData","#val","#maxSize","#copy","#useLatestMessages","#consoleLogging","#instrumentLogging","#winstonLogging","#GetVal","#SetVal","#DumpToConsole","#stsLogger","#messages","#readPos","#copy","#GetVal","#SetVal","#pauseVal","#start","#timerInterval","#maxSampleSize","#copy","#GetVal","#SetVal","#GetPercentileData","#GetMin","#GetMax","#GetAverage","#timeSeriesList","#observer","#GetAndResetMaxVal","#maxval","#lastObservedValue","#val","#observations","#total","#max","#min","#NumberCompare","#copy","#GetVal","#SetVal","#val"],"sources":["../src/instrumentation/instrumentDefs.ts","../src/instrumentation/instruments/instrumentBase.ts","../src/instrumentation/instruments/instrumentVelocity.ts","../src/instrumentation/instruments/instrumentHistogram.ts","../src/instrumentation/instruments/instrumentLog.ts","../src/instrumentation/instruments/instrumentTimerGauge.ts","../node_modules/timsort/build/timsort.js","../node_modules/timsort/index.js","../node_modules/percentile/lib/index.js","../src/instrumentation/instruments/instrumentGauge.ts","../src/instrumentation/instruments/instrumentObject.ts","../src/instrumentation/instrumentUtils.ts"],"sourcesContent":["export enum Gauge {\n\tACTIVE_REQUEST_GAUGE = 'a',\n\tAUTHENTICATION_COUNT_GAUGE = 'b',\n\tAUTHENTICATION_ERROR_COUNT_GAUGE = 'aa',\n\tAUTHENTICATION_RETRY_COUNT_GAUGE = 'ab',\n\tCONNECTION_POOL_IDLE_GAUGE = 'c',\n\tCONNECTION_POOL_TOTAL_GAUGE = 'd',\n\tCONNECTION_POOL_WAITING_GAUGE = 'e',\n\tCPU_LOAD_GAUGE = 'f',\n\tCPU_SYSTEM_LOAD_GAUGE = 'g',\n\tDURATION_GAUGE = 'h',\n\tDURATION_HISTOGRAM_GAUGE = 'i',\n\tERROR_COUNT_GAUGE = 'j',\n\tLATENCY_GAUGE = 'k',\n\tLATENCY_HISTOGRAM_GAUGE = 'l',\n\tLOGGER = 'm',\n\tLOGGER_COPY = 'n',\n\tNETWORK_RX_GAUGE = 'o',\n\tNETWORK_TX_GAUGE = 'p',\n\tREQUEST_COUNT_GAUGE = 'q',\n\tRETRY_COUNT_GAUGE = 'r',\n\tTIMER_GAUGE = 's',\n\tVELOCITY_GAUGE = 't',\n\tCONNECTION_COUNT_GAUGE = 'u',\n\tOBJECT_GAUGE = 'v',\n\tPAYLOAD_SIZE = 'w',\n\tCORE_COUNT_GAUGE = 'x',\n\tCHILD_COUNT = 'y',\n\tUNKNOWN = 'z'\n}\n\nexport enum GaugeTypes {\n\tGAUGE_TYPE = '_',\n\tINSTRUMENT_GAUGE = 'a',\n\tINSTRUMENT_VELOCITY = 'b',\n\tINSTRUMENT_HISTOGRAM = 'c',\n\tINSTRUMENT_LOG = 'd',\n\tINSTRUMENT_TIMER = 'e',\n\tINSTRUMENT_OBJECT = 'f'\n}\n","import { JSONObject } from '@nsshunt/stsutils'\nimport { Gauge, GaugeTypes } from '../instrumentDefs.js'\n\nexport class InstrumentBaseOptions {\n fixedSize?: number\n padLength?: number\n label?: string\n}\n\nexport class InstrumentBaseTelemetry {\n\n}\n\nexport abstract class InstrumentBase {\n #label = '';\n #options: InstrumentBaseOptions | null = null;\n #data: Record<string, unknown> = { };\n\n // Use for copy objects only.\n //protected _data: Record<string, any> = { };\n\n constructor(options: InstrumentBaseOptions = { })\n {\n if (typeof options === 'string' || options instanceof String) {\n throw new Error('Instrument parameter must be an options object.');\n }\n\n this.#options = options;\n\n if (options.label) {\n this.#label = options.label;\n } else {\n this.#label = 'InstrumentGauge';\n }\n\n // Create an object to store all props\n //Object.defineProperty(this, '_data', { value: { } });\n\n //@@ change all properties to use this pattern\n\n /*\n\t\t// https://github.com/Asymmetrik/node-fhir-server-core/blob/master/packages/node-fhir-server-core/src/server/resources/4_0_1/schemas/account.js\n\n\t\t// Create an object to store all props\n\t\tObject.defineProperty(this, '__data', { value: {} });\n\n\t\tObject.defineProperty(this, '_value', {\n\t\t\tenumerable: true,\n\t\t\tget: () => this.__data._value,\n\t\t\tset: (value) => {\n\t\t\tif (value === undefined || value === null) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.__data._value = value;\n\t\t\t}\n\t\t});\n\t\t*/\n\n // Define a default non-writable resourceType property\n /*\n\t\tObject.defineProperty(this, '_reportValue', {\n\t\t\tenumerable: true,\n\t\t\tget: () => this.GetFormatted()\n\t\t});\n\n\t\tObject.defineProperty(this, '_serialValue', {\n\t\t\tenumerable: true,\n\t\t\tget: () => this.GetSerialValue(),\n\t\t\tset: (value) => { this.SetSerialValue(value); }\n\t\t});\n\t\t*/\n }\n\n public [GaugeTypes.GAUGE_TYPE]: GaugeTypes = GaugeTypes.INSTRUMENT_OBJECT // Default Gauge type\n val?: number | string[] | JSONObject\n\n WithLabel(label: string) {\n this.label = label;\n return this;\n }\n\n DefineCopyProperties(propertyNames: string[]): void {\n propertyNames.forEach(propertyName => {\n Object.defineProperty(this, propertyName, {\n enumerable: true,\n get: () => this.#data[propertyName],\n set: (value) => {\n if (value === undefined) {\n return;\n }\n this.#data[propertyName] = value;\n }\n });\n });\n }\n\t\n GetNumber(val: number): number {\n if (Number.isInteger(val)) {\n return val;\n } else {\n return Math.round((val + Number.EPSILON) * 100) / 100;\n }\n }\n\n get options(): InstrumentBaseOptions | null {\n return this.#options;\n }\n\n set options(optionsValue: InstrumentBaseOptions | null) {\n this.#options = optionsValue;\n }\n\n get label(): string {\n return this.#label;\n }\n\n set label(labelValue: string) {\n this.#label = labelValue;\n }\n\n StopTimer(): void\n {\n //\tOverride in sub class if timers are used ...\n }\n\n ProcessTelemetry(telemetry: InstrumentBaseTelemetry): void {\n throw new Error(`Must override in extended class: [ProcessTelemetry]: [${telemetry}].`);\n }\n\n /*\n\ttoJSON()\n\t{\n\t\treturn this._serialValue;\n\t}\n\t*/\n\n /*\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols\n\t[Symbol.iterator]() {\n\t\t// Use a new index for each iterator. This makes multiple\n\t\t// iterations over the iterable safe for non-trivial cases,\n\t\t// such as use of break or nested looping over the same iterable.\n\t\tlet index = 0;\n\t\n\t\treturn {\n\t\t\tnext: () => {\n\t\t\t\tif (index < 1) {\n\t\t\t\t\treturn {value: this.GetFormatted(), done: false}\n\t\t\t\t} else {\n\t\t\t\t\treturn {done: true}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t*/\n}\n\nexport type Instruments = Partial<Record<Gauge, InstrumentBase>>\n","import _cloneDeep from 'lodash.clonedeep'\n\nimport { InstrumentBase, InstrumentBaseOptions, InstrumentBaseTelemetry } from './instrumentBase.js'\nimport { GaugeTypes } from '../instrumentDefs.js'\nimport { JSONObject, isNode } from '@nsshunt/stsutils'\n\nexport interface VelocityReportValue extends JSONObject {\n\tval: number\n\tvalue: string\n\tvf: string\n\tdelta: number\n\tmaxVelocity: number\n\tvelocity: number\n\tva: number\n}\n\nexport class InstrumentVelocityOptions extends InstrumentBaseOptions {\n interval?: number\n valStackMaxLength?: number\n maxAverageValStack?: number\n maxAverageIterations?: number\n fromJSON?: InstrumentVelocity\n initValue?: number\n autoComputeVelocity?: boolean\n velocityTimeDiff?: number\n vaTimeDiff?: number\n autoComputeVelocityTimeout?: number\n}\n\nexport class InstrumentVelocityTelemetry extends InstrumentBaseTelemetry {\n val?: number\n Inc?: number\n}\n\ndeclare interface IDataPoint {\n\ttimeStamp: number\n\tcount: number\n}\n\ndeclare interface IVelocityDataPoint {\n\tval: number\n\tcountDiff: number\n\ttimeDiff: number\n\tdeltaVal: number\n\tdeltaCountDiff: number\n\tdeltaTimeDiff: number\n}\n\nexport class InstrumentVelocity extends InstrumentBase\n{\n // eslint-disable-next-line @/no-unused-private-class-members\n #val = 0;\n #interval: NodeJS.Timeout | null = null;\n #timeoutComputeVelocity: NodeJS.Timeout | null = null;\n // eslint-disable-next-line @/no-unused-private-class-members\n #lastVelocity = 0;\n #delta = 0;\n #maxVelocity = 0;\n #timerInterval = 0;\n #copy = false;\n #velocity = 0;\n #velocityVal = 0;\n #valStack: IDataPoint[] = [ ];\n #averageValStack: number[][] = [];\n #maxAverageValStack = 0;\n #maxAverageIterations = 0;\n // eslint-disable-next-line @/no-unused-private-class-members\n #valStackMaxLength = 0;\n #valStackAverage = 0.0;\n #timeStamp = 0;\n #maxTimeDiff = 0;\n #vaTimeDiff = 0;\n #velocityTimeDiff = 0;\n #autoComputeVelocity = false;\n #autoComputeVelocityTimeout = 0; // 50ms to auto computer after an update when not in auto compute mode.\n #countDiff = 0;\n #timeDiff = 0;\n #deltaCountDiff = 0;\n #deltaTimeDif = 0;\n #minTimeForReporting = 0;\n #averageVelocity: number[] = []\n\n // timeWindow = Number of intervals to use as the sliding time window same size. Uses average value within the time window. Larger window produces a smooth (more laggy) curve. Shorter time\n // window may be \"spikey\" depending on the volatility of the data being recorded.\n constructor(options: InstrumentVelocityOptions = { }) {\n super(options);\n\n if (typeof options.label === 'undefined') {\n this.label = 'InstrumentVelocity';\n } else {\n this.label = options.label;\n }\n\n if (typeof options.interval === 'undefined') {\n this.#timerInterval = 1000;\n } else {\n this.#timerInterval = options.interval;\n }\n\n if (typeof options.valStackMaxLength === 'undefined') {\n this.#valStackMaxLength = 100;\n } else {\n this.#valStackMaxLength = options.valStackMaxLength;\n }\n\n if (typeof options.fromJSON === 'undefined') {\n this.#copy = false;\n } else {\n this.#copy = true;\n }\n\n if (typeof options.autoComputeVelocity === 'undefined') {\n this.#autoComputeVelocity = false;\n } else {\n this.#autoComputeVelocity = options.autoComputeVelocity;\n }\n\n if (typeof options.maxAverageValStack === 'undefined') {\n this.#maxAverageValStack = 5;\n } else {\n this.#maxAverageValStack = options.maxAverageValStack;\n }\n\n if (typeof options.maxAverageIterations === 'undefined') {\n this.#maxAverageIterations = 3;\n } else {\n this.#maxAverageIterations = options.maxAverageIterations;\n }\n\n if (typeof options.velocityTimeDiff === 'undefined') {\n this.#velocityTimeDiff = 5000;\n } else {\n this.#velocityTimeDiff = options.velocityTimeDiff;\n }\n\n if (typeof options.vaTimeDiff === 'undefined') {\n this.#vaTimeDiff = 10000;\n } else {\n this.#vaTimeDiff = options.vaTimeDiff;\n }\n\n if (typeof options.autoComputeVelocityTimeout === 'undefined') {\n this.#autoComputeVelocityTimeout = 50;\n } else {\n this.#autoComputeVelocityTimeout = options.autoComputeVelocityTimeout;\n }\n\n this.#maxTimeDiff = this.#vaTimeDiff * 2;\n this.#minTimeForReporting = this.#vaTimeDiff + 2000;\n\n\n Object.defineProperty(this, GaugeTypes.GAUGE_TYPE, {\n enumerable: true,\n get: () => GaugeTypes.INSTRUMENT_VELOCITY\n });\n\n if (this.#copy) {\n this.DefineCopyProperties([\n 'val', 'maxVelocity', 'delta', 'velocity', 'va', 'timeStamp',\n 'deltaTimeDif', 'deltaCountDiff', 'timeDiff', 'countDiff', 'averageVelocity'\n ]);\n } else {\n Object.defineProperty(this, 'val', {\n enumerable: true,\n get: () => this.#GetVal(),\n set: (value) => { this.#SetVal(value); }\n });\n\n Object.defineProperty(this, 'maxVelocity', {\n enumerable: true,\n get: () => this.#GetMaxVelocity()\n });\n\n Object.defineProperty(this, 'delta', {\n enumerable: true,\n get: () => this.#GetDelta()\n });\n\n Object.defineProperty(this, 'velocity', {\n enumerable: true,\n get: () => this.#GetVelocity()\n });\n\n Object.defineProperty(this, 'va', {\n enumerable: true,\n get: () => this.#GetVelocityStackAverage()\n });\n\n Object.defineProperty(this, 'timeStamp', {\n enumerable: true,\n get: () => this.#GetTimeStamp()\n });\n\n Object.defineProperty(this, 'countDiff', {\n enumerable: true,\n get: () => this.#GetCountDiff()\n });\n\n Object.defineProperty(this, 'timeDiff', {\n enumerable: true,\n get: () => this.#GetTimeDiff()\n });\n\n Object.defineProperty(this, 'deltaCountDiff', {\n enumerable: true,\n get: () => this.#GetDeltaCountDiff()\n });\n\n Object.defineProperty(this, 'deltaTimeDif', {\n enumerable: true,\n get: () => this.#GetDeltaTimeDif()\n });\n\n Object.defineProperty(this, 'averageVelocity', {\n enumerable: true,\n get: () => this.#GetAverageVelocity()\n });\n\n if (this.#timerInterval > 0 && this.#autoComputeVelocity === false) {\n this._StartTimer();\n }\n }\n\n if (typeof options.initValue !== 'undefined') {\n this.val = options.initValue;\n }\n\n // Set copy values now that we have defined our properties\n if (typeof options.fromJSON !== 'undefined') {\n const result = _cloneDeep(options.fromJSON);\n this.val = result.val;\n this.velocity = result.velocity;\n this.maxVelocity = result.maxVelocity;\n this.delta = result.delta;\n this.va = result.va;\n this.timeStamp = result.timeStamp;\n this.countDiff = result.countDiff;\n this.timeDiff = result.timeDiff;\n this.deltaCountDiff = result.deltaCountDiff;\n this.deltaTimeDif = result.deltaTimeDif;\n this.averageVelocity = _cloneDeep(result.averageVelocity);\n }\n }\n\n public readonly maxVelocity: number = 0;\n public readonly delta: number = 0;\n public readonly velocity: number = 0;\n public readonly va: number = 0;\n public readonly timeStamp: number = 0;\n public readonly countDiff: number = 0;\n public readonly timeDiff: number = 0;\n public readonly deltaCountDiff: number = 0;\n public readonly deltaTimeDif: number = 0;\n public readonly averageVelocity: number[] = [];\n public val = 0;\n\n WithValStackMaxLength(valStackMaxLength: number): InstrumentVelocity {\n this.#valStackMaxLength = valStackMaxLength;\n this.#valStack = [ ];\n return this;\n }\n\n private _StartTimer(): void\n {\n this.#interval = setInterval(() => {\n this.#ComputeVelocity();\n\n let pushVal = this.#velocity;\n for (let i=0; i < this.#maxAverageIterations; i++) {\n if (!this.#averageValStack[i]) {\n this.#averageValStack[i] = [ ];\n }\n this.#averageValStack[i].push(pushVal);\n if (this.#averageValStack[i].length > this.#maxAverageValStack) {\n this.#averageValStack[i].shift();\n }\n pushVal = this.#averageValStack[i].reduce((prev, current) => prev + current) / this.#averageValStack[i].length;\n this.#averageVelocity[i] = pushVal;\n }\n }, this.#timerInterval);\n\n // If running in node ...\n if (isNode) {\n this.#interval.unref();\n }\n // https://httptoolkit.tech/blog/unblocking-node-with-unref/\n }\n\n #ComputeVelocityByTimeDiff(checkTimeDiff: number, checkDeltaTimeDiff: number): IVelocityDataPoint {\n // As long as we have at least two data points ...\n let val = 0.0;\n let deltaVal = 0.0;\n let countDiff = 0;\n let timeDiff = 0;\n let deltaCountDiff = 0;\n let deltaTimeDiff = 0;\n\n if (this.#valStack.length > 1 && (this.#valStack[this.#valStack.length-1].timeStamp - this.#valStack[0].timeStamp) > this.#minTimeForReporting) {\n // Get the current data point\n const dp: IDataPoint = this.#valStack[this.#valStack.length-1];\n // Compute the stack position for the first entry where the diff is >= timeDiff\n let timeDiffPos = -1;\n let deltaDiffPos = -1;\n for (let i = this.#valStack.length-2; i > -1; i--) {\n if (timeDiffPos === -1 && (this.#timeStamp - this.#valStack[i].timeStamp) >= checkTimeDiff) {\n timeDiffPos = i;\n if (checkDeltaTimeDiff === 0) {\n break;\n }\n }\n if (deltaDiffPos === -1 && (this.#timeStamp - this.#valStack[i].timeStamp) >= checkDeltaTimeDiff) {\n deltaDiffPos = i;\n }\n if (timeDiffPos !== -1 && deltaDiffPos !== -1) {\n break;\n }\n }\n if (timeDiffPos > -1) {\n countDiff = dp.count - this.#valStack[timeDiffPos].count;\n if (countDiff > 0) {\n timeDiff = dp.timeStamp - this.#valStack[timeDiffPos].timeStamp;\n if (timeDiff > 0.0) {\n // Get velocity per second\n val = (1000.0 / timeDiff) * countDiff;\n } else {\n val = 0;\n }\n } else {\n val = 0; // We have the same count for the desired timeDiff time span.\n }\n } else {\n val = 0; // We don't yet have a value for the desired timeDiff time span.\n }\n\n if (deltaDiffPos > -1) {\n deltaCountDiff = this.#valStack[timeDiffPos].count - this.#valStack[deltaDiffPos].count;\n if (deltaCountDiff > 0) {\n deltaTimeDiff = this.#valStack[timeDiffPos].timeStamp - this.#valStack[deltaDiffPos].timeStamp\n if (deltaTimeDiff > 0.0) {\n // Get velocity per second\n deltaVal = (1000.0 / deltaTimeDiff) * deltaTimeDiff;\n } else {\n deltaVal = 0;\n }\n } else {\n deltaVal = 0; // We have the same count for the desired deltaTimeDiff time span.\n }\n } else {\n deltaVal = 0; // We don't yet have a value for the desired deltaTimeDiff time span.\n }\n }\n return {\n val,\n countDiff,\n timeDiff,\n deltaVal,\n deltaCountDiff,\n deltaTimeDiff\n }\n }\n\n #ComputeVelocity(): void {\n const dp: IDataPoint = {\n timeStamp: performance.now(),\n count: this.#velocityVal\n }\n this.#valStack.push(dp);\n\n this.#timeStamp = dp.timeStamp;\n\n while (this.#valStack.length > 0 && ((this.#timeStamp - this.#valStack[0].timeStamp) > this.#maxTimeDiff)) {\n this.#valStack.shift();\n }\n\n const valStackAverageDataPoint = this.#ComputeVelocityByTimeDiff(this.#vaTimeDiff, 0);\n this.#valStackAverage = valStackAverageDataPoint.val;\n\n const velocityDataPoint = this.#ComputeVelocityByTimeDiff(this.#velocityTimeDiff, this.#velocityTimeDiff * 2);\n this.#velocity = velocityDataPoint.val;\n this.#delta = velocityDataPoint.val - velocityDataPoint.deltaVal;\n\n this.#countDiff = velocityDataPoint.countDiff\n this.#timeDiff = velocityDataPoint.timeDiff\n this.#deltaCountDiff = velocityDataPoint.deltaCountDiff\n this.#deltaTimeDif = velocityDataPoint.deltaTimeDiff\n\n this.#lastVelocity = this.#velocity;\n if (this.#velocity > this.#maxVelocity) {\n this.#maxVelocity = this.#velocity;\n }\n }\n\n #SetupAutoComputeVelocity(): void {\n if (this.#timeoutComputeVelocity) {\n clearTimeout(this.#timeoutComputeVelocity);\n }\n this.#timeoutComputeVelocity = setTimeout(() => {\n this.#ComputeVelocity();\n }, this.#autoComputeVelocityTimeout);\n\n // Note: We do not check if running in node for an unref() because unref() is expensive and this is being\n // called for each change in val. The value of autoComputeVelocityTimeout (around 50ms) is very small and should not prevent application\n // termination issues.\n }\n\n #GetVelocityStackAverage(): number {\n return this.GetNumber(this.#valStackAverage);\n }\n\n Inc(incVal = 1): void {\n this.#velocityVal += incVal;\n if (this.#autoComputeVelocity) {\n this.#ComputeVelocity();\n } else {\n this.#SetupAutoComputeVelocity();\n }\n }\n\n #GetVal(): number {\n return this.GetNumber(this.#velocityVal);\n }\n\n #SetVal(updatedValue: number): void {\n this.#velocityVal = updatedValue;\n if (this.#autoComputeVelocity) {\n this.#ComputeVelocity();\n } else {\n this.#SetupAutoComputeVelocity();\n }\n }\n\n #GetVelocity(): number {\n return this.GetNumber(this.#velocity);\n }\n\n #GetMaxVelocity(): number {\n return this.GetNumber(this.#maxVelocity);\n }\n\n #GetDelta(): number {\n return this.GetNumber(this.#delta);\n }\n\n #GetTimeStamp(): number {\n return this.GetNumber(this.#timeStamp);\n }\n\n #GetCountDiff(): number {\n return this.GetNumber(this.#countDiff);\n }\n\n #GetTimeDiff(): number {\n return this.GetNumber(this.#timeDiff);\n }\n\n #GetDeltaCountDiff(): number {\n return this.GetNumber(this.#deltaCountDiff);\n }\n\n #GetDeltaTimeDif(): number {\n return this.GetNumber(this.#deltaTimeDif);\n }\n\n #GetAverageVelocity(): number[] {\n return this.#averageVelocity;\n }\n\n override StopTimer(): void {\n if (this.#interval !== null) {\n clearTimeout(this.#interval);\n this.#interval = null;\n }\n }\n\n override ProcessTelemetry(telemetry: InstrumentVelocityTelemetry): void {\n if (telemetry.Inc !== undefined) {\n this.Inc(telemetry.Inc);\n }\n if (telemetry.val !== undefined) {\n this.val = telemetry.val;\n }\n }\n}\n","import _cloneDeep from 'lodash.clonedeep'\n\nimport { InstrumentBase, InstrumentBaseOptions, InstrumentBaseTelemetry } from './instrumentBase.js'\nimport { GaugeTypes } from '../instrumentDefs.js'\n\nimport { JSONObject } from '@nsshunt/stsutils'\n\nexport interface HistogramReportValue extends JSONObject {\n\tval: number\n\thist: HistogramDataElement[]\n\tvf: string\n}\n\nexport enum HistogramDataElementPos {\n\tval = 0,\n\tlabel = 1,\n\tbreakPoint = 2\n}\n\nexport type HistogramDataElement = [\n\tval: number,\n\tlabel: string,\n\tbreakPoint: number\n]\n\nexport class InstrumentHistogramOptions extends InstrumentBaseOptions {\n histogramData?: number[]\n initValue?: number\n fromJSON?: InstrumentHistogram\n}\n\nexport class InstrumentHistogramTelemetry extends InstrumentBaseTelemetry {\n val?: number\n}\n\nexport class InstrumentHistogram extends InstrumentBase\n{\n #histogramData: HistogramDataElement[] = [ ];\n #val = 0;\n #copy = false;\n\t\n constructor(options: InstrumentHistogramOptions = { }) {\n super(options);\n\n if (typeof options.label === 'undefined') {\n this.label = 'InstrumentHistogram';\n } else {\n this.label = options.label;\n }\n\n let histogramData: number[] | null = null;\n if (typeof options.histogramData === 'undefined') {\n histogramData = null;\n } else {\n histogramData = options.histogramData;\n }\n\n if (typeof options.fromJSON === 'undefined') {\n this.#copy = false;\n } else {\n this.#copy = true;\n }\n\n if (histogramData === null) {\n this.#histogramData = [\n [ 0, \"10\", 10 ],\n [ 0, \"20\", 20 ],\n [ 0, \"50\", 50 ],\n [ 0, \"100\", 100 ],\n [ 0, \"1000\", 1000 ],\n [ 0, \"5000\", 5000 ],\n [ 0, \"EE\", 0 ]\n ]\n } else if (Array.isArray(histogramData)) {\n this.#histogramData = [ ];\n for (let i=0; i < histogramData.length; i++) {\n this.#histogramData.push([0, '' + histogramData[i], parseFloat(histogramData[i].toString())]);\n }\n this.#histogramData.push([ 0, \"EE\", 0 ]);\n } else {\n throw new Error(`Passed [${histogramData}] must be an array.`);\n }\n\n Object.defineProperty(this, GaugeTypes.GAUGE_TYPE, {\n enumerable: true,\n get: () => GaugeTypes.INSTRUMENT_HISTOGRAM\n });\n\n if (this.#copy) {\n this.DefineCopyProperties([\n 'val', 'hist' \n ]);\n } else {\n Object.defineProperty(this, 'val', {\n enumerable: true,\n get: () => this.#GetVal(),\n set: (value) => { this.#SetVal(value); }\n });\n Object.defineProperty(this, 'hist', {\n enumerable: true,\n get: () => this.#GetHistogramData(),\n set: (value) => { this.#SetHistogramData(value); }\n });\n }\n\n if (typeof options.initValue !== 'undefined') {\n this.#val = options.initValue;\n }\n\n // Set copy values now that we have defined our properties\n if (typeof options.fromJSON !== 'undefined') {\n const result = _cloneDeep(options.fromJSON);\n this.#val = result.val as number;\n this.hist = result.hist;\n }\n }\n\n public hist: HistogramDataElement[] = [ ];\n public val = 0;\n\n WithInitVal(initVal: number): InstrumentHistogram {\n this.#val = initVal;\n return this;\n }\n\n ResetHistogramData(): void {\n for (let i=0; i < this.hist.length; i++) {\n this.hist[i][0] = 0;\n }\n }\n\n AddObservation(updateValue: number): void {\n if (this.#copy) {\n throw new Error('Cannot add observations from the copy version of this class.');\n }\n let i = 0;\n for (; i < this.#histogramData.length-1; i++)\n {\n if (updateValue <= this.#histogramData[i][HistogramDataElementPos.breakPoint])\n {\n this.#histogramData[i][HistogramDataElementPos.val]++;\n return;\n }\n }\n this.#histogramData[i][HistogramDataElementPos.val]++;\n }\n\n #GetVal(): number {\n return this.GetNumber(this.#val);\n }\n\n #SetVal(value: number) {\n this.#val = value;\n this.AddObservation(value);\n }\n\n get\tformattedHistogramData(): string {\n let retVal = '';\n let sep = '';\n for (let i=0; i < this.hist.length; i++) {\n retVal += sep + '[' + (this.hist[i][HistogramDataElementPos.val] + '/' + this.hist[i][HistogramDataElementPos.label]).padStart(10, ' ') + ']';\n sep = ' ';\n }\n return retVal;\n }\n\n #GetHistogramData(): HistogramDataElement[] {\n return this.#histogramData;\n }\n\n #SetHistogramData(value: HistogramDataElement[]) {\n this.#histogramData = value;\n }\n\n static AddHistogramDataEx(histoA: InstrumentHistogram | null, histoB: InstrumentHistogram): InstrumentHistogram {\n if (histoA === null) {\n return _cloneDeep(histoB);\n }\n\n const result = _cloneDeep(histoA);\n const histogramAData = result.hist;\n const histogramBData = histoB.hist;\n\n if (histogramAData.length !== histogramBData.length) {\n throw new Error('Invalid HistogramData. HistogramData bucket lengths must be the same.')\n }\n for (let i=0; i < histogramAData.length; i++)\n {\n if (histogramAData[i][HistogramDataElementPos.breakPoint] !== histogramBData[i][HistogramDataElementPos.breakPoint]) {\n throw new Error(`Invalid HistogramData. HistogramData bucket break-point at index [${i}] must be the same.`)\n }\n if (histogramAData[i][HistogramDataElementPos.label] !== histogramBData[i][HistogramDataElementPos.label]) {\n throw new Error(`Invalid HistogramData. HistogramData bucket label at index [${i}] must be the same.`)\n }\n histogramAData[i][HistogramDataElementPos.val] += histogramBData[i][HistogramDataElementPos.val];\n }\n\n return result;\n }\n\n /**\n\t * Adds a value object (from GetFormatted()) to this instance.\n\t * @param {*} value \n\t */\n AddHistogramData(histogramData: InstrumentHistogram): void {\n if (histogramData === null) {\n return;\n }\n\n if (this.hist.length !== histogramData.hist.length) {\n throw new Error('Invalid HistogramData. HistogramData bucket lengths must be the same.')\n }\n for (let i=0; i < histogramData.hist.length; i++)\n {\n if (this.hist[i][HistogramDataElementPos.breakPoint] !== histogramData.hist[i][HistogramDataElementPos.breakPoint]) {\n throw new Error(`Invalid HistogramData. HistogramData bucket break-point at index [${i}] must be the same.`)\n }\n if (this.hist[i][HistogramDataElementPos.label] !== histogramData.hist[i][HistogramDataElementPos.label]) {\n throw new Error(`Invalid HistogramData. HistogramData bucket label at index [${i}] must be the same.`)\n }\n this.hist[i][HistogramDataElementPos.val] += histogramData.hist[i][HistogramDataElementPos.val];\n }\n }\n\t\n override ProcessTelemetry(telemetry: InstrumentHistogramTelemetry): void {\n if (telemetry.val !== undefined) {\n this.val = telemetry.val;\n }\n }\n}\n","/* eslint @typescript-eslint/no-explicit-any: 0 */ // --> OFF\nimport _cloneDeep from 'lodash.clonedeep'\n\nimport { InstrumentBase, InstrumentBaseOptions, InstrumentBaseTelemetry } from './instrumentBase.js'\nimport { GaugeTypes } from '../instrumentDefs.js'\n\nimport { JSONObject, ISTSLogger } from '@nsshunt/stsutils'\n\nexport interface LogReportValue extends JSONObject {\n\tval: string[]\n}\n\nexport class InstrumentLogOptions extends InstrumentBaseOptions {\n maxSize?: number\n useLatestMessages?: boolean\n consoleLogging?: boolean\n instrumentLogging?: boolean\n winstonLogging?: boolean\n fromJSON?: InstrumentLog\n initValue?: string[]\n logger?: ISTSLogger\n}\n\nexport class InstrumentLogTelemetry extends InstrumentBaseTelemetry {\n Append?: string[]\n LogMessage?: string\n val?: string[]\n ResetLog?: boolean\n}\n\nexport class InstrumentLog extends InstrumentBase implements ISTSLogger\n{\n #messages: string[] = [ ];\n #readPos = 0;\n #maxSize = 200; // Max length of cached log messages\n #copy = false;\n #useLatestMessages = false;\n #consoleLogging = false;\n #instrumentLogging = true;\n #winstonLogging = false;\n #stsLogger: ISTSLogger | undefined;\n\n constructor(options: InstrumentLogOptions = { })\n {\n super(options);\n\n if (typeof options.label === 'undefined') {\n this.label = 'InstrumentLog';\n } else {\n this.label = options.label;\n }\n\n if (typeof options.maxSize === 'undefined') {\n this.#maxSize = 200;\n } else {\n this.#maxSize = options.maxSize;\n }\n\n if (typeof options.fromJSON === 'undefined') {\n this.#copy = false;\n } else {\n this.#copy = true;\n }\n\n if (typeof options.useLatestMessages === 'undefined') {\n this.#useLatestMessages = false;\n } else {\n this.#useLatestMessages = options.useLatestMessages;\n }\n\n if (typeof options.consoleLogging === 'undefined') {\n this.#consoleLogging = false;\n } else {\n this.#consoleLogging = options.consoleLogging;\n }\n\n if (typeof options.instrumentLogging === 'undefined') {\n this.#instrumentLogging = true;\n } else {\n this.#instrumentLogging = options.instrumentLogging;\n }\n\n if (typeof options.winstonLogging === 'undefined') {\n this.#winstonLogging = false;\n } else {\n this.#winstonLogging = options.winstonLogging;\n }\n\n Object.defineProperty(this, GaugeTypes.GAUGE_TYPE, {\n enumerable: true,\n get: () => GaugeTypes.INSTRUMENT_LOG\n });\n\n if (this.#copy) {\n this.DefineCopyProperties([\n 'val' \n ]);\n } else {\n Object.defineProperty(this, 'val', {\n enumerable: true,\n get: () => _cloneDeep(this.#GetVal()),\n set: (value) => { this.#SetVal(value); }\n });\n }\n\n if (typeof options.initValue !== 'undefined') {\n this.val = options.initValue;\n }\n\n // Set copy values now that we have defined our properties\n if (typeof options.fromJSON !== 'undefined') {\n const result = _cloneDeep(options.fromJSON);\n this.val = result.val;\n }\n }\n\n public val: string[] = [];\n\n WithMaxSize(maxSize: number): InstrumentLog {\n this.#maxSize = maxSize;\n return this;\n }\n\n WithUseLatestMessages(useLatestMessages: boolean): InstrumentLog {\n this.#useLatestMessages = useLatestMessages;\n return this;\n }\n\n WithConsoleLogging(consoleLogging: boolean): InstrumentLog {\n this.#consoleLogging = consoleLogging;\n return this;\n }\n\n WithInstrumentLogging(instrumentLogging: boolean): InstrumentLog {\n this.#instrumentLogging = instrumentLogging;\n return this;\n }\n\n get MaxSize(): number {\n return this.#maxSize;\n }\n\n set MaxSize(maxSize: number) {\n this.#maxSize = maxSize;\n }\n\n #DumpToConsole(): void\n {\n const logReport = this.GetMessagesSinceLastRead();\n for (let i=0; i < logReport.length; i++) {\n console.log(logReport[i]);\n }\n }\n\n get consoleLogging(): boolean {\n return this.#consoleLogging;\n }\n\n set consoleLogging(value: boolean) {\n this.#consoleLogging = value;\n if (value === true) {\n this.#DumpToConsole();\n }\n }\n\n get instrumentLogging(): boolean {\n return this.#instrumentLogging;\n }\n\n set instrumentLogging(value: boolean) {\n this.#instrumentLogging = value;\n }\n\n Append(messageArray: string[]): void {\n for (let i=0; i < messageArray.length; i++) {\n this.LogMessage(messageArray[i]);\n }\n }\n\n error(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.error(message);\n }\n\n warn(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.warn(message);\n }\n\n info(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.info(message);\n }\n\n http(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.http(message);\n }\n\n verbose(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.verbose(message);\n }\n\n debug(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.debug(message);\n }\n\n silly(message: any): void {\n if (this.#winstonLogging && this.#stsLogger) this.#stsLogger.silly(message);\n }\n\n LogMessage(message: string): void {\n if (this.#copy) {\n throw new Error('Cannot add log messages from the copy version of this class.');\n }\n if (this.#consoleLogging === true) {\n console.log(message);\n }\n\n if (this.#instrumentLogging === false) {\n return;\n }\n\n this.#messages.push(message);\n if (this.#messages.length > this.#maxSize) {\n this.#messages.shift();\n this.#readPos = (this.#readPos > 0 ? this.#readPos-1 : 0);\n }\n }\n\n #GetVal(): string[]\n {\n if (this.#useLatestMessages) {\n return this.GetMessagesSinceLastRead();\n } else {\n return this.#messages;\n }\n }\n\n #SetVal(updatedValue: string[]): void\n {\n this.#messages = updatedValue;\n this.#readPos = 0;\n }\n\n GetMessagesNoUpdate(): string[] {\n return this.#messages.slice(this.#readPos);\n }\n\n // This will return only those messages that have been added since the last read\n GetMessagesSinceLastRead(): string[]\n {\n const retVal = this.#messages.slice(this.#readPos);\n this.#readPos = this.#messages.length;\n return retVal;\n }\n\n ResetLog(): void\n {\n this.#messages = [ ];\n this.#readPos = 0;\n }\n\n override ProcessTelemetry(telemetry: InstrumentLogTelemetry): void {\n if (telemetry.val !== undefined) {\n this.val = telemetry.val;\n }\n if (telemetry.Append !== undefined) {\n this.Append(telemetry.Append);\n }\n if (telemetry.LogMessage !== undefined) {\n this.LogMessage(telemetry.LogMessage);\n }\n if (telemetry.ResetLog !== undefined && telemetry.ResetLog === true) {\n this.ResetLog();\n }\n }\n}\n","//import * as ph from 'node:perf_hooks'; //@@ need to test - may not work in browser\n\nimport _cloneDeep from 'lodash.clonedeep'\n\nimport { InstrumentBase, InstrumentBaseOptions, InstrumentBaseTelemetry } from './instrumentBase.js'\nimport { GaugeTypes } from '../instrumentDefs.js'\n\nimport { JSONObject } from '@nsshunt/stsutils'\n\n// Potentially, look @ this module...\n// https://www.npmjs.com/package/performance-now\n\nexport interface TimerReportValue extends JSONObject {\n\tval: number\n\tvalue: string\n\tvf: string\n\ts: string\n}\n\nexport class InstrumentTimerOptions extends InstrumentBaseOptions {\n fromJSON?: InstrumentTimerGauge\n initValue?: number\n}\n\nexport class InstrumentTimerTelemetry extends InstrumentBaseTelemetry {\n val?: number\n Pause?: boolean\n Resume?: boolean\n Reset?: boolean\n}\n\nexport class InstrumentTimerGauge extends InstrumentBase\n{\n #start = 0;\n #copy = false;\n #pauseVal = 0;\n\n constructor(options: InstrumentTimerOptions = { }) {\n super(options)\n\n if (typeof options.label === 'undefined') {\n this.label = 'InstrumentTimerGauge';\n } else {\n this.label = options.label;\n }\n\n if (typeof options.fromJSON === 'undefined') {\n this.#copy = false;\n } else {\n this.#copy = true;\n }\n\n Object.defineProperty(this, GaugeTypes.GAUGE_TYPE, {\n enumerable: true,\n get: () => GaugeTypes.INSTRUMENT_TIMER\n });\n\n if (this.#copy) {\n this.DefineCopyProperties([\n 'val' \n ]);\n } else {\n Object.defineProperty(this, 'val', {\n enumerable: true,\n get: () => this.#GetVal(),\n set: (value) => { this.#SetVal(value); }\n });\n }\n\n if (typeof options.initValue !== 'undefined') {\n this.val = options.initValue;\n }\n\n // Set copy values now that we have defined our properties\n if (typeof options.fromJSON !== 'undefined') {\n const result = _cloneDeep(options.fromJSON);\n this.val = result.val;\n }\n\n this.Reset();\n }\n\n public val = 0;\n\n // Take a snap shot of the current elapsed time. The 'clock' will still keep running.\n Pause(): void {\n this.#pauseVal = this.val;\n }\n\n Resume(): void {\n this.#pauseVal = 0;\n }\n\n Reset(): void {\n this.#start = performance.now();\n }\n\n #GetVal(): number {\n if (this.#pauseVal !== 0) {\n return this.GetNumber(this.#pauseVal);\n }\n return this.GetNumber(performance.now() - this.#start);\n }\n\t\n #SetVal(updatedValue: number): void {\n // Reset the start time based on the supplied duration\n this.#start = performance.now() - updatedValue;\n }\n\n get start(): number {\n return this.#start;\n }\n\n /*\n #convertMS(ms: number): string {\n //let d, h, m, s;\n let s = Math.floor(ms / 1000);\n let m = Math.floor(s / 60);\n s = s % 60;\n let h = Math.floor(m / 60);\n m = m % 60;\n const d = Math.floor(h / 24);\n h = h % 24;\n\t\n const pad: (n: number) => string = function(n: number) { return n < 10 ? '0' + n : n.toString(); };\n\t\n return (d + '.' + pad(h) + ':' + pad(m) + ':' + pad(s)).padStart(12);\n }\n */ \n\n override ProcessTelemetry(telemetry: InstrumentTimerTelemetry): void {\n if (telemetry.val !== undefined) {\n this.val = telemetry.val;\n }\n if (telemetry.Pause !== undefined && telemetry.Pause === true) {\n this.Pause();\n }\n if (telemetry.Resume !== undefined && telemetry.Resume === true) {\n this.Resume();\n }\n if (telemetry.Reset !== undefined && telemetry.Reset === true) {\n this.Reset();\n }\n }\n}\n","/****\n * The MIT License\n *\n * Copyright (c) 2015 Marco Ziccardi\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n ****/\n(function (global, factory) {\n if (typeof define === 'function' && define.amd) {\n define('timsort', ['exports'], factory);\n } else if (typeof exports !== 'undefined') {\n factory(exports);\n } else {\n var mod = {\n exports: {}\n };\n factory(mod.exports);\n global.timsort = mod.exports;\n }\n})(this, function (exports) {\n 'use strict';\n\n exports.__esModule = true;\n exports.sort = sort;\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError('Cannot call a class as a function');\n }\n }\n\n var DEFAULT_MIN_MERGE = 32;\n\n var DEFAULT_MIN_GALLOPING = 7;\n\n var DEFAULT_TMP_STORAGE_LENGTH = 256;\n\n var POWERS_OF_TEN = [1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9];\n\n function log10(x) {\n if (x < 1e5) {\n if (x < 1e2) {\n return x < 1e1 ? 0 : 1;\n }\n\n if (x < 1e4) {\n return x < 1e3 ? 2 : 3;\n }\n\n return 4;\n }\n\n if (x < 1e7) {\n return x < 1e6 ? 5 : 6;\n }\n\n if (x < 1e9) {\n return x < 1e8 ? 7 : 8;\n }\n\n return 9;\n }\n\n function alphabeticalCompare(a, b) {\n if (a === b) {\n return 0;\n }\n\n if (~ ~a === a && ~ ~b === b) {\n if (a === 0 || b === 0) {\n return a < b ? -1 : 1;\n }\n\n if (a < 0 || b < 0) {\n if (b >= 0) {\n return -1;\n }\n\n if (a >= 0) {\n return 1;\n }\n\n a = -a;\n b = -b;\n }\n\n var al = log10(a);\n var bl = log10(b);\n\n var t = 0;\n\n if (al < bl) {\n a *= POWERS_OF_TEN[bl - al - 1];\n b /= 10;\n t = -1;\n } else if (al > bl) {\n b *= POWERS_OF_TEN[al - bl - 1];\n a /= 10;\n t = 1;\n }\n\n if (a === b) {\n return t;\n }\n\n return a < b ? -1 : 1;\n }\n\n var aStr = String(a);\n var bStr = String(b);\n\n if (aStr === bStr) {\n return 0;\n }\n\n return aStr < bStr ? -1 : 1;\n }\n\n function minRunLength(n) {\n var r = 0;\n\n while (n >= DEFAULT_MIN_MERGE) {\n r |= n & 1;\n n >>= 1;\n }\n\n return n + r;\n }\n\n function makeAscendingRun(array, lo, hi, compare) {\n var runHi = lo + 1;\n\n if (runHi === hi) {\n return 1;\n }\n\n if (compare(array[runHi++], array[lo]) < 0) {\n while (runHi < hi && compare(array[runHi], array[runHi - 1]) < 0) {\n runHi++;\n }\n\n reverseRun(array, lo, runHi);\n } else {\n while (runHi < hi && compare(array[runHi], array[runHi - 1]) >= 0) {\n runHi++;\n }\n }\n\n return runHi - lo;\n }\n\n function reverseRun(array, lo, hi) {\n hi--;\n\n while (lo < hi) {\n var t = array[lo];\n array[lo++] = array[hi];\n array[hi--] = t;\n }\n }\n\n function binaryInsertionSort(array, lo, hi, start, compare) {\n if (start === lo) {\n start++;\n }\n\n for (; start < hi; start++) {\n var pivot = array[start];\n\n var left = lo;\n var right = start;\n\n while (left < right) {\n var mid = left + right >>> 1;\n\n if (compare(pivot, array[mid]) < 0) {\n right = mid;\n } else {\n left = mid + 1;\n }\n }\n\n var n = start - left;\n\n switch (n) {\n case 3:\n array[left + 3] = array[left + 2];\n\n case 2:\n array[left + 2] = array[left + 1];\n\n case 1:\n array[left + 1] = array[left];\n break;\n default:\n while (n > 0) {\n array[left + n] = array[left + n - 1];\n n--;\n }\n }\n\n array[left] = pivot;\n }\n }\n\n function gallopLeft(value, array, start, length, hint, compare) {\n var lastOffset = 0;\n var maxOffset = 0;\n var offset = 1;\n\n if (compare(value, array[start + hint]) > 0) {\n maxOffset = length - hint;\n\n while (offset < maxOffset && compare(value, array[start + hint + offset]) > 0) {\n lastOffset = offset;\n offset = (offset << 1) + 1;\n\n if (offset <= 0) {\n offset = maxOffset;\n }\n }\n\n if (offset > maxOffset) {\n offset = maxOffset;\n }\n\n lastOffset += hint;\n offset += hint;\n } else {\n maxOffset = hint + 1;\n while (offset < maxOffset && compare(value, array[start + hint - offset]) <= 0) {\n lastOffset = offset;\n offset = (offset << 1) + 1;\n\n if (offset <= 0) {\n offset = maxOffset;\n }\n }\n if (offset > maxOffset) {\n offset = maxOffset;\n }\n\n var tmp = lastOffset;\n lastOffset = hint - offset;\n offset = hint - tmp;\n }\n\n lastOffset++;\n while (lastOffset < offset) {\n var m = lastOffset + (offset - lastOffset >>> 1);\n\n if (compare(value, array[start + m]) > 0) {\n lastOffset = m + 1;\n } else {\n offset = m;\n }\n }\n return offset;\n }\n\n function gallopRight(value, array, start, length, hint, compare) {\n var lastOffset = 0;\n var maxOffset = 0;\n var offset = 1;\n\n if (compare(value, array[start + hint]) < 0) {\n maxOffset = hint + 1;\n\n while (offset < maxOffset && compare(value, array[start + hint - offset]) < 0) {\n lastOffset = offset;\n offset = (offset << 1) + 1;\n\n if (offset <= 0) {\n offset = maxOffset;\n }\n }\n\n if (offset > maxOffset) {\n offset = maxOffset;\n }\n\n var tmp = lastOffset;\n lastOffset = hint - offset;\n offset = hint - tmp;\n } else {\n maxOffset = length - hint;\n\n while (offset < maxOffset && compare(value, array[start + hint + offset]) >= 0) {\n lastOffset = offset;\n offset = (offset << 1) + 1;\n\n if (offset <= 0) {\n offset = maxOffset;\n }\n }\n\n if (offset > maxOffset) {\n offset = maxOffset;\n }\n\n lastOffset += hint;\n offset += hint;\n }\n\n lastOffset++;\n\n while (lastOffset < offset) {\n var m = lastOffset + (offset - lastOffset >>> 1);\n\n if (compare(value, array[start + m]) < 0) {\n offset = m;\n } else {\n lastOffset = m + 1;\n }\n }\n\n return offset;\n }\n\n var TimSort = (function () {\n function TimSort(array, compare) {\n _classCallCheck(this, TimSort);\n\n this.array = null;\n this.compare = null;\n this.minGallop = DEFAULT_MIN_GALLOPING;\n this.length = 0;\n this.tmpStorageLength = DEFAULT_TMP_STORAGE_LENGTH;\n this.stackLength = 0;\n this.runStart = null;\n this.runLength = null;\n this.stackSize = 0;\n\n this.array = array;\n this.compare = compare;\n\n this.length = array.length;\n\n if (this.length < 2 * DEFAULT_TMP_STORAGE_LENGTH) {\n this.tmpStorageLength = this.length >>> 1;\n }\n\n this.tmp = new Array(this.tmpStorageLength);\n\n this.stackLength = this.length < 120 ? 5 : this.length < 1542 ? 10 : this.length < 119151 ? 19 : 40;\n\n this.runStart = new Array(this.stackLength);\n this.runLength = new Array(this.stackLength);\n }\n\n TimSort.prototype.pushRun = function pushRun(runStart, runLength) {\n this.runStart[this.stackSize] = runStart;\n this.runLength[this.stackSize] = runLength;\n this.stackSize += 1;\n };\n\n TimSort.prototype.mergeRuns = function mergeRuns() {\n while (this.stackSize > 1) {\n var n = this.stackSize - 2;\n\n if (n >= 1 && this.runLength[n - 1] <= this.runLength[n] + this.runLength[n + 1] || n >= 2 && this.runLength[n - 2] <= this.runLength[n] + this.runLength[n - 1]) {\n\n if (this.runLength[n - 1] < this.runLength[n + 1]) {\n n--;\n }\n } else if (this.runLength[n] > this.runLength[n + 1]) {\n break;\n }\n this.mergeAt(n);\n }\n };\n\n TimSort.prototype.forceMergeRuns = function forceMergeRuns() {\n while (this.stackSize > 1) {\n var n = this.stackSize - 2;\n\n if (n > 0 && this.runLength[n - 1] < this.runLength[n + 1]) {\n n--;\n }\n\n this.mergeAt(n);\n }\n };\n\n TimSort.prototype.mergeAt = function mergeAt(i) {\n var compare = this.compare;\n var array = this.array;\n\n var start1 = this.runStart[i];\n var length1 = this.runLength[i];\n var start2 = this.runStart[i + 1];\n var length2 = this.runLength[i + 1];\n\n this.runLength[i] = length1 + length2;\n\n if (i === this.stackSize - 3) {\n this.runStart[i + 1] = this.runStart[i + 2];\n this.runLength[i + 1] = this.runLength[i + 2];\n }\n\n this.stackSize--;\n\n var k = gallopRight(array[start2], array, start1, length1, 0, compare);\n start1 += k;\n length1 -= k;\n\n if (length1 === 0) {\n return;\n }\n\n length2 = gallopLeft(array[start1 + length1 - 1], array, start2, length2, length2 - 1, compare);\n\n if (length2 === 0) {\n return;\n }\n\n if (length1 <= length2) {\n this.mergeLow(start1, length1, start2, length2);\n } else {\n this.mergeHigh(start1, length1, start2, length2);\n }\n };\n\n TimSort.prototype.mergeLow = function mergeLow(start1, length1, start2, length2) {\n\n var compare = this.compare;\n var array = this.array;\n var tmp = this.tmp;\n var i = 0;\n\n for (i = 0; i < length1; i++) {\n tmp[i] = array[start1 + i];\n }\n\n var cursor1 = 0;\n var cursor2 = start2;\n var dest = start1;\n\n array[dest++] = array[cursor2++];\n\n if (--length2 === 0) {\n for (i = 0; i < length1; i++) {\n array[dest + i] = tmp[cursor1 + i];\n }\n return;\n }\n\n if (length1 === 1) {\n for (i = 0; i < length2; i++) {\n array[dest + i] = array[cursor2 + i];\n }\n array[dest + length2] = tmp[cursor1];\n return;\n }\n\n var minGallop = this.minGallop;\n\n while (true) {\n var count1 = 0;\n var count2 = 0;\n var exit = false;\n\n do {\n if (compare(array[cursor2], tmp[cursor1]) < 0) {\n array[dest++] = array[cursor2++];\n count2++;\n count1 = 0;\n\n if (--length2 === 0) {\n exit = true;\n break;\n }\n } else {\n array[dest++] = tmp[cursor1++];\n count1++;\n count2 = 0;\n if (--length1 === 1) {\n exit = true;\n break;\n }\n }\n } while ((count1 | count2) < minGallop);\n\n if (exit) {\n break;\n }\n\n do {\n count1 = gallopRight(array[cursor2], tmp, cursor1, length1, 0, compare);\n\n if (count1 !== 0) {\n for (i = 0; i < count1; i++) {\n array[dest + i] = tmp[cursor1 + i];\n }\n\n dest += count1;\n cursor1 += count1;\n length1 -= count1;\n if (length1 <= 1) {\n exit = true;\n break;\n }\n }\n\n array[dest++] = array[cursor2++];\n\n if (--length2 === 0) {\n exit = true;\n break;\n }\n\n count2 = gallopLeft(tmp[cursor1], array, cursor2, length2, 0, compare);\n\n if (count2 !== 0) {\n for (i = 0; i < count2; i++) {\n array[dest + i] = array[cursor2 + i];\n }\n\n dest += count2;\n cursor2 += count2;\n length2 -= count2;\n\n if (length2 === 0) {\n exit = true;\n break;\n }\n }\n array[dest++] = tmp[cursor1++];\n\n if (--length1 === 1) {\n exit = true;\n break;\n }\n\n minGallop--;\n } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING);\n\n if (exit) {\n break;\n }\n\n if (minGallop < 0) {\n minGallop = 0;\n }\n\n minGallop += 2;\n }\n\n this.minGallop = minGallop;\n\n if (minGallop < 1) {\n this.minGallop = 1;\n }\n\n if (length1 === 1) {\n for (i = 0; i < length2; i++) {\n array[dest + i] = array[cursor2 + i];\n }\n array[dest + length2] = tmp[cursor1];\n } else if (length1 === 0) {\n throw new Error('mergeLow preconditions were not respected');\n } else {\n for (i = 0; i < length1; i++) {\n array[dest + i] = tmp[cursor1 + i];\n }\n }\n };\n\n TimSort.prototype.mergeHigh = function mergeHigh(start1, length1, start2, length2) {\n var compare = this.compare;\n var array = this.array;\n var tmp = this.tmp;\n var i = 0;\n\n for (i = 0; i < length2; i++) {\n tmp[i] = array[start2 + i];\n }\n\n var cursor1 = start1 + length1 - 1;\n var cursor2 = length2 - 1;\n var dest = start2 + length2 - 1;\n var customCursor = 0;\n var customDest = 0;\n\n array[dest--] = array[cursor1--];\n\n if (--length1 === 0) {\n customCursor = dest - (length2 - 1);\n\n for (i = 0; i < length2; i++) {\n array[customCursor + i] = tmp[i];\n }\n\n return;\n }\n\n if (length2 === 1) {\n dest -= length1;\n cursor1 -= length1;\n customDest = dest + 1;\n customCursor = cursor1 + 1;\n\n for (i = length1 - 1; i >= 0; i--) {\n array[customDest + i] = array[customCursor + i];\n }\n\n array[dest] = tmp[cursor2];\n return;\n }\n\n var minGallop = this.minGallop;\n\n while (true) {\n var count1 = 0;\n var count2 = 0;\n var exit = false;\n\n do {\n if (compare(tmp[cursor2], array[cursor1]) < 0) {\n array[dest--] = array[cursor1--];\n count1++;\n count2 = 0;\n if (--length1 === 0) {\n exit = true;\n break;\n }\n } else {\n array[dest--] = tmp[cursor2--];\n count2++;\n count1 = 0;\n if (--length2 === 1) {\n exit = true;\n break;\n }\n }\n } while ((count1 | count2) < minGallop);\n\n if (exit) {\n break;\n }\n\n do {\n count1 = length1 - gallopRight(tmp[cursor2], array, start1, length1, length1 - 1, compare);\n\n if (count1 !== 0) {\n dest -= count1;\n cursor1 -= count1;\n length1 -= count1;\n customDest = dest + 1;\n customCursor = cursor1 + 1;\n\n for (i = count1 - 1; i >= 0; i--) {\n array[customDest + i] = array[customCursor + i];\n }\n\n if (length1 === 0) {\n exit = true;\n break;\n }\n }\n\n array[dest--] = tmp[cursor2--];\n\n if (--length2 === 1) {\n exit = true;\n break;\n }\n\n count2 = length2 - gallopLeft(array[cursor1], tmp, 0, length2, length2 - 1, compare);\n\n if (count2 !== 0) {\n dest -= count2;\n cursor2 -= count2;\n length2 -= count2;\n customDest = dest + 1;\n customCursor = cursor2 + 1;\n\n for (i = 0; i < count2; i++) {\n array[customDest + i] = tmp[customCursor + i];\n }\n\n if (length2 <= 1) {\n exit = true;\n break;\n }\n }\n\n array[dest--] = array[cursor1--];\n\n if (--length1 === 0) {\n exit = true;\n break;\n }\n\n minGallop--;\n } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING);\n\n if (exit) {\n break;\n }\n\n if (minGallop < 0) {\n minGallop = 0;\n }\n\n minGallop += 2;\n }\n\n this.minGallop = minGallop;\n\n if (minGallop < 1) {\n this.minGallop = 1;\n }\n\n if (length2 === 1) {\n dest -= length1;\n cursor1 -= length1;\n customDest = dest + 1;\n customCursor = cursor1 + 1;\n\n for (i = length1 - 1; i >= 0; i--) {\n array[customDest + i] = array[customCursor + i];\n }\n\n array[dest] = tmp[cursor2];\n } else if (length2 === 0) {\n throw new Error('mergeHigh preconditions were not respected');\n } else {\n customCursor = dest - (length2 - 1);\n for (i = 0; i < length2; i++) {\n array[customCursor + i] = tmp[i];\n }\n }\n };\n\n return TimSort;\n })();\n\n function sort(array, compare, lo, hi) {\n if (!Array.isArray(array)) {\n throw new TypeError('Can only sort arrays');\n }\n\n if (!compare) {\n compare = alphabeticalCompare;\n } else if (typeof compare !== 'function') {\n hi = lo;\n lo = compare;\n compare = alphabeticalCompare;\n }\n\n if (!lo) {\n lo = 0;\n }\n if (!hi) {\n hi = array.length;\n }\n\n var remaining = hi - lo;\n\n if (remaining < 2) {\n return;\n }\n\n var runLength = 0;\n\n if (remaining < DEFAULT_MIN_MERGE) {\n runLength = makeAscendingRun(array, lo, hi, compare);\n binaryInsertionSort(array, lo, hi, lo + runLength, compare);\n return;\n }\n\n var ts = new TimSort(array, compare);\n\n var minRun = minRunLength(remaining);\n\n do {\n runLength = makeAscendingRun(array, lo, hi, compare);\n if (runLength < minRun) {\n var force = remaining;\n if (force > minRun) {\n force = minRun;\n }\n\n binaryInsertionSort(array, lo, lo + force, lo + runLength, compare);\n runLength = force;\n }\n\n ts.pushRun(lo, runLength);\n ts.mergeRuns();\n\n remaining -= runLength;\n lo += runLength;\n } while (remaining !== 0);\n\n ts.forceMergeRuns();\n }\n});\n","module.exports = require('./build/timsort.js');","/**\n @typedef {(Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array | Uint8ClampedArray | Float32Array | Float64Array)} TypedArray\n */\n\n/**\n * Error message for a case when percentile is less than 0.\n *\n * @param {Number} p\n *\n * @return {String}\n */\nfunction lessThanZeroError(p) {\n return 'Expect percentile to be >= 0 but given \"' + p + '\" and its type is \"' + (typeof p) + '\".';\n}\n\n/**\n * Error message for a case when percentile is greater than 100.\n *\n * @param {Number} p\n *\n * @return {String}\n */\nfunction greaterThanHundredError(p) {\n return 'Expect percentile to be <= 100 but given \"' + p + '\" and its type is \"' + (typeof p) + '\".';\n}\n\n/**\n * Error message for a case when percentile is not a number (NaN).\n *\n * @param {Number} p\n *\n * @return {String}\n */\nfunction nanError(p) {\n return 'Expect percentile to be a number but given \"' + p + '\" and its type is \"' + (typeof p) + '\".';\n}\n\n/**\n * Checks that a list of percentiles are all numbers and they lie in range 0..100.\n *\n * @param {Array<Number>} ps - percentiles to calculate\n *\n * @return {Array} List of errors\n */\nfunction validateInput(ps) {\n return ps.reduce(function (errors, p) {\n if (isNaN(Number(p))) {\n errors.push(nanError(p));\n } else if (p < 0) {\n errors.push(lessThanZeroError(p));\n } else if (p > 100) {\n errors.push(greaterThanHundredError(p));\n }\n return errors;\n }, []);\n}\n\n/**\n * Get percentile value from an array.\n *\n * @param {Number} p - percentile\n * @param {Array|TypedArray} list - list of values\n *\n * @return {*}\n */\nfunction getPsValue(p, list) {\n if (p === 0) return list[0];\n var kIndex = Math.ceil(list.length * (p / 100)) - 1;\n return list[kIndex];\n}\n\n/**\n * Calculate percentile for given array of values.\n *\n * @template T\n * @param {Number|Array<Number>} pOrPs - percentile or a list of percentiles\n * @param {Array<T>|Array<Number>|TypedArray} list - array of values\n * @param {function(T): Number} [fn] - optional function to extract a value from an array item\n *\n * @return {Number|T|Array<Number>|Array<T>}\n */\nfunction percentile(pOrPs, list, fn) {\n var ps = Array.isArray(pOrPs) ? pOrPs : [pOrPs];\n var validationErrors = validateInput(ps);\n\n if (validationErrors.length) {\n throw new Error(validationErrors.join(' '));\n }\n\n list = list.slice().sort(function (a, b) {\n if (fn) {\n a = fn(a);\n b = fn(b);\n }\n\n a = Number.isNaN(a) ? Number.NEGATIVE_INFINITY : a;\n b = Number.isNaN(b) ? Number.NEGATIVE_INFINITY : b;\n\n if (a > b) return 1;\n if (a < b) return -1;\n\n return 0;\n });\n\n if (ps.length === 1) {\n return getPsValue(ps[0], list);\n }\n\n return ps.map(function (p) {\n return getPsValue(p, list);\n });\n}\n\nmodule.exports = percentile;\n","import * as timSort from 'timsort' // Required as this is a UMD library\n// https://www.typescriptlang.org/docs/handbook/declaration-files/library-structures.html\nimport percentile from 'percentile'\nimport _cloneDeep from 'lodash.clonedeep'\n\nimport { InstrumentBase, InstrumentBaseOptions, InstrumentBaseTelemetry } from './instrumentBase.js'\nimport { GaugeTypes } from '../instrumentDefs.js'\nimport { JSONObject, isNode } from '@nsshunt/stsutils'\n\nexport type QuantileDataElement = [\n label: string,\n val: number,\n];\n\nexport interface gaugeReportValue extends JSONObject {\n\tval: number\n\tvalue: string\n\tvf: string\n\tmin?: string\n\tmax?: string\n\tavg?: string\n\tpercentile?: number[]\n\tpercentileFormatted?: string\n}\n\nexport class InstrumentGaugeOptions extends InstrumentBaseOptions {\n interval?: number\n sampleSize?: number\n fromJSON?: InstrumentGauge\n initValue?: number\n}\n\nexport class InstrumentGaugeTelemetry extends InstrumentBaseTelemetry {\n val?: number\n Inc?: number\n Dec?: number\n}\n\n//@@ Create a GaugeEx that also includes min, max, average\nexport class InstrumentGauge extends InstrumentBase\n{\n #val = 0;\n #maxval: number | null = null;\n #lastObservedValue = 0;\n #timeSeriesList: number[] = [ ];\n #maxSampleSize = 0;\n #timerInterval = 0;\n #observer: NodeJS.Timeout | null = null;\n\n //@@ extras\n #min: number | null = null;\n #max = 0; \n #observations = 0;\n #total = 0;\n #copy = false;\n\n constructor(options: InstrumentGaugeOptions = { }) {\n super(options);\n\n if (!options.label) {\n this.label = 'InstrumentGauge';\n } else {\n this.label = options.label;\n }\n\n if (typeof options.interval === 'undefined') {\n this.#timerInterval = 0;\n } else {\n this.#timerInterval = options.interval;\n }\n\n if (typeof options.sampleSize === 'undefined') {\n this.#maxSampleSize = 600;\n } else {\n this.#maxSampleSize = options.sampleSize;\n }\n\n if (typeof options.fromJSON === 'undefined') {\n this.#copy = false;\n } else {\n this.#copy = true;\n }\n\n Object.defineProperty(this, GaugeTypes.GAUGE_TYPE, {\n enumerable: true,\n get: () => GaugeTypes.INSTRUMENT_GAUGE\n });\n\n if (this.#copy) {\n this.DefineCopyProperties([\n 'val', 'min', 'max', 'avg', 'percentile'\n ]);\n } else {\n Object.defineProperty(this, 'val', {\n enumerable: true,\n get: () => this.#GetVal(),\n set: (value) => { this.#SetVal(value); }\n });\n if (this.#timerInterval > 0) {\n Object.defineProperty(this, 'percentile', {\n enumerable: true,\n get: () => this.#GetPercentileData()\n });\n\t\n this._StartTimer();\n }\n }\n\n if (typeof options.initValue !== 'undefined') {\n this.val = options.initValue;\n }\n\n // Set copy values now that we have defined our properties\n if (typeof options.fromJSON !== 'undefined') {\n const result = _cloneDeep(options.fromJSON);\n this.val = result.val;\n if (result.percentile) {\n this.percentile = result.percentile;\n }\n if (result.min) {\n this.min = result.min;\n }\n if (result.max) {\n this.max = result.max;\n }\n if (result.avg) {\n this.avg = result.avg;\n }\n }\n }\n\n public readonly percentile?: number[];\n public readonly min?: number;\n public readonly max?: number;\n public readonly avg?: number;\n public val = 0;\n\n WithInitVal(initVal: number): InstrumentGauge {\n this.val = initVal;\n return this;\n }\n\n WithMin(): InstrumentGauge {\n Object.defineProperty(this, 'min', {\n enumerable: true,\n get: () => this.#GetMin()\n });\n return this;\n }\n\n WithMax(): InstrumentGauge {\n Object.defineProperty(this, 'max', {\n enumerable: true,\n get: () => this.#GetMax()\n });\n return this;\n }\n\n WithAverage(): InstrumentGauge {\n Object.defineProperty(this, 'avg', {\n enumerable: true,\n get: () => this.#GetAverage()\n });\n return this;\n }\n\n private _StartTimer(): void {\n if (this.#timerInterval > 0) {\n this.#timeSeriesList = [ ];\n\n this.#observer = setInterval(() => {\n if (this.#timeSeriesList.length > this.#maxSampleSize) {\n this.#timeSeriesList.shift();\n }\n const maxval = this.#GetAndResetMaxVal();\n this.#timeSeriesList.push(maxval);\n }, this.#timerInterval);\n\n // If running in node ...\n if (isNode) {\n this.#observer.unref();\n }\n\n // https://httptoolkit.tech/blog/unblocking-node-with-unref/\n } else {\n throw new Error(`Unable to StartTimer for this instrument. The interval is set to <= 0.`);\n }\n }\n\n override StopTimer(): void {\n if (this.#observer) {\n clearTimeout(this.#observer);\n this.#observer = null;\n this.#timeSeriesList = [ ];\n }\n }\n\n /**\n\t * If the gauge is being monitored as part of a time series, get the most recent recorded value (max value) from within the time interval\n\t * otherwise, just return the current instant value.\n\t */\n #GetVal(): number {\n if (this.#timerInterval > 0 && this.#observer !== null) {\n if (this.#maxval === null) {\n return this.GetNumber(this.#lastObservedValue);\n } else {\n return this.GetNumber(this.#maxval);\n }\n }\n return this.GetNumber(this.#val);\n }\n\n #SetVal(updatedValue: number): void {\n this.#val = updatedValue;\n this.#observations++;\n this.#total += updatedValue;\n\n if (this.#val > this.#max) {\n this.#max = this.#val;\n }\n\n if (this.#min !== null) {\n if (this.#val < this.#min) {\n this.#min = this.#val;\n }\n } else {\n // Set the min value to the value of the first observation\n this.#min = this.#val;\n }\n\n if (this.#timerInterval > 0) {\n this.#lastObservedValue = updatedValue;\n if (this.#maxval === null) {\n this.#maxval = this.#val;\n } else if (this.#val > this.#maxval) {\n this.#maxval = this.#val;\n }\n }\n }\n\n #GetMin(): number {\n if (this.#min !== null) {\n return this.#min;\n }\n return 0;\n }\n\n #GetMax(): number {\n return this.#max;\n }\n\n #GetAverage(): number {\n if (this.#observations > 0) {\n return this.#total / this.#observations\n }\n return 0;\n }\n\n Reset(): void {\n this.StopTimer();\n\n this.#maxval = 0;\n this.#lastObservedValue = 0;\n this.#val = 0;\n\n this.#min = null;\n this.#max = 0;\n this.#observations = 0;\n this.#total = 0;\n\n if (this.#timerInterval > 0) {\n this._StartTimer();\n }\n }\n\n #GetAndResetMaxVal(): number {\n if (this.#maxval === null) {\n return this.#lastObservedValue;\n }\n const retVal = this.#maxval;\n this.#maxval = null;\n return retVal;\n }\n\n Inc(incVal = 1): void {\n this.#SetVal(this.#val + incVal);\n }\n\n Dec(decVal = 1): void {\n this.#SetVal(this.#val - decVal);\n }\n\n #NumberCompare(a: number, b: number): number {\n return a - b;\n }\n\n #GetPercentileData(): number[] {\n const sortedList = this.#timeSeriesList.slice(0);\n timSort.sort(sortedList, this.#NumberCompare);\n return percentile([50, 80, 90, 95, 99, 99.95], sortedList) as number[];\n }\n\n override ProcessTelemetry(telemetry: InstrumentGaugeTelemetry): void {\n if (telemetry.Inc !== undefined) {\n this.Inc(telemetry.Inc);\n }\n if (telemetry.Dec !== undefined) {\n this.Dec(telemetry.Dec);\n }\n if (telemetry.val !== undefined) {\n this.val = telemetry.val;\n }\n }\n}\n","import _cloneDeep from 'lodash.clonedeep'\n\nimport { InstrumentBase, InstrumentBaseOptions, InstrumentBaseTelemetry } from './instrumentBase.js'\nimport { GaugeTypes } from '../instrumentDefs.js'\n\nimport { JSONObject } from '@nsshunt/stsutils'\n\nexport interface ObjectReportValue extends JSONObject {\n\tval: JSONObject\n}\n\nexport class InstrumentObjectOptions extends InstrumentBaseOptions {\n fromJSON?: InstrumentObject\n initValue?: JSONObject\n}\n\nexport class InstrumentObjectTelemetry extends InstrumentBaseTelemetry {\n val?: JSONObject\n}\n\nexport class InstrumentObject extends InstrumentBase\n{\n #val: JSONObject = { };\n #copy = false;\n\n constructor(options: InstrumentObjectOptions = { }) {\n super(options);\n\n if (typeof options.label === 'undefined') {\n this.label = 'InstrumentObject';\n } else {\n this.label = options.label;\n }\n\n if (typeof options.fromJSON === 'undefined') {\n this.#copy = false;\n } else {\n this.#copy = true;\n }\n\n Object.defineProperty(this, GaugeTypes.GAUGE_TYPE, {\n enumerable: true,\n get: () => GaugeTypes.INSTRUMENT_OBJECT\n });\n\n if (this.#copy) {\n this.DefineCopyProperties([\n 'val'\n ]);\n } else {\n Object.defineProperty(this, 'val', {\n enumerable: true,\n get: () => this.#GetVal(),\n set: (value) => { this.#SetVal(value); }\n });\n }\n\n if (typeof options.initValue !== 'undefined') {\n this.val = options.initValue;\n } else {\n this.val = { };\n }\n\n // Set copy values now that we have defined our properties\n if (typeof options.fromJSON !== 'undefined') {\n const result = _cloneDeep(options.fromJSON);\n this.val = result.val;\n }\n }\n\t\n public val: JSONObject;\n\n WithInitVal(initVal: JSONObject) {\n this.val = initVal;\n return this;\n }\n\n #GetVal(): JSONObject {\n return this.#val;\n }\n\n #SetVal(updatedValue: JSONObject) {\n this.#val = updatedValue;\n }\n\n override ProcessTelemetry(telemetry: InstrumentObjectTelemetry): void {\n if (telemetry.val !== undefined) {\n this.val = telemetry.val;\n }\n }\n}\n","import { Gauge, GaugeTypes } from './instrumentDefs.js'\n\nimport { InstrumentBase, Instruments } from './instruments/instrumentBase.js'\nimport { InstrumentVelocity } from './instruments/instrumentVelocity.js'\nimport { InstrumentHistogram } from './instruments/instrumentHistogram.js'\nimport { InstrumentLog } from './instruments/instrumentLog.js'\nimport { InstrumentTimerGauge } from './instruments/instrumentTimerGauge.js'\nimport { InstrumentGauge } from './instruments/instrumentGauge.js'\nimport { InstrumentObject } from './instruments/instrumentObject.js'\n\nexport function CreateInstrument(sourceInstrument: InstrumentBase): InstrumentBase {\n switch (sourceInstrument[GaugeTypes.GAUGE_TYPE]) {\n case GaugeTypes.INSTRUMENT_GAUGE :\n return new InstrumentGauge({fromJSON:sourceInstrument as InstrumentGauge});\n case GaugeTypes.INSTRUMENT_VELOCITY :\n return new InstrumentVelocity({fromJSON:sourceInstrument as InstrumentVelocity});\n case GaugeTypes.INSTRUMENT_HISTOGRAM :\n return new InstrumentHistogram({fromJSON:sourceInstrument as InstrumentHistogram});\n case GaugeTypes.INSTRUMENT_LOG :\n return new InstrumentLog({fromJSON:sourceInstrument as InstrumentLog});\n case GaugeTypes.INSTRUMENT_TIMER :\n return new InstrumentTimerGauge({fromJSON:sourceInstrument as InstrumentTimerGauge});\n case GaugeTypes.INSTRUMENT_OBJECT :\n return new InstrumentObject({fromJSON:sourceInstrument as InstrumentObject});\n }\n throw new Error(`Cannot create instrument from type: [${sourceInstrument[GaugeTypes.GAUGE_TYPE]}]`)\n}\n\nexport function GetInstrumentName(gauge: Gauge): string {\n switch (gauge) {\n case Gauge.ACTIVE_REQUEST_GAUGE :\n return \"Active Requests\";\n case Gauge.AUTHENTICATION_COUNT_GAUGE :\n return \"Authentication Count\";\n case Gauge.AUTHENTICATION_ERROR_COUNT_GAUGE :\n return \"Authentication Error Count\";\n case Gauge.AUTHENTICATION_RETRY_COUNT_GAUGE :\n return \"Authentication Retry Count\";\n case Gauge.CONNECTION_POOL_IDLE_GAUGE :\n return \"Connection Pool Idle\";\n case Gauge.CONNECTION_POOL_TOTAL_GAUGE :\n return \"Connection Pool Total\";\n case Gauge.CONNECTION_POOL_WAITING_GAUGE :\n return \"Connection Pool Waiting\";\n case Gauge.CPU_LOAD_GAUGE :\n return \"CPU Load\";\n case Gauge.CPU_SYSTEM_LOAD_GAUGE :\n return \"CPU SYstem Load\";\n case Gauge.DURATION_GAUGE :\n return \"Duration\";\n case Gauge.DURATION_HISTOGRAM_GAUGE :\n return \"Diration Histogram\";\n case Gauge.ERROR_COUNT_GAUGE :\n return \"Errors\";\n case Gauge.LATENCY_GAUGE :\n return \"Latency\";\n case Gauge.LATENCY_HISTOGRAM_GAUGE :\n return \"Latency Histogram\";\n case Gauge.LOGGER :\n return \"Logger\";\n case Gauge.LOGGER_COPY :\n return \"_Logger\";\n case Gauge.NETWORK_RX_GAUGE :\n return \"Network Receive\";\n case Gauge.NETWORK_TX_GAUGE :\n return \"Network Transmit\";\n case Gauge.REQUEST_COUNT_GAUGE :\n return \"Requests\";\n case Gauge.RETRY_COUNT_GAUGE :\n return \"Retries\";\n case Gauge.TIMER_GAUGE :\n return \"Timer\";\n case Gauge.VELOCITY_GAUGE :\n return \"Velocity\";\n case Gauge.CONNECTION_COUNT_GAUGE :\n return \"TCP Connection\";\n case Gauge.OBJECT_GAUGE :\n return \"Object\";\n case Gauge.CORE_COUNT_GAUGE :\n return \"Core Count\";\n default:\n return \"Unknown\";\n }\n}\n\nexport function StopInstruments(instruments: InstrumentBase[] | Instruments): void {\n if (instruments) {\n if (Array.isArray(instruments)) {\n instruments.forEach((instrument) => {\n if (instrument.StopTimer) {\n instrument.StopTimer();\n }\n });\n } else {\n for (const [, value] of Object.entries(instruments)) {\n if (value.StopTimer) {\n value.StopTimer();\n }\n }\n }\n }\n}\n"],"x_google_ignoreList":[6,7,8],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nsshunt/stsobservability",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.152",
|
|
4
4
|
"description": "All in one package to include instrumentation, publication and subscription capabilities.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -37,15 +37,13 @@
|
|
|
37
37
|
},
|
|
38
38
|
"homepage": "https://github.com/nsshunt/stspublisherserver#readme",
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@nsshunt/stsutils": "^1.19.
|
|
41
|
-
"detect-node": "^2.1.0",
|
|
40
|
+
"@nsshunt/stsutils": "^1.19.95",
|
|
42
41
|
"lodash.clonedeep": "^4.5.0",
|
|
43
42
|
"percentile": "^1.6.0",
|
|
44
43
|
"timsort": "^0.3.0"
|
|
45
44
|
},
|
|
46
45
|
"devDependencies": {
|
|
47
46
|
"@msgpack/msgpack": "^3.1.3",
|
|
48
|
-
"@types/detect-node": "^2.0.2",
|
|
49
47
|
"@types/lodash.clonedeep": "^4.5.9",
|
|
50
48
|
"@types/node": "^25.5.2",
|
|
51
49
|
"@types/timsort": "^0.3.3",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentGauge.d.ts","sourceRoot":"","sources":["../../../src/instrumentation/instruments/instrumentGauge.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAEpG,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"instrumentGauge.d.ts","sourceRoot":"","sources":["../../../src/instrumentation/instruments/instrumentGauge.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAEpG,OAAO,EAAE,UAAU,EAAU,MAAM,mBAAmB,CAAA;AAEtD,MAAM,MAAM,mBAAmB,GAAG;IAC9B,KAAK,EAAE,MAAM;IACb,GAAG,EAAE,MAAM;CACd,CAAC;AAEF,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IACnD,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,qBAAa,sBAAuB,SAAQ,qBAAqB;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,qBAAa,wBAAyB,SAAQ,uBAAuB;IACjE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;CACf;AAGD,qBAAa,eAAgB,SAAQ,cAAc;;gBAiBnC,OAAO,GAAE,sBAA4B;IA2EjD,SAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtC,SAAgB,GAAG,CAAC,EAAE,MAAM,CAAC;IAC7B,SAAgB,GAAG,CAAC,EAAE,MAAM,CAAC;IAC7B,SAAgB,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,SAAK;IAEf,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe;IAK7C,OAAO,IAAI,eAAe;IAQ1B,OAAO,IAAI,eAAe;IAQ1B,WAAW,IAAI,eAAe;IAQ9B,OAAO,CAAC,WAAW;IAuBV,SAAS,IAAI,IAAI;IAqE1B,KAAK,IAAI,IAAI;IA0Bb,GAAG,CAAC,MAAM,SAAI,GAAG,IAAI;IAIrB,GAAG,CAAC,MAAM,SAAI,GAAG,IAAI;IAcZ,gBAAgB,CAAC,SAAS,EAAE,wBAAwB,GAAG,IAAI;CAWvE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentVelocity.d.ts","sourceRoot":"","sources":["../../../src/instrumentation/instruments/instrumentVelocity.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAEpG,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"instrumentVelocity.d.ts","sourceRoot":"","sources":["../../../src/instrumentation/instruments/instrumentVelocity.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAEpG,OAAO,EAAE,UAAU,EAAU,MAAM,mBAAmB,CAAA;AAEtD,MAAM,WAAW,mBAAoB,SAAQ,UAAU;IACtD,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,EAAE,EAAE,MAAM,CAAA;CACV;AAED,qBAAa,yBAA0B,SAAQ,qBAAqB;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,0BAA0B,CAAC,EAAE,MAAM,CAAA;CACtC;AAED,qBAAa,2BAA4B,SAAQ,uBAAuB;IACpE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;CACf;AAgBD,qBAAa,kBAAmB,SAAQ,cAAc;;gBAoCtC,OAAO,GAAE,yBAA+B;IAgKpD,SAAgB,WAAW,EAAE,MAAM,CAAK;IACxC,SAAgB,KAAK,EAAE,MAAM,CAAK;IAClC,SAAgB,QAAQ,EAAE,MAAM,CAAK;IACrC,SAAgB,EAAE,EAAE,MAAM,CAAK;IAC/B,SAAgB,SAAS,EAAE,MAAM,CAAK;IACtC,SAAgB,SAAS,EAAE,MAAM,CAAK;IACtC,SAAgB,QAAQ,EAAE,MAAM,CAAK;IACrC,SAAgB,cAAc,EAAE,MAAM,CAAK;IAC3C,SAAgB,YAAY,EAAE,MAAM,CAAK;IACzC,SAAgB,eAAe,EAAE,MAAM,EAAE,CAAM;IACxC,GAAG,SAAK;IAEf,qBAAqB,CAAC,iBAAiB,EAAE,MAAM,GAAG,kBAAkB;IAMpE,OAAO,CAAC,WAAW;IAmJnB,GAAG,CAAC,MAAM,SAAI,GAAG,IAAI;IA0DZ,SAAS,IAAI,IAAI;IAOjB,gBAAgB,CAAC,SAAS,EAAE,2BAA2B,GAAG,IAAI;CAQ1E"}
|